Forum Discussion
sharvan270
4 years agoRegular Visitor
Not able to generate PDF via PowerBI API call in java
Hi,
I was trying to generate PDF using API call in java code. I tried following API calls but getting empty PDF after exporting as File:
- POST https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}/ExportTo
From this api call, I get the export id. - To get the status of the exported file, used below API call:
GET https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}/exports/{exportId}
Added while loop to wait until the status is 200 OK - Once status is 200, I have called below API call:
GET https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}/exports/{exportId}/file
This api provides the File. Following code snipet I have used:
RestTemplate getReportRestTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.put("Content-Type", Arrays.asList("application/pdf"));
headers.put("Accept", Arrays.asList("application/*"));
headers.put("Authorization", Arrays.asList("Bearer " + accessToken));
// HTTP entity object - holds header and body
HttpEntity<String> reqEntity = new HttpEntity<> (headers);
ResponseEntity<String> response = getReportRestTemplate.exchange(urlStringBuilder.toString(), HttpMethod.GET, reqEntity, String.class);
Path file = Paths.get("D:\\test.pdf");
try (InputStream in = new ByteArrayInputStream(response.getBody().getBytes())) {
Files.copy(in, file);
}
Am I missing anthing here?
Can you try it in Powershell? The below works for me:
# Calls the Active Directory Authentication Library (ADAL) to authenticate against AAD function GetAuthToken { if(-not (Get-Module AzureRm.Profile)) { Import-Module AzureRm.Profile } $clientId = "<your client id>" $redirectUri = "urn:ietf:wg:oauth:2.0:oob" $resourceAppIdURI = "https://analysis.windows.net/powerbi/api" $authority = "https://login.microsoftonline.com/common/oauth2/authorize"; $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority $authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId, $redirectUri, "Auto") return $authResult } # Get the auth token from AAD $token = GetAuthToken # Building Rest API header with authorization token $authHeader = @{ 'Content-Type'='application/json' 'Authorization'=$token.CreateAuthorizationHeader() } #Report details $groupsPath = "<workspace guid>" $reportID = "<report guid>" # 0. get page names - optional $uri = “https://api.powerbi.com/v1.0/myorg/groups/$groupsPath/reports/$reportID/pages" $Pages = Invoke-RestMethod -Uri $uri –Headers $authHeader –Method GET # 1. export request URI $uri = “https://api.powerbi.com/v1.0/myorg/groups/$groupsPath/reports/$reportID/ExportTo” $body = "{ format : `"PDF`” }" # how to define the pages? powerBIReportConfiguration:{pages:[{pageName:"<page 1 guid>"},{pageName:"page2 guid>"}]} # issue the export request $FileExport = Invoke-RestMethod -Uri $uri –Headers $authHeader –Method POST -body $body #save the ID - we need it later $exportId = $FileExport.id # 2. export request status URI $uri = "https://api.powerbi.com/v1.0/myorg/groups/$groupsPath/reports/$reportID/exports/$exportId" $percentComplete = 0 # repeat rendering status check until status is Succeeded while ($percentComplete -lt 100) { Start-Sleep -Seconds 30 $exportStatus = Invoke-RestMethod -Uri $uri –Headers $authHeader –Method GET $percentComplete = $exportStatus.percentComplete Write-Host $percentComplete } # 3. retrieve the rendered file $uri = "https://api.powerbi.com/v1.0/myorg/groups/$groupsPath/reports/$reportID/exports/$exportId/file" Invoke-RestMethod -Uri $uri –Headers $authHeader –Method GET -OutFile "test.pdf"
7 Replies
- lbendlinSuper User
Your while loop needs to check the "percentComplete" export status, not the HTTP 200. Only when percentComplete is 100 can you fetch the file.
- sharvan270Regular Visitor
There are only two responses mentioned in the API document https://docs.microsoft.com/en-us/rest/api/power-bi/reports/get-export-to-file-status-in-group
- lbendlinSuper User
You need to look inside the Export response