Guides de migration · PHP, Laravel

Remplacer wkhtmltopdf par pdfkiln dans laravel-snappy

barryvdh/laravel-snappy apporte knp-snappy à Laravel (SnappyPdf::loadView(), SnappyImage). Deux lignes de .env le font passer à pdfkiln.

1. Installer pdfkiln

Sur un serveur Linux, prenez le paquet Debian : il apporte les bibliothèques système de Chromium, et ses correctifs avec apt upgrade.

curl -fsS https://apt.pdfkiln.org/pdfkiln-archive-keyring.asc | sudo tee /usr/share/keyrings/pdfkiln-archive-keyring.asc > /dev/null
printf 'Types: deb\nURIs: https://apt.pdfkiln.org\nSuites: stable\nComponents: main\nSigned-By: /usr/share/keyrings/pdfkiln-archive-keyring.asc\n' \
  | sudo tee /etc/apt/sources.list.d/pdfkiln.sources
sudo apt update && sudo apt install pdfkiln

Sur un poste de développement, ou là où le paquet Debian ne convient pas, le paquet Composer place wkhtmltopdf et wkhtmltoimage dans vendor/bin ; le programme est téléchargé au premier usage, SHA-256 vérifié :

composer require pdfkiln/pdfkiln

2. Brancher laravel-snappy sur pdfkiln

# .env, read by config/snappy.php (pdf.binary, image.binary)
WKHTML_PDF_BINARY=/usr/bin/wkhtmltopdf
WKHTML_IMG_BINARY=/usr/bin/wkhtmltoimage

Avec le paquet Composer, réglez plutôt les binaires dans config/snappy.php :

'pdf' => ['binary' => Pdfkiln\binary(), /* ... */],
'image' => ['binary' => Pdfkiln\binary('wkhtmltoimage'), /* ... */],

Si la configuration est en cache, videz-le : php artisan config:clear.

3. Vérifier

wkhtmltopdf --version
# wkhtmltopdf 0.12.6 (with patched qt), pdfkiln 1.0.3, Chromium 156.0.8078.73

La réponse commence comme celle de wkhtmltopdf 0.12.6 : les bibliothèques qui lisent la version continuent de fonctionner.

Ce qu’attend laravel-snappy, et ce que fait pdfkiln

  • laravel-snappy passe par knp-snappy : --lowquality est accepté sans un mot, et rien ne va sur la sortie d’erreur quand tout va bien.
  • Faites-le pointer sur wkhtmltopdf, jamais sur pdfkiln, qui passe à sa propre interface.

Testé

laravel-snappy appelle knp-snappy, dont la suite de tests passe avec pdfkiln (knp-snappy 1.7.3, job d’intégration continue libraries).

Un rendu diffère ? Ouvrez un ticket avec le HTML et les deux PDF : github.com/Jamalofski/pdfkiln/issues. Les différences connues sont listées dans le README.