¿Cómo puedo agregar HTML y CSS a PDF [cerrado]

Resuelto cletus asked hace 54 años • 30 respuestas

Tengo un documento HTML (no XHTML) que se reproduce bien en Firefox 3 e IE 7. Utiliza CSS bastante básico para diseñarlo y se reproduce bien en HTML.

Ahora estoy buscando una forma de convertirlo a PDF. Yo he tratado:

  • DOMPDF : tenía grandes problemas con las tablas. Factoricé mis tablas anidadas grandes y me ayudó (antes consumía hasta 128 M de memoria y luego moría; ese es mi límite de memoria en php.ini), pero crea un completo desastre de tablas y no parece funcionar. imágenes. Las tablas eran simplemente cosas básicas con algunos estilos de borde para agregar algunas líneas en varios puntos;
  • HTML2PDF y HTML2PS : De hecho, tuve más suerte con esto. Procesó algunas de las imágenes (todas las imágenes son URL de Google Chart) y el formato de la tabla fue mucho mejor, pero parecía tener algún problema de complejidad que aún no he descubierto y seguía muriendo con errores de node_type() desconocidos. No estoy seguro de adónde ir desde aquí; y
  • Htmldoc : esto parece funcionar bien en HTML básico, pero casi no tiene soporte para CSS, por lo que tienes que hacer todo en HTML (no me di cuenta de que todavía era 2001 en Htmldoc-land...), por lo que es inútil para mí.

Probé una aplicación de Windows llamada Html2Pdf Pilot que en realidad hizo un trabajo bastante decente, pero necesito algo que como mínimo se ejecute en Linux e idealmente se ejecute bajo demanda a través de PHP en el servidor web.

¿Qué me falta o cómo puedo resolver este problema?

cletus avatar Jan 01 '70 08:01 cletus
Aceptado

Mira esto wkhtmltopdf. Es de código abierto, basado en webkit y gratuito.

Escribimos un pequeño tutorial aquí .

EDITAR (2017):

Si fuera a construir algo hoy, ya no seguiría ese camino.
Pero usaría http://pdfkit.org/ en su lugar.
Probablemente quitándolo de todas sus dependencias de nodejs para ejecutarlo en el navegador.

Mic avatar Aug 31 '2009 13:08 Mic

Importante: tenga en cuenta que esta respuesta se escribió en 2009 y puede que no sea la solución más rentable hoy en día en 2019. Las alternativas en línea son mejores hoy en esto que en aquel entonces.

A continuación se muestran algunos servicios en línea que puede utilizar:

  • Cambio de PDF
  • Restpack
  • Capa PDF
  • DocRaptor
  • HTMLPDFAPI
  • Cohete HTML a PDF

Eche un vistazo a PrinceXML .

Definitivamente es el mejor conversor de HTML/CSS a PDF que existe, aunque no es gratuito (pero bueno, es posible que tu programación tampoco sea gratuita, así que si te ahorra 10 horas de trabajo, estás en casa libre (ya que también necesitas tenga en cuenta que las soluciones alternativas requerirán que configure un servidor dedicado con el software adecuado))

Ah, sí, ¿mencioné que esta es la primera (y probablemente la única) solución HTML2PDF que incluye ACID2 completo ?

Muestras PrinceXML

SchizoDuckie avatar Jan 12 '2009 08:01 SchizoDuckie

Después de algunas investigaciones y tirones de pelo en general, la solución parece ser HTML2PDF . DOMPDF hizo un trabajo terrible con tablas, bordes e incluso diseños moderadamente complejos y htmldoc parece razonablemente robusto pero ignora casi por completo CSS y no quiero volver a hacer diseños HTML sin CSS solo para ese programa.

HTML2PDF parecía el más prometedor, pero seguía teniendo este extraño error sobre argumentos de referencia nulos para node_type. Finalmente encontré la solución a esto. Básicamente, PHP 5.1.x funcionó bien con reemplazos de expresiones regulares (preg_replace_*) en cadenas de cualquier tamaño. PHP 5.2.1 introdujo una directiva de configuración php.ini llamada pcre.backtrack_limit . Lo que hace este parámetro de configuración es limitar la longitud de la cadena para la cual se realiza la coincidencia. Por qué se introdujo esto, no lo sé. El valor predeterminado fue elegido 100.000. ¿Por qué un valor tan bajo? De nuevo, ni idea.

Se generó un error en PHP 5.2.1 para esto , que está cerrado.

Lo horrible de esto es que cuando se excede el límite, el reemplazo simplemente falla silenciosamente . Al menos si se hubiera generado y registrado un error, tendría alguna indicación de lo que sucedió, por qué y qué cambiar para solucionarlo. Pero no.

Entonces tengo un archivo HTML de 70k para convertirlo en PDF. Requiere la siguiente configuración de php.ini:

  • pcre.backtrack_limit = 2000000; # probablemente más de lo que necesito pero está bien
  • límite_memoria = 1024M; # sí, un gigabyte ; y
  • max_execution_time = 600; # sí, 10 minutos .

Ahora el lector astuto puede haber notado que mi archivo HTML tiene menos de 100k. La única razón por la que puedo adivinar por qué tuve este problema es que html2pdf realiza una conversión a xhtml como parte del proceso. Quizás eso me atrapó (aunque casi un 50% de hinchazón parece extraño). Cualquiera sea el caso, lo anterior funcionó.

Ahora bien, html2pdf consume muchos recursos. Mi archivo de 70k tarda aproximadamente 5 minutos y al menos 500-600M de RAM para crear un archivo PDF de 35 páginas. Desafortunadamente, no es lo suficientemente rápido (de lejos) para una descarga en tiempo real y el uso de la memoria coloca la relación de uso de la memoria en el orden de 1000 a 1 (600 M de RAM para un archivo de 70 k), lo cual es completamente ridículo.

Desafortunadamente, eso es lo mejor que se me ocurrió.

cletus avatar Jan 12 '2009 03:01 cletus