cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Highlighted
New Member

Print and/or export to PDF from PowerBI Embedded Report

Gentemen, we asked out partners about this in early 2017.  The answer was end of the year or maybe first quarter for the export to pdf feature.  We only have one basic workaroud by using window.print(), and insturcting our enterprise users to then print to pdf, which requires clicks and local pdf executables.  It isn't a solution we want to present.  

 

Does anyone have any news or an update form the engineering team?  Can someone that monitors this board please respond and/or reach out to Microsoft engineering team and ask for an update and reply here?  It is becoming a moderate to serious concern for a customer of ours planning significant launches in the near future.

 

Nimrod from the PowerBI team seems to be active on other PowerBI Embedded issues.  Maybe reach out to him?

 

Thanks for your help.

Tom

13 REPLIES 13
Highlighted

Bit disappointing but as you say let's just hope it arrives in Feb
Highlighted

Fingers crossed, but not getting my hopes up!  

Highlighted

@stuartb 

I am running embedded powerbi in puppeteer in aws lambda, but I am getting hung up on knowing when the report is done being rendered. How do you wait for the report to finish, so you know its time to create the PDF (or whatever). Currently I am sleeping, but I am trying to find a better solution to that. I did try to hook into the "rendered" event, but I can't seem to get that to fire.

 

I also did hook up to the public preview of this feature, but the restrictions on it are far too great to be viable.

 

Any insight would be greatly appreciated!

 

-Kenny

Highlighted

Hi
Firstly kudos to the person/site that set me on the right track: https://www.sambaiz.net/article/132/
Secondly, it's been some time since I did this and we've changed the design from using Node to Pupeteer Sharp

Hope the following helps, it's a code snippet of the funtion that I used to embed the report.  Note it's not code complete nor would I suggest it's production ready! In essence all it does is wrap up the "embed" call in a promise and only then create the pdf.

 

Note: thee is a 'wait' in the code - I don't think I hooked up to the render with my prototype; just assumed that the API woudl render in less than 5secs. I know we did change this to something more robust, but I dont have access to the codebase for it as I no longer work on the project.

exports.exportPdf = async (browser, pbi) => {
    const magic = Math.floor(Math.random() * 100000);
    const filename = 'report-' + magic.toString() + '.pdf';
    const localPath = '/tmp/' + filename;
    loggit('>> generated filename: ' + filename);

    const pageHtml = '<!DOCTYPE html>' +
        '<html>' +
        '    <head>' +
        '    <meta charset="utf-8" />' +
        '    <title>Printed PDF</title>' +
        '       <style> #reportContainer { height: 750px; width: 100 %; max-width: 1000px; } </style>' +
        '    </head>' +
        '    <body>' +
        '    <h1>Report</h1>' +
        '    <div id="reportContainer"></div>' +
        '    </body>' +
        '</html>';

    loggit('>> new page');
    const page = await browser.newPage();

    loggit('>> generate filename');
    await page.addScriptTag({ path: './powerbi/powerbi.js' });
    await page.setContent(pageHtml);

    loggit('>>>Power BI stuff');
    await page.evaluate((a, b, c) => {
        const models = window['powerbi-client'].models;
        const config = {
            type: 'report',
            tokenType: models.TokenType.Embed,
            embedUrl: a,
            accessToken: b,
            id: c,
            permissions: models.Permissions.Read,
            viewMode: models.ViewMode.View,
            settings: {
                filterPaneEnabled: false,
                navContentPaneEnabled: false
            }
        };
        powerbi.embed(reportContainer, config);
    },
        pbi.EmbedUrl,
        pbi.EmbedToken.token,
        pbi.ReportId
    );

    loggit('waiting');
    await page.waitFor(5000);

    loggit('exporting pdf from chromium');
    await page.pdf({ path: localPath, format: 'A4', landscape: true });

    loggit('reading pdf');
    const aws = require('aws-sdk');
    const s3 = new aws.S3({ apiVersion: '2006-03-01' });
    const fs = require('fs');
    const pdf = await new Promise((resolve, reject) => {
        fs.readFile(localPath, (err, data) => {
            if (err) return reject(err);
            resolve(data);
        });
    });

    loggit('writing pdf');
    await s3.putObject({
        Bucket: 'a-stu-bucket',
        Key: filename,
        Body: pdf,
    }).promise();

    loggit('closing page');
    await page.close();

    loggit('returning');
    return filename;
};

 

Helpful resources

Announcements
Community Conference

Power Platform Community Conference

Check out the on demand sessions that are available now!

Community Conference

Microsoft Power Platform Communities

Check out the Winners!

secondImage

Create an end-to-end data and analytics solution

Learn how Power BI works with the latest Azure data and analytics innovations at the digital event with Microsoft CEO Satya Nadella.