Bibliotecas de C# y Python para generar páginas PDF desde HTML/CSS con encabezados/pies de página

Mi arquitectura actual:

  • Dos backends, uno de C# y otro de Python/Flask, que proporcionan datos basados ​​en JSON a una aplicación de front-end.
  • Aplicación front-end escrita en AngularJS 1.6.
  • Informes generados a partir de vistas angulares: generados dinámicamente con el enlace de datos de AngularJS.
  • Se utilizan trucos de CSS para hacer que la salida sea adecuada para la impresión. (Sin embargo, la vista en pantalla es bastante mala).
  • La autenticación se realiza a través de un token de portador mediante OAuth: las credenciales se proporcionan a un punto final de back-end que genera un token que luego se proporciona con cada solicitud.

Lo que me gustaría hacer:

  • Transición a un modo en el que los informes se generan y entregan al usuario como un archivo PDF. Esto podría hacerse en el frontend o en el backend, pero parece que el backend sería un lugar más apropiado, sin mencionar que hacerlo en el frontend podría generar los mismos problemas que ya tengo con los hacks de CSS.
  • Los archivos PDF generados deben poder tener un encabezado y pie de página repetidos, los cuales pueden contener datos dinámicos (por ejemplo, números de página en el pie de página, nombre del cliente en el encabezado)
  • Las descargas de PDF deben autenticarse. (No debería ser posible solicitar un PDF sin que se ejecute algún código de back-end para garantizar que se apruebe la solicitud)
  • La autenticación de PDF debe poder integrarse con la autenticación de token de portador de OAuth que ya está utilizando la aplicación (el backend de C# genera un token de portador. El backend de Python actualmente solo sirve datos no privados, pero podríamos hacer un escenario de inicio de sesión dual donde ambas API generar sus propios tokens).

Aquí están mis desafíos:

  • Por alguna razón, los navegadores no admiten @pageCSS incluso cuando se imprime una página web. Por lo tanto, no puedo incluir encabezados ni pies de página. Sin mencionar que cada navegador puede representar el contenido de forma ligeramente diferente. La generación de PDF en el backend unificará los informes.
  • Dado que los informes actualmente se generan dinámicamente en el frontend usando AngularJS, probablemente tendría que cambiar cómo se hace esto para que el backend pueda autogenerar archivos PDF. No estoy seguro de por dónde empezar con esto, aparte de tal vez escribir una clase de C# que pueda generar manualmente el HTML; sin embargo, no tendrá todas las bellezas del enlace de datos Angular y la facilidad de cambiar la plantilla según sea necesario. Me gustaría que esta transición fuera lo más fluida posible.

Mis preguntas:

  • ¿Existe una buena biblioteca gratuita (preferiblemente de código abierto, software gratuito aceptable, pago de último recurso y dentro de lo razonable ya que este es un proyecto personal que solo será utilizado por unas 3 personas) que pueda generar PDF desde HTML/CSS en el backend y que puede funcionar dentro de mi entorno de autenticación de token OAuth?
  • ¿Cuál sería el mejor enfoque para generar HTML para informes en el backend sin la ayuda del enlace de datos AngularJS? ¿Generación manual de HTML en CSS/Python? ¿Algún otro marco de enlace de datos diseñado para backend (no estoy seguro de si existe)?
Tal vez pueda encontrar algo útil en esta pregunta de desbordamiento de pila . Además, parece que le gustaría seguir convirtiendo HTML a PDF, pero si está abierto a generar el PDF desde cero, eso abre más opciones (como ReportLab en Python).
No estoy decidido a convertir HTML a PDF, solo que he pasado un tiempo considerable haciendo que los informes se vean bien usando HTML y CSS y me gustaría que no se desperdicie todo eso. Sin embargo, es posible que tenga que reconsiderar esto de cualquier manera, ya que no podré usar el enlace de datos AngularJS para generar los informes si uso un procesador HTML-> PDF de back-end ...

Respuestas (1)

Syncfusion brinda soporte para convertir cadenas URL/HTML a PDF en el lado del servidor usando C#, lo que puede ser adecuado para sus necesidades. https://www.syncfusion.com/pdf-framework/net/html-to-pdf

1) Puede alternar el tipo de medio del HTML entre Pantalla e Imprimir , consulte el siguiente enlace para obtener más detalles https://help.syncfusion.com/file-formats/pdf/converting-html-to-pdf#mediatype

2) La conversión se puede autenticar mediante OAuth (token de portador) utilizando el fragmento de código siguiente.

        //Initialize HTML to PDF converter 
        HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter(HtmlRenderingEngine.WebKit);
        WebKitConverterSettings webKitSettings = new WebKitConverterSettings();

        //Add custom HTTP request headers
        webKitSettings.HttpRequestHeaders.Add("Authorization", "bearer LXifBuVJzV4Fp_200rPdTHj_...");

        //Assign WebKit settings to the converter
        htmlConverter.ConverterSettings = webKitSettings;

        //Convert url to pdf
        PdfDocument document = htmlConverter.Convert(url);  

        //Save the document.
        document.Save("Sample.pdf");
        document.Close();  

3) Se pueden agregar diferentes encabezados y pies de página en el documento PDF después de la conversión de HTML a PDF, consulte la KB a continuación. https://www.syncfusion.com/kb/7797

4) El convertidor cargará los datos del enlace de datos del lado del cliente, como se muestra en el navegador web, se guardará el PDF.

Todo el conjunto de controles está disponible de forma gratuita (también para aplicaciones comerciales) a través del programa de licencia comunitaria si califica (menos de 1 millón de dólares estadounidenses en ingresos). La licencia comunitaria es el producto completo sin limitaciones ni marcas de agua.

Nota: Trabajo para Syncfusion.