Pregunta Convierte HTML + CSS a PDF con PHP? [cerrado]


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

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

  • DOMPDF: tuvo grandes problemas con las tablas. Destaqué mis grandes tablas anidadas y me ayudó (antes de que solo consumiera hasta 128M de memoria y luego morir - ese es mi límite de memoria en php.ini) pero hace un lío completo de tablas y parece que no funciona imágenes. Las tablas eran solo cosas básicas con algunos estilos de borde para agregar algunas líneas en varios puntos;
  • HTML2PDF y HTML2PS: De hecho, tuve mejor suerte con esto. Representó algunas de las imágenes (todas las imágenes son URL Chart de Google) y el formato de la tabla era mucho mejor, pero parecía tener algún problema de complejidad que aún no había resuelto y seguía muriendo con errores node_type () desconocidos. No estoy seguro de dónde ir desde aquí; y
  • Htmldoc: parece que funciona bien en HTML básico pero casi no admite CSS, por lo que tienes que hacer todo en HTML (no me di cuenta de que todavía era 2001 en Htmldoc-land ...), así 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 y que idealmente se ejecute a pedido a través de PHP en el servidor web.

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


1395


origen


Respuestas:


Importante: Tenga en cuenta que esta respuesta se escribió en 2009 y que podría no ser la solución más rentable hoy en 2018. Alternativas en línea como PDFShift Hoy son mejores en esto que en aquel entonces.


Mira esto PrinceXML.

Definitivamente es el mejor convertidor de HTML / CSS a PDF, aunque no es gratuito (pero bueno, tu programación puede no ser gratuita tampoco, así que si te ahorras 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)

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

Muestras PrinceXML


442



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 esa ruta.
Pero usaría http://pdfkit.org/ en lugar.
Probablemente quitándole todas las dependencias de nodejs para que se ejecute en el navegador.


627



Después de un poco de investigación y un tirón general del cabello, la solución parece ser HTML2PDF. DOMPDF hizo un trabajo terrible con tablas, bordes e incluso 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 extraño error sobre argumentos de referencia nulos a node_type. Finalmente encontré la solución a esto. Básicamente, PHP 5.1.x funciona bien con regex reemplaza (preg_replace_ *) en cadenas de cualquier tamaño. PHP 5.2.1 introdujo una directiva php.ini config llamada pcre.backtrack_limit. Lo que hace este parámetro de configuración es que limita la longitud de la cadena para la que 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? Nuevamente, no tengo idea.

UN se generó un error contra PHP 5.2.1 para esto, que aún está abierto casi dos años después.

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

Así que 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
  • 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é me tocó este problema es que html2pdf hace una conversión a xhtml como parte del proceso. Tal vez eso me conquistó (aunque casi un 50% de hinchazón parece extraño). 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. No es lo suficientemente rápido (por el momento) para una descarga en tiempo real desafortunadamente y el uso de la memoria pone la proporción de uso de memoria en el orden de 1000 a 1 (600M de RAM para un archivo de 70k), lo cual es completamente ridículo.

Desafortunadamente, es lo mejor que he encontrado.


141



¿Por qué no lo intentas? mPDF versión 2.0? Lo usé para crear un documento 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 alrededor de html a pdf con esta biblioteca, pero tareas más complejas tomarán algo de tiempo para leer y "entender" la documentación.


115



1) uso MPDF !

a) extraer en yourfolder

b) crear file.php en 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 tu navegador






2) Uso pdfToHtml !

1) extracto pdftohtml.exe a su carpeta raíz:

2) dentro de esa carpeta, en anyfile.php archivo, ponga este código (asumiendo que también hay una fuente 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) entrar FinalFolder, y estarán los archivos convertidos (tantas páginas, como el PDF fuente tenía ...)


60



Revisa TCPDF. Tiene algunas funciones de HTML a PDF que podrían ser suficientes para lo que necesita. ¡También es gratis!


51



yo sugiero DocRaptor (que usa PrinceXML como el "motor")


29



Solo para topar con el hilo, probé DOMPDF y funcionó perfectamente. he usado DIV y otros elementos de nivel de bloque para posicionar todo, lo mantuvieron estrictamente CSS 2.1 y jugaba muy bien.


25