Queremos brindarte la mejor información que hemos encontrado en todo internet. Esperamos que te sirva de ayuda y si quieres comentarnos cualquier detalle que nos pueda ayudar a perfeccionar nuestra información hazlo con total libertad.
Solución:
Mira esto wkhtmltopdf
. Es de código abierto, basado en webkit y gratuito.
Escribimos un pequeño tutorial aquí.
EDITAR (2017):
Si fuera para construir algo hoy, ya no iría por ese camino.
Pero usaría http://pdfkit.org/ en su lugar.
Probablemente despojándolo de todas sus dependencias de nodejs, para ejecutarlo en el navegador.
Importante:
Tenga en cuenta que esta respuesta se escribió en 2009 y podría no ser la solución más rentable hoy en día en 2019. Las alternativas en línea son mejores hoy en día que en ese entonces.
Estos son algunos servicios en línea que puede utilizar:
- Desplazamiento de PDF
- Restpack
- Capa PDF
- Doctor Raptor
- HTMLPDFAPI
- Cohete de HTML a PDF
Echa un vistazo a PrinceXML.
Definitivamente es el mejor conversor de HTML/CSS a PDF que existe, aunque no es gratis (pero bueno, tu programación puede que tampoco sea gratis, así que si te ahorra 10 horas de trabajo, estás libre en casa (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 hace ACID2 completo?
Ejemplos de PrinceXML
Después de investigar un poco y tirarse de los pelos 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 sólido, pero ignora casi por completo el CSS y no quiero volver a hacer el diseño HTML sin CSS solo para ese programa.
HTML2PDF parecía el más prometedor, pero seguía teniendo este extraño error sobre null argumentos de referencia a 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 el string longitud para la que se realiza el emparejamiento. 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 aún está abierto casi dos años después.
Lo horrible de esto es que cuando se excede el límite, el reemplazo solo 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.
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
- 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 es más pequeño que 100k. La única razón por la que puedo adivinar por qué me encontré con este problema es que html2pdf realiza una conversión a xhtml como parte del proceso. Tal vez eso me tomó el control (aunque casi el 50% de la hinchazón parece extraño). En cualquier caso, lo anterior funcionó.
Ahora, html2pdf es un acaparador 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. Desafortunadamente, no es lo suficientemente rápido (de lejos) 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 (600 M de RAM para un archivo de 70 000), lo cual es absolutamente ridículo.
Desafortunadamente, eso es lo mejor que he encontrado.