pdf-generation to - Convertir HTML+CSS a PDF con PHP?




html2pdf exportar (25)

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

HTML2PDF parecía el más prometedor, pero seguí teniendo este error extraño sobre los argumentos de referencia nula a node_type. Finalmente encontré la solución a esto. Básicamente, PHP 5.1.x funcionó bien con los 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 como 100.000. ¿Por qué un valor tan bajo? De nuevo, ni idea.

Se generó un error contra PHP 5.2.1 para esto , que sigue abierto casi dos años después .

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

Así que tengo un archivo HTML de 70k para convertir en PDF. Requiere los siguientes ajustes de php.ini:

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

Ahora el lector astuto puede haber notado que mi archivo HTML es más pequeño que 100k. La única razón por la que puedo adivinar por qué encuentro este problema es que html2pdf realiza una conversión a xhtml como parte del proceso. Tal vez eso me dominó (aunque casi 50% la hinchazón parece extraña). En cualquier caso, lo anterior funcionó.

Ahora, html2pdf es un cerdo de 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. Lamentablemente, no es lo suficientemente rápido (por mucho) para una descarga en tiempo real y el uso de la memoria hace que la relación de uso de la memoria sea del orden de 1000 a 1 (600M de RAM para un archivo de 70k), lo cual es absolutamente ridículo.

Desafortunadamente, eso es lo mejor que he encontrado.

Tengo un documento HTML (no XHTML) que funciona bien en Firefox 3 e IE 7. Utiliza CSS bastante básico para darle un estilo y está bien en HTML.

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

  • DOMPDF : tuvo grandes problemas con las tablas. Factoré mis grandes tablas anidadas y me ayudó (antes de que solo consumiera hasta 128M de memoria y luego se muriera, ese es mi límite de memoria en php.ini) pero hace un completo desorden de tablas y no parece imagenes Las tablas eran solo cosas básicas con algunos estilos de borde para agregar algunas líneas en varios puntos;
  • HTML2PDF y HTML2PS : En realidad tuve mejor suerte con esto. Representó 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 un problema de complejidad que aún no he resuelto y seguí muriendo con errores de tipo de nodo desconocido (). No estoy seguro de a dónde ir desde aquí; y
  • Htmldoc : esto parece funcionar bien en HTML básico, pero casi no tiene soporte para CSS, así que tienes que hacer todo en HTML (no me di cuenta de que aún era 2001 en Htmldoc-land ...), así que es inútil para mí.

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

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


¡Buenas noticias! Snappy !!

Snappy es una biblioteca PHP5 de código abierto muy fácil , que permite la generación de miniaturas, instantáneas o PDF desde una url o una página html. Y ... usa el excelente wkhtmltopdf basado en wkhtmltopdf

¡Disfrutar! ^ _ ^


En términos de costo, el uso de un servicio web (API) puede ser, en muchos casos, el enfoque más sensato. Además, al subcontratar este proceso, descarga su propia infraestructura / backend y, siempre que esté usando un servicio confiable, garantice la compatibilidad con el ajuste de los estándares web, el tiempo de actividad, los cortos tiempos de procesamiento y la entrega rápida de contenido.

He investigado un poco sobre la mayoría de los servicios web actualmente en el mercado, a continuación encontrará las API que creo que vale la pena mencionar en este hilo, en un orden basado en la relación precio / valor. Todos ellos ofrecen clases y paquetes de PHP pre-compuestos.

  1. pdflayer.com - Costo: $ - Calidad: ☆☆☆☆
  2. docraptor.com - Costo: $$$ - Calidad: ☆☆☆☆☆
  3. pdfcrowd.com - Costo: $$ - Calidad: ☆☆☆

Calidad:

Teniendo el motor PrinceXML alta calidad como una red troncal, DocRaptor ofrece claramente la mejor calidad de PDF, devolviendo documentos PDF altamente pulidos y bien convertidos. Sin embargo, el servicio API de pdflayer se acerca mucho aquí. Pdfcrowd no necesariamente puntúa con calidad, sino con velocidad de procesamiento.

Costo:

pdflayer.com : como se indicó anteriormente, la opción más rentable aquí es pdflayer.com, que ofrece un plan de suscripción totalmente gratuito para 100 PDF mensuales y suscripciones premium que oscilan entre $ 9.99 y $ 119.99. El precio de 10,000 documentos PDF mensuales es de $ 39.99.

docraptor.com - Ofrece un período de prueba gratuito de 7 días. Los planes de suscripción premium van desde $ 15 a $ 2250. El precio de 10,000 documentos PDF mensuales es de ~ $ 300.00.

pdfcrowd.com - Ofrecer 100 archivos PDF una vez gratis. Los planes de suscripción premium van desde $ 9- $ 89. El precio de 10,000 documentos PDF mensuales es de ~ $ 49.00.

He usado los tres y este texto debe ayudar a cualquiera a decidir sin tener que pagar por todos ellos. Este texto no se ha escrito para respaldar ningún producto y no tengo ninguna afiliación con ninguno de los productos.


Solo para romper el hilo, probé DOMPDF y funcionó perfectamente. He usado DIV y otros elementos a nivel de bloque para posicionarlo todo, lo mantuve estrictamente CSS 2.1 y funcionó muy bien.


TCPDF funciona bien, sin dependencias, es gratis y está constantemente corregido. Tiene una velocidad razonable si los contenidos HTML / CSS suministrados están bien formados. Normalmente genero de 50 a 300 kB de entrada HTML (incluido CSS) y obtengo salida de PDF en 1-3 segundos con 10 a 15 páginas PDF.

Recomiendo encarecidamente el uso de tidy library como HTML bonito formateador antes de enviar algo a TCPDF.


1) utilizar MPDF !

a) extracto en tu yourfolder

b) cree file.php en su yourfolder e inserte dicho código:

<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p style="color:red;">Hallo World<br/>Fisrt sentencee</p>');
$mpdf->Output();   exit;
 ?>

c) abrir file.php desde su navegador




2) Utilice pdfToHtml !

1) extrae pdftohtml.exe a tu carpeta raíz:

2) dentro de esa carpeta, en el archivo anyfile.php , coloque este código (asumiendo que también hay un ejemplo example.pdf):

<?php
$source="example.pdf";
$output_fold="FinalFolder";

    if (!file_exists($output_fold)) { mkdir($output_fold, 0777, true);}
$result= passthru("pdftohtml $source $output_fold/new_filename",$log);
//var_dump($result); var_dump($log);
?>

3) ingrese FinalFolder , y estarán los archivos convertidos (tantas páginas como el PDF de origen tenía).


Recomiendo TCPDF o DOMPDF, es ese orden


Echa un vistazo a wkhtmltopdf . Es de código abierto, basado en webkit y gratuito.

Aquí escribimos un pequeño tutorial.

EDITAR (2017):

Si fuera para construir algo hoy, no seguiría esa ruta.
Pero usaría http://pdfkit.org/ lugar.
Probablemente eliminándolo de todas sus dependencias de nodo, para ejecutarlo en el navegador.


Importante: tenga en cuenta que esta respuesta se escribió en 2009 y puede que no sea la solución más rentable hoy en 2018. Las alternativas en línea como PDFShift son mejores hoy en este momento que antes.

Echa un vistazo a PrinceXML .

Definitivamente, es el mejor convertidor de HTML / CSS a PDF que existe, aunque no es gratis (pero bueno, su programación puede que tampoco sea gratis, así que si ahorra 10 horas de trabajo, estará en casa gratis (ya que también necesita tenga en cuenta que las soluciones alternativas requerirán que configure un servidor dedicado con el software adecuado)

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

Muestras PrinceXML


Sugiero DocRaptor (que utiliza PrinceXML como el "motor")


No creo que una clase de php sea la mejor para renderizar una página xHtml con css.

¿Qué pasa cuando sale una nueva regla css? (luego css 3.0 ...)

La mejor manera de representar una página html es, por supuesto, un navegador. Firefox 3.0 puede "imprimir" de forma nativa en formato pdf, Torisugary desarrolló una extensión (impresión de línea de comando) para usarlo. Aquí lo encontrarás.

De todos modos, todavía hay muchos programas que ejecutan Firefox como un convertidor de pdf ...

En este momento, creo que wkhtmltopdf es el mejor (ese es el que usa el navegador safari), rápido, rápido, increíble. Sí, también OpenSource ... wkhtmltopdf


Tal vez podría intentar usar Tidy antes de entregar el archivo al convertidor. Si uno de los procesadores se ahoga con algún problema de HTML (como una etiqueta sin cerrar), podría ayudarlo.


El HTML2PDF y HTML2PS que se mencionó originalmente en la publicación de apertura hablaba de un paquete de 2009 con este link

Pero hay un mejor HTML2PDF

Se basa en TCPDF aunque está parcialmente en francés.

Puede tener encabezados o pies de página que se repiten en las páginas y tienen números de páginas y páginas totales. Vea sus ejemplos . Lo he estado usando durante más de tres años y lo recomiendo.


La mención anterior de Darryl Hein de TCPDF es probablemente una gran idea. El código de Nicola Asuni es bastante práctico y poderoso. El único asesino es que si alguna vez planea fusionar archivos PDF con su PDF generado, no tiene esas características. Tendría que crear el PDF y luego combinarlo utilizando algo como PDFTK de Sid Steward (www.pdflabs.com/tools/pdftk-the-pdf-toolkit/).


API web

Si hay personas que siempre buscan este tipo de cosas, hay un sitio web gratuito que le permite convertir el código html y las páginas a pdf. También hay una api (muy pequeña) que le permite obtener un archivo pdf de url.

Compruébalo aquí


Desarrollé una API pública para construir archivos PDF desde páginas web. Tiene una buena clase de cliente PHP que lo hace muy fácil de usar. Utiliza wkhtmltopdf para representar el PDF en la nube.

No hay necesidad de nada especial en el HTML. No hay necesidad de URLS absolutas en los enlaces images / css / js. Funciona en localhost (dev machine) también.

Actualmente, el servicio tiene puntos finales en 4 regiones de Azure: este de EE. UU., Oeste de EE. UU., Norte de la UE y sudeste asiático.

Es rápido, ya que utiliza un protocolo propietario para enviar los contenidos de la página web a la API para la conversión a PDF.

Es confiable porque todos los puntos finales tienen carga equilibrada.

Cuenta gratuita disponible para prueba o bajo uso. Detalles en el sitio web:

https://rotativahq.com


Hay un tutorial en la zona de desarrollo de Zend sobre cómo generar pdf desde php ( parte 1 , parte 2 ) sin bibliotecas externas. Nunca implementé este tipo de solución, pero como es todo PHP, puede que le resulte más flexible de implementar y depurar.


La representación fina no significa nada. ¿Se valida?

Todos los navegadores hacen lo máximo que pueden para mostrar algo en la pantalla, sin importar lo mala que sea la entrada. Y por supuesto que no hacen lo mismo. Si desea la misma representación que FireFox, puede utilizar su motor de representación. Hay generadores de pdf para ello. Sin embargo, es un montón de trabajo.


no PHP , sino una biblioteca de Java , que hace la cosa:

Flying Saucer toma XML o XHTML y le aplica hojas de estilo compatibles con CSS 2.1 para procesarlo en PDF

Se puede usar desde PHP a través del system() o una llamada similar. A pesar de que requiere XML bien formado de la input .


Ya se ha mencionado, pero me gustaría confirmar que mpdf es el convertidor de html a pdf más fácil, potente y gratuito que existe. El cielo es realmente el límite. Incluso puede generar archivos PDF de datos dinámicos generados por el usuario.

Por ejemplo, un cliente quería un sistema CMS para poder actualizar la lista de canciones de la música que tocaba en su club. Eso no fue un problema, pero también quería que los usuarios pudieran descargar un .pdf de la lista de reproducción, por lo que este pdf descargable también tenía que ser actualizado por el cms. Gracias a mpdf, con algunos bucles simples y variables intercaladas, pude hacer precisamente eso. Algo que pensé que me llevaría semanas, literalmente, me tomó minutos.

Gran article que me ayudó a empezar.


TCPDF . Tiene alguna funcionalidad de HTML a PDF que puede ser suficiente para lo que necesita. ¡También es gratis!


¿Por qué no pruebas la versión 2.0 de mPDF ? Lo utilicé para crear un documento en PDF. Funciona bien.

Mientras tanto, mPDF está en la versión 5.7 y se mantiene activamente, en contraste con HTML2PS / HTML2PDF

Pero tenga en cuenta que la documentación puede ser realmente difícil de manejar. Por ejemplo, eche un vistazo a esta página: https://mpdf.github.io/ .

Se pueden hacer tareas muy básicas en html a pdf con esta biblioteca, pero las tareas más complejas llevarán un tiempo leyendo y "entendiendo" la documentación.


¿La conversión de HTML a PDF realmente tiene que ocurrir en el lado del servidor usando PHP?

Acabo de encontrar jsPDF , una solución del lado del cliente que utiliza HTML5 / JavaScript. El código con licencia MIT también está en GitHub .


Esta pregunta ya es bastante antigua, pero no he visto a nadie que mencione CutyCapt así que lo haré :)

CutyCapt

CutyCapt es una pequeña utilidad multiplataforma de línea de comandos para capturar la representación de WebKit de una página web en una variedad de formatos vectoriales y de mapa de bits, incluyendo SVG, PDF, PS, PNG, JPEG, TIFF, GIF y BMP






php html css pdf pdf-generation