source - wkhtmltopdf options
WkHTMLtoPDF no carga imágenes y CSS locales (11)
Cuando un navegador presenta su HTML, utiliza una ruta relativa (a veces con una URL al principio) como esta:
<img src="/static/images/some_picture.png">
<img src="http://www.example.com/static/images/some_picture.png">
Pero cuando WkHTMLtoPDF se ejecuta en su servidor, se está interconectando con sus archivos locales directamente a través del sistema de archivos, no a través de un servidor web. Entonces, para los archivos locales, a diferencia de un navegador, WkHTMLtoPDF quiere la ruta de archivo real :
<img src="/var/www/myapplication/static/images/some_picture.png">
(Esto me funcionó con Python Flask)
He visto varias preguntas que son muy similares a esta, así que al principio dudé en publicarlo. Pero nada sugerido resolvió mi problema y parece que no puedo entender qué es lo que me pasa.
Para un proyecto que hice para un cliente, ellos querían poder convertir las cotizaciones de sus clientes (generadas mediante un formulario en línea) a PDF. Suficientemente simple. Como todo el proyecto estaba en PHP, usé el siguiente proceso simple:
- Guarde la cotización como un archivo HTML temporal
- Use WkHTMLtoPDF para convertir el archivo HTML a un PDF
- Salida este archivo PDF
- Limpiar (borrar archivos temporales)
Esto funcionó hasta que cambiaron los servidores. El nuevo servidor tiene un firewall.
Al principio, el paso de conversión de PDF estaba devolviendo una página de firewall que decía que el servidor no podía hacer conexiones salientes. Para resolver esto, introduje el archivo HTML directamente en lugar de vincularlo (/var/www/mysite/temp/18382.html en lugar de www.example.com/temp/18382.html). Esto convirtió el HTML, pero el firewall evitó la carga de CSS e imágenes.
Puedo superar el CSS simplemente incrustándolo directamente en el sitio en lugar de enlazarlo (usando las etiquetas <style>
), pero esto no funciona para las imágenes
Intenté usar enlaces relativos primero. Cambié <img src="http://www.example.com/temp/image.jpg" />
a <img src="./image.jpg" />
. Esto no funcionó.
Luego probé <img src="file:///var/www/mysite/temp/image.jpg" />
pero esto tampoco funcionó
Leí alrededor y miré el manual de WkHTMLtoPDF e intenté varios argumentos de línea de comando diferentes como --enable-local-file-access
, --enable /var/www/mysite/temp/
, y --images
pero nada parece arreglar eso
Después de recibir la amable asistencia de todos aquí y alrededor de la red, descubrí algo que me funcionó: la codificación en asp.net (c #).
Necesitaba acceder a la imagen por url (no a la ruta del archivo), ya que aún se necesitaba acceder al código fuente original HTML. A través de la resolución de problemas, descubrí estos puntos.
Estos indicadores debían pasarse al proceso de la línea de comandos: "-q -n --disable-smart-shrinking --images - page-size A4"
La URL todavía tiene que ser absoluta.
La imagen debe ser un jpg! Originalmente estaba tratando de hacer un gif, sin éxito.
Descubrí que agregar "--enable-local-file-access" no ayudó, ya que requiere "/" barras diagonales en la ruta de la imagen en lugar de barras "/", lo cual no ayuda si también espera usar la fuente html (en algunos navegadores). Además, si necesita acceder al sistema de archivos local, debe proporcionar una ruta absoluta, ya que se lee directamente desde la raíz y va desde allí.
Espero que esto ayude a los demás.
Aclamaciones
-y
En mi caso, wkhtmltopdf versión 0.12.2.1 (con qt parcheado), agregar una etiqueta de base a la sección de cabecera con la ruta absoluta aseguró que las imágenes y css se cargaran.
<html>
<head>
...
<base href="http://www.example.com/">
<link href="/assets/css/style.css" rel="stylesheet">
...
</head>
Esto probablemente se deba a las reglas de SE Linux o firewall que le impiden salir a Internet y volver a su propio servidor. Puede actualizar su archivo host para que las llamadas a su dominio vuelvan a la dirección particular de su máquina.
Para Windows, debe usar las rutas absolutas del sistema de archivos en su marca. Por ejemplo:
<link href=''C:/Projects/Hello/Hello.Web/Content/custom/home.css'' rel=''stylesheet'' type=''text/css'' />
! no http://localhost/Hello.Web/Content/custom/home.css
Puede insertar imágenes codificadas en base64 como:
<img src=data:image/png;base64,someBase64content"/>
Sé que este es un tema bastante antiguo, pero acabo de enfrentar el mismo problema y quizás ayude a alguien.
Probé diferentes enfoques, como la imagen de fondo css y el uso de cadenas como imagen de datos codificados en base64. Algunas veces ayudó, otras no, ninguna regla particular que pude encontrar.
Resultó que actualizar la biblioteca wkhtmltopdf solucionó el problema. Estaba usando la versión 0.12.0 y actualicé a 0.12.3
Si estás en linux, comprueba la propiedad de tus imágenes. Para Windows, encontrará información en http://code.google.com/p/wkhtmltopdf/wiki/Usage .
He intentado diferentes tipos de caminos a la imagen:
-
<img src="file:///var/www/testpdf/flowers.jpg"><br>
-
<img src="./flowers.jpg"><br>
-
<img src="flowers.jpg"><br>
-
<img src="/var/www/testpdf/flowers.jpg"><br>
Todas las imágenes se muestran correctas. No wkhtmltopdf /var/www/testpdf/makepdf.html makepdf.pdf
ningún argumento de línea de comandos (solo wkhtmltopdf /var/www/testpdf/makepdf.html makepdf.pdf
)
Solo pasé unos días en obtener un archivo Flask / Blueprint / static / css para que lo lea el wkhtmltopdf, así que pensé en compartir lo que aprendí. Win 7, Flask 0.12 en Python 3.4.4, utilizando Pycharm pro, el último pdfkit y wkhtmltopdf.
descargue el archivo wkhtmltopdf desde http://wkhtmltopdf.org/downloads.html
instalarlo -mine instalado en:
C: / Archivos de programa / wkhtmltopdf / bin / wkhtmltopdf.exe
Inmediatamente después de importar pdfkit en su script flask Routes.py, inserte las líneas:
path_wkthmltopdf = r''C: / Archivos de programa / wkhtmltopdf / bin / wkhtmltopdf.exe ''
config = pdfkit.configuration (wkhtmltopdf = path_wkthmltopdf)
(nota la "r" en la primera línea aquí!)
cuando use pdfkit en una ruta, agregue ", configuration = config" como argumento, por ejemplo:
pdfkit.from_string (html_text, output_filename, configuration = config)
esto le indica a pdfkit dónde buscar wkhtmltopdf. Sí, necesitas hacer esto.
- AHORA en su matraz PLANTILLA BASE agregue ", _externo = Verdadero" a su ruta css, por ejemplo:
(Esto evitará que wkhtmltopdf arroje un error no puede encontrar css)
- AHORA (advertencia juju seria de la plantilla bootstrap): ingrese en su frasco / bibliotecas externas / site-packages / flask_bootstrap / templates /base.html y:
a. arreglar el enlace de CSS:
agrega "http:" para que se vea como:
<link href="http:{{bootstrap_find_resource(''css/bootstrap.css'', cdn=''bootstrap'')}}" rel="stylesheet" media="screen">
segundo. arreglar enlaces JS:
agrega "http:" para que los enlaces JS se vean como:
<script src="http:{{bootstrap_find_resource(''jquery.js'', cdn=''jquery'')}}"></script>
<script src="http:{{bootstrap_find_resource(''js/bootstrap.js'', cdn=''bootstrap'')}}"></script>
y con todo esto
Su matraz html a pdf de conversión
utilizando pdfkit y wkhtmltopdf
Debe ejecutarse sin errores.
Nota: Me mudé al matraz desde PHP y si usted es un matraz, por favor publique sus soluciones aquí. La comunidad de frascos es MUCHO más pequeña que la comunidad de PHP, por lo que todos tenemos que colaborar.
en la ruta de uso de Windows: file:///C:/some/dir/some/file.img
(observe el triple /)
- Bajo el knp_snappy
- Para la opción temporal_folder escribe ./
- Es decir : carpeta temporal: ./
2: Ahora, en sus páginas html.twig, elimine el activo y escriba:
Desde:
<link rel="stylesheet" type="text/css" href="{{ asset(''css/default_template.css'') }}"> A:
<link rel="stylesheet" type="text/css" href="css/default_template.css">
Y después de eso, funcionó para mí.
Ojalá haya ayudado a alguien. Gracias !