Imprima y / o exporte a PDF desde PowerBI Embedded Report

Un usuario Pregunto ✅

tomepenn

Gentemen, preguntamos a nuestros socios sobre esto a principios de 2017. La respuesta fue a fin de año o quizás el primer trimestre para la función de exportación a PDF. Solo tenemos una workaroud básica usando window.print (), e instando a nuestros usuarios empresariales a que luego impriman en PDF, lo que requiere clics y archivos ejecutables en PDF locales. No es una solución que queremos presentar.

¿Alguien tiene alguna noticia o actualización del equipo de ingeniería? ¿Puede alguien que supervise esta placa responder y / o comunicarse con el equipo de ingeniería de Microsoft y solicitar una actualización y responder aquí? Se está convirtiendo en una preocupación de moderada a seria para un cliente nuestro que planea lanzamientos importantes en un futuro próximo.

Nimrod del equipo de PowerBI parece estar activo en otros problemas de PowerBI Embedded. ¿Quizás llegar a él?

Gracias por tu ayuda.

Tomás

dom99

Tengo una actualización sobre esto, que se ve en la hoja de ruta. Básicamente, en enero de 2020, la exportación a la API de powerpoint / pdf / jpeg estará en vista previa.

https: //docs.microsoft.com/en-us/power-platform-release-plan/2019wave2/business-intelligence/api-exp …

yabadabadou

En respuesta a dom99

La función está programada actualmente para febrero de 2020 (en lugar de enero de 2020).
Esperemos que no vuelva a posponerse.

Sin sentido

En respuesta a yabadabadou

Crucemos los dedos, ¡pero sin hacerme ilusiones!

dom99

En respuesta a yabadabadou

Un poco decepcionante, pero como dices, esperemos que llegue en febrero.

Sin sentido

En respuesta a dom99

Woot !!! Tendré mucha más aceptación por parte de los usuarios si esto es posible.

Stuartb

Me he estado golpeando la cabeza contra la incapacidad de Power BI para exportar de forma nativa a PDF durante algún tiempo.

Lo que hemos hecho es utilizar la funcionalidad de AWS Lambda para ejecutar Chromium en el que incrustamos el informe y lo guardamos en S3, que se devuelve al cliente como una descarga.

Es una faff, molesta, pero funciona bastante bien.
https://github.com/sambaiz/puppeteer-lambda-starter-kit/blob/master/README.md


Estoy bastante seguro de que también podría adaptar esto para Azure Functions …
Podría ayudar

Kvotava

En respuesta a Stuartb

@stuartb

Estoy ejecutando powerbi incrustado en titiritero en aws lambda, pero me estoy obsesionando con saber cuándo se termina de procesar el informe. ¿Cómo espera a que finalice el informe, para saber que es hora de crear el PDF (o lo que sea)? Actualmente estoy durmiendo, pero estoy tratando de encontrar una mejor solución para eso. Intenté conectarme al evento «renderizado», pero parece que no puedo hacer que se active.

También me conecté a la vista previa pública de esta función, pero las restricciones son demasiado grandes para ser viables.

¡Cualquier idea sería muy apreciada!

-Kenny

Stuartb

En respuesta a Kvotava

Hola
En primer lugar, felicitaciones a la persona / sitio que me puso en el camino correcto: https://www.sambaiz.net/article/132/
En segundo lugar, ha pasado algún tiempo desde que hice esto y hemos cambiado el diseño de usar Node a Pupeteer Sharp

Espero que lo siguiente ayude, es un fragmento de código de la función que usé para insertar el informe. ¡Tenga en cuenta que no está completo el código ni sugeriría que esté listo para producción! En esencia, todo lo que hace es envolver la llamada «embed» en una promesa y solo entonces crear el pdf.

Nota: hay una ‘espera’ en el código; no creo que me haya conectado al render con mi prototipo; simplemente asumí que la API se renderizaría en menos de 5 segundos. Sé que cambiamos esto a algo más sólido, pero no tengo acceso a la base de código porque ya no trabajo en el proyecto.

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;
};

Sin sentido

En respuesta a Stuartb

¡Gracias Stuart!

No ejecutamos AWS, pero le envié su respuesta a mi jefe, que conoce nuestros sistemas y configuraciones. ¡Sería genial poner esto en marcha!

Saludos,

Nancy

kk0036

En respuesta a Sin sentido

Nos encontramos con el mismo problema por nuestra parte. Tenemos usuarios externos en la aplicación web y queremos migrarlos a una solución ISV integrada, pero no podemos permitirnos perder la opción de exportación a PDF que ofrece el servicio web. Cualquier idea o pensamiento sobre este tema será muy apreciado.

Stuartb

En respuesta a kk0036

En primer lugar, solo quiero decir que Microsoft parece haber perdido un truco: la oficina sin papel es un mito y prácticamente todos nuestros clientes quieren la capacidad de imprimir informes de gestión (algunos tamaños A3 / A2). Logré usar el proyecto anterior usando NodeJS para facilitar la impresión automatizando Chromium de una manera similar al enlace que publiqué anteriormente. Dado que Microsoft está creando un navegador basado en esta tecnología (ver: Dev Edge), no creo que esto se desvíe de las preocupaciones de la mayoría de las personas sobre los problemas de compatibilidad del navegador, por ejemplo; Estilo CSS en todos los navegadores. Así que supongo que podrías automatizar eso si fuera necesario.

En esencia, lo que hice fue escribir esto como una función sin servidor (AWS LAmbda en mi caso) usando un punto de entrada que toma HTML (o documento DOM) con el token de Power BI y la configuración ya incrustada. Entonces era solo un caso usar Puppeteer para crear una página, inyectar el documento dado y exportarlo como PDF (a un archivo persistente, aunque devolver un flujo de archivo es igualmente válido). Notamos algunos problemas con CSS: algunas fuentes eran demasiado pequeñas y tuvimos que manipular algunos estilos para obtener la impresión ‘perfecta’.

En las pruebas, encontramos que esto es escalable y eficaz. La escalabilidad se logró sin servidor; escalado horizontal y no tener que preocuparse por la cantidad de instancias de Chromium que se están creando. El rendimiento fue sorprendentemente rápido: la mayoría de las funciones tardaron menos de 5 segundos, lo que incluye la carga y ejecución de chromium y la sobrecarga de las llamadas API a api.powerbi.com para representar los informes en la página web.

Lo obvio aquí es que se requieren conocimientos de desarrollo para crear esto. Esto no es algo que pueda hacer un ‘equipo comercial’ estándar: Microsoft debería poder ofrecer esta funcionalidad con relativa facilidad, pero supongo que es un caso de prioridades.

dom99

Hasta donde yo sé, no hay ninguna funcionalidad disponible, lo que me parece un agujero en el ecosistema, ya que el escritorio se ha exportado a PDF, el servicio en la nube se ha exportado a PowerPoint, el incrustado no tiene nada.

Sin sentido

En respuesta a dom99

Leí en alguna parte que exportar a PPT incluiría todos los datos en el informe, pero esta sigue siendo la misma captura de pantalla con los datos cortados, como exportar a PDF. ARGH !!! Acabo de crear varios paneles nuevos para reemplazar los informes de Excel que a mis usuarios les encantan y en los que dependen. ¡Qué desperdicio total!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *