Wkhtmltopdf ne pas charger les CSS locaux et les images
j'ai vu plusieurs questions qui sont très similaires à celui-ci, donc j'hésitais d'abord à le poster. Mais rien n'a suggéré de résoudre mon problème et je n'arrive pas à comprendre ce qui ne va pas moi-même.
pour un projet que j'ai fait pour un client, ils voulaient pouvoir convertir des devis pour leurs clients (générés à l'aide d'un formulaire en ligne) en PDF. Assez Simple. Comme tout le projet était en PHP, j'ai utilisé le processus simple suivant:
- Save la citation comme fichier HTML temporaire
- utilisez WkHTMLtoPDF pour convertir le fichier HTML en PDF
- sortie de ce fichier PDF
- Nettoyer (supprimer les fichiers temporaires)
cela a fonctionné jusqu'à ce qu'ils changent de serveurs. Le nouveau serveur a un pare-feu.
au début, L'étape de conversion PDF retournait une page pare-feu disant que le serveur ne pouvait pas faire de connexions sortantes. Pour résoudre ce problème, j'ai alimenté le fichier HTML directement au lieu de créer un lien vers il (/var/www/monsite/temp/18382.html au lieu de www.example.com/temp/18382.html). Cela a converti le HTML, mais le pare-feu a empêché le chargement de CSS et d'images
je peux surmonter les CSS, simplement en l'intégrant directement dans le site, au lieu de lier à elle (à l'aide de la <style>
tags), mais cela ne fonctionne pas pour les images
j'ai d'abord essayé d'utiliser des liens relatifs. J'ai changé <img src="http://www.example.com/temp/image.jpg" />
<img src="./image.jpg" />
. Cela n'a pas fonctionné.
j'ai essayé <img src="file:///var/www/mysite/temp/image.jpg" />
mais cela ne fonctionne pas,
j'ai lu et j'ai regardé dans le manuel WkHTMLtoPDF et j'ai essayé plusieurs arguments de ligne de commande comme --enable-local-file-access
,--enable /var/www/mysite/temp/
et --images
mais rien ne semble pour le fixer
11 réponses
si vous êtes sous linux, vérifiez la propriété de vos images. Pour windows, vous trouverez quelques infos sur http://code.google.com/p/wkhtmltopdf/wiki/Usage.
j'ai essayé différents types de chemins d'accès à l'image:
<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>
toutes les images sont montré correct. Je n'ai utilisé aucun argument de ligne de commande
(uniquement wkhtmltopdf /var/www/testpdf/makepdf.html makepdf.pdf
)
dans mon cas-version 0.12.2.1 de wkhtmltopdf (avec Qt corrigé) - ajout d'une balise de base à la section tête avec le chemin absolu pour s'assurer que les images et les css sont chargés.
<html>
<head>
...
<base href="http://www.example.com/">
<link href="/assets/css/style.css" rel="stylesheet">
...
</head>
<link href='C:\Projects\Hello\Hello.Web\Content\custom\home.css' rel='stylesheet' type='text/css' />
! pas http://localhost/Hello.Web/Content/custom/home.css
Sur le chemin D'utilisation de Windows:file:///C:/some/dir/some/file.img
(notez la triple /)
je sais que c'est un sujet assez ancien, mais je viens de faire face à la même question et peut-être que cela aidera quelqu'un.
J'ai essayé différentes approches, comme CSS background image et en utilisant string comme Base64 encoded data image. Parfois ça aidait, parfois non - pas de règle particulière que je pouvais trouver.
Il s'est avéré que la mise à niveau de la bibliothèque wkhtmltopdf résolu le problème.
J'utilisais la version 0.12.0 et mis à jour à 0.12.3
après avoir reçu l'aide de tout le monde d'ici et autour du filet, j'ai découvert quelque chose qui a fonctionné pour moi - asp.net (c#).
j'avais besoin d'accéder à l'image par url (pas par le chemin du fichier), car le html source original devait encore être consulté. Par le dépannage, j'ai découvert ces points.
ces drapeaux ont dû être transmis au processus de la ligne de commande: "-q -n --disable-smart-rétrécissement --images-page-taille A4"
L'URL doit toujours être absolue.
L'Image doit être un jpg! J'essayais à l'origine de faire un gif, en vain.
j'ai découvert en ajoutant "-- enable-local-file-access "n'a pas aidé, car il nécessite' \ ' slashes dans le chemin de l'image au lieu de '/' slashes, ce qui n'aide pas si vous espérez également utiliser le html source (dans certains navigateurs). Aussi, si vous avez besoin d'accéder au système de fichiers local, vous devez fournir un absolu chemin, comme il lit directement de la racine et va de là.
J'espère que cela aidera les autres.
Cheers
-o
- En vertu de la knp_snappy
- Pour l'option temporary_folder écrire ./
- j'.e:temporary_folder:./
2: maintenant dans votre html.twig pages Supprimer l'actif et écrire:
:
<link rel="stylesheet" type="text/css" href="{{ asset('css/default_template.css') }}">À:
<link rel="stylesheet" type="text/css" href="css/default_template.css">
et après ça, ça a marché pour je.
j'espère avoir aidé quelqu'un. Je vous remercie !
Vous pouvez insérer des images encodées base64 comme:
<img src=data:image/png;base64,someBase64content"/>
je viens de passer quelques jours sur l'obtention D'un flasque/ Blueprint /fichier statique/ css à lire par wkhtmltopdf, donc j'ai pensé que je partagerais ce que j'ai appris. Win 7, Flask 0.12 sur Python 3.4.4, en utilisant Pycharm pro, Le Dernier pdfkit et wkhtmltopdf.
- http://wkhtmltopdf.org/downloads.html
installer -mine installé sur:
droite après l'importation pdfkit dans votre flacon routes.py script ,insérez les lignes suivantes:
path_wkmltopdf = r'C:\Program fichiers\wkhtmltopdf\bin\wkhtmltopdf.exe'!--3-->
config = pdfkit.configuration (wkhtmltopdf=path_wkthmltopdf)
lorsque vous utilisez pdfkit dans une route, ajoutez", configuration = config" comme l'argument, par exemple:
pdfkit.from_string(html_text, output_filename, de configuration = config)
cela indique à pdfkit où chercher wkhtmltopdf. Oui, vous avez besoin pour ce faire.
- maintenant dans votre modèle de base de flasque ajouter", _external = True" à votre route css, par exemple:
(ceci empêchera wkhtmltopdf de lancer une erreur et de trouver css)
- maintenant (serious bootstrap template juju avertissement): allez dans votre flasque /bibliothèques externes /site-packages /flask_bootstrap /templates /base.template html et:
ajouter "http:" de sorte qu'il ressemble:
<link href="http:{{bootstrap_find_resource('css/bootstrap.css', cdn='bootstrap')}}" rel="stylesheet" media="screen">
B. fix js links:
<script src="http:{{bootstrap_find_resource('jquery.js', cdn='jquery')}}"></script>
<script src="http:{{bootstrap_find_resource('js/bootstrap.js', cdn='bootstrap')}}"></script>
et avec tout cela,
votre flasque conversion html en pdf
utilisant pdfkit et wkhtmltopdf
devrait s'exécuter sans erreurs.
note: j'ai déménagé à flask de PHP et si vous êtes un flask-er, s'il vous plaît postez vos solutions ici. La communauté flask est beaucoup plus petite que la communauté PHP donc nous devons tous nous lancer.
ceci est probablement dû aux règles de se Linux ou de pare-feu qui vous empêchent de sortir sur internet et de revenir sur votre propre serveur. Vous pouvez mettre à jour votre fichier hôte pour rediriger les appels vers votre domaine vers l'adresse de votre machine.
quand un navigateur rend votre HTML, il utilise un chemin relatif (parfois avec une URL au début de celui-ci) comme ceci:
<img src="/static/images/some_picture.png">
<img src="http://www.example.com/static/images/some_picture.png">
mais quand WkHTMLtoPDF tourne sur votre serveur, il est interfacé avec vos fichiers locaux directement via le système de fichiers, via un serveur web. Donc pour les fichiers locaux, contrairement à un navigateur, WkHTMLtoPDF veut le vrai filepath:
<img src="/var/www/myapplication/static/images/some_picture.png">
(Cela a fonctionné pour moi avec Python Flacon)