[SPIP Zone] Plugin PDF Version

Hello,

Je découvre le plugin PDF version, et en lisant la description, quelques
questions me sont venues.

Si j'en crois la description du plugin
(http://zone.spip.org/trac/spip-zone/browser/plugins/pdf_version/trunk/paquet.xml),
il s'agit d'exporter en PDF n'importe quel objet SPIP, via wkhtmltopdf.

Wkhtmltopdf est un utilitaire en ligne de commande qu'il faut installer
sur le serveur (http://wkhtmltopdf.org/). Il sert à convertir du html en
pdf.

Ma question principal est : pourquoi avoir choisi d'utiliser wkhtmltopdf
alors qu'il y a déjà, sur la zone, un outil pour convertir du html en
PDF : dompdf
http://zone.spip.org/trac/spip-zone/browser/plugins/dompdf/trunk ?

Contrairement à wkhtmltopdf, dompdf fonctionne sans avoir à installer
quoi que ce soit sur le serveur. Il me semble donc plus approprié.

Non ?

Le 18/09/2016 à 14:05, Phenix a écrit :

Contrairement à wkhtmltopdf, dompdf fonctionne sans avoir à installer
quoi que ce soit sur le serveur. Il me semble donc plus approprié.

Non ?

Si tu préfères ne rien installer, oui c'est mieux pour toi, c'est une bonne option.

Mais dans tous les autres cas, si tu as accès complet à ton serveur (ou si les gens qui s'en occupent peuvent le faire à ta place) c'est BEAUCOUP mieux d'utiliser un utilitaire méga rapide en ligne de commande, plutôt qu'un truc qui fait tout en PDF et qui va prendre beaucoup plus de ressource, et souvent être moins complet.

--
RastaPopoulos

Le 18/09/2016 à 16:37, RastaPopoulos a écrit :

plutôt qu'un truc qui fait tout en PDF

Tapé trop vite tout l'heure : il fallait lire qui fait tout en PHP, bien sûr.

--
RastaPopoulos

Hello,

Mais dans tous les autres cas, si tu as accès complet à ton serveur
(ou si les gens qui s'en occupent peuvent le faire à ta place) c'est
BEAUCOUP mieux d'utiliser un utilitaire méga rapide en ligne de
commande, plutôt qu'un truc qui fait tout en PDF et qui va prendre
beaucoup plus de ressource, et souvent être moins complet.

Je ne sais pas exactement combien de personne sont dans ce cas, mais je
pense que c'est assez faible.
Peut être proposer dompdf par défaut (j'installe, ça fonctionne) et
wkhtmltopdf en option ?

Le 18/09/2016 à 16:37, RastaPopoulos a écrit :

Le 18/09/2016 à 14:05, Phenix a écrit :

Contrairement à wkhtmltopdf, dompdf fonctionne sans avoir à installer
quoi que ce soit sur le serveur. Il me semble donc plus approprié.

Non ?

Si tu préfères ne rien installer, oui c'est mieux pour toi, c'est une
bonne option.

Mais dans tous les autres cas, si tu as accès complet à ton serveur
(ou si les gens qui s'en occupent peuvent le faire à ta place) c'est
BEAUCOUP mieux d'utiliser un utilitaire méga rapide en ligne de
commande, plutôt qu'un truc qui fait tout en PDF et qui va prendre
beaucoup plus de ressource, et souvent être moins complet.

Phenix a écrit :

Ma question principal est : pourquoi avoir choisi d'utiliser wkhtmltopdf
alors qu'il y a déjà, sur la zone, un outil pour convertir du html en
PDF : dompdf
Connexion · GitLab ?

Contrairement à wkhtmltopdf, dompdf fonctionne sans avoir à installer
quoi que ce soit sur le serveur. Ilme semble donc plus approprié.

Pour avoir essayé à peu près toutes les libs PHP de generation de PDF sur ces 10 dernières années, j'en suis arrivé à la conclusion que de telles libs ne peuvent pas avoir un rendu fiable et correct d'un document HTML/CSS quelconque et obligent à faire plein de bidouilles pour que ça marchotte.

La raison principale et essentielle est que HTML n'est pas traduisible en PDF, et que la PDFisation d'un document HTML n'est ni plus ni moins qu'un rendu visuel d'un document HTML (exprimé en commandes PDF au lieu de px).

C'est exactement le travail d'un moteur de rendu de navigateur (Gecko, Blink, WebKit…). Quand on voit la complexité de ces moteurs de rendu et les ressources que cela nécessite chez les développeurs de navigateur pour les maintenir fonctionnels, il serait illusoire de penser qu'il sera possible de faire aussi bien avec une librairie PHP maintenue par quelques mainteneurs, sans leur faire offense.

J'avoue ne pas avoir essayé DOMPDF, mais je ne pense pas qu'elle échappe totalement à l'analyse, et ce que je peux lire sur GitHub - dompdf/dompdf: HTML to PDF converter for PHP :

"At its heart, dompdf is (mostly) a CSS 2.1 compliant HTML layout and rendering engine written in PHP." [ ce qui exclu donc CSS3 ]

"Dompdf is not particularly tolerant to poorly-formed HTML input. To avoid any unexpected rendering issues you should either enable the built-in HTML5 parser at runtime ($dompdf->set_option('isHtml5ParserEnabled', true):wink: or run your HTML through a HTML validator/cleaner (such as Tidy or the W3C Markup Validation Service)."

"Large files or large tables can take a while to render."

"CSS float is in development and may not produce the desired result"

Mon besoin est d'avoir un rendu propre, fiable, complètement contrôlable en HTML/CSS et dont je suis sûr qu'il couvrira tous les cas que je vais rencontrer (et pas avoir des documents PDF à demi blanc au hasard des bugs et problèmes techniques de rendu, comme j'ai pu l'expérimenter avec les lib sus-citées).

Pour le moment PrinceXML était la seule solution qui remplissait ce besoin, mais avec un coût inacceptable pour les petits projets.

J'ai réessayé récemment WKHTMLTOPDF qui s'appuie sur le moteur webkit de Safari, et j'ai pu voir qu'on obtenait de très bon résultats, d'où mon choix.

Maintenant comme tu auras pu le lire dans le code, j'ai adressé le problème de l'execution binaire de plusieurs façons :

- le plugin peut servir d'API http pour d'autres sites. Ainsi tu peux l'installer sur un SPIP dédié sur un hébergement qui te permet d'avoir wkhtmltopdf, et ensuite l'utiliser comme API wkhtmltopdf pour d'autres sites qui n'auront pas besoin du binaire en local

- la fonction de génération "generer_pdf_version_objet" est chargée par charger_fonction, ce qui la rend tout à fait surchargeable. Tu peux ainsi en écrire ta propre version dans le plugin DOMPDF qui viendra prendre la main et faire le rendu via la lib DomPDF, et te donner exactement ce que tu veux en combinant les 2 plugins

Pour le moment je préfèrerai qu'on en reste là sans intégrer DOMPDF au plugin pdf_version, car pour moi il ne remplit pas le besoin, mais je suis ouvert à regarder ça de plus près quand tu auras une intégration de l'un à l'autre qui fonctionne et que je peux tester.

Cédric

Hello

J'ai réessayé récemment WKHTMLTOPDF qui s'appuie sur le moteur webkit de Safari, et j'ai pu voir qu'on obtenait de très bon résultats, d'où mon choix.

Pour info : je viens de voir que cela bouge du coté de WKHTMLTOPDF

Où il est effectivement confirmé que d'autres pensent la même chose, à savoir que WKHTMLTOPDF est effectivement une lib excellente :

Voir Top 5 : Best open source PDF generation libraries for PHP | Our Code World

…et le lien qui nous intéresse plus particulièrement ici :
GitHub - KnpLabs/snappy: PHP library allowing thumbnail, snapshot or PDF generation from a url or a html page. Wrapper for wkhtmltopdf/wkhtmltoimage.

Si je comprend bien, Snappy permettrait de lancer depuis une interface Web la génération de PDF sur la base de la lib WKHTMLTOPDF ?

P

Dans nos benchmarks qui datent seulement de l'année dernière 2018,
webkit/wkhtml avait encore énormément de lacunes sur plein de règles CSS
print super importantes.

Les seules qui sortaient du lot c'était
- PrinceXML, la référence, pas libre du tout, qui gère en gros 100% (à
la fois CSS3 et tous les trucs complexes propres au print)
- Weasy, qui est libre, en python, et qui gérait le plus de choses dans
les trucs libres

Pour vraiment faire du print html-css=>pdf, il faut que la lib gère bien
tous les trucs CSS de base, y compris CSS3 donc (positionnement, ombre,
etc) mais aussi tous les trucs complexes du print : blocs permanents
utilisant le contenu d'un morceau html (par ex pour afficher dans une
marge le dernier chapitre en cours), compteurs… et plein d'autres choses.
Ça doit gérer ça : https://print-css.rocks/lessons

Sinon on peut juste générer des PDF super basiques, pour faire une
facture d'une page par exemple, ça c'est facile :slight_smile:

--
RastaPopoulos

Hello,

Je suis tout à fait d’accord pour dire que dans les solutions open sources c’est ce qu’il y a de mieux… ou en tout cas de moins mal !

Par contre dire que ça bouge ça me parait un grand mot, car je vois pas de release depuis la 0.12.5 Releases · wkhtmltopdf/wkhtmltopdf · GitHub
et je sais que chez nous on a été obligé de downgrader en 0.12.3 qui est la dernière avec laquelle on avait des résultats cohérents et corrects.
La 0.12.4 a changé toutes les tailles de polices de nos rendus, et sur la 0.12.5 on perdait les font-face de nos PDF générés.

Donc on arrive à avoir quelque chose de correct, mais c’est pas straightforward, et en effet ça dépend de ton niveau d’exigence.
Nous typiquement on avait clairement annoncé à l’utilisateur que la solution pro et propre c’était PrinceXML, avec un coût associé, et que la solution open source qu’on avait de mieux c’était donc wkhtmltopdf mais que
* de temps en temps la génération PDF peut échouer pour une raison inconnue (et donc il peut contribuer son PDF manuellement dans ces cas là)
* il pourrait pas faire ce qu’il veut sur les maquettes, et qu’on devrait sans doute adapter/simplifier

Cela étant dit, on a donc finalement choisi wkhtmltopdf et on a un rendu correct et en pratique on a pas d’échec de génération (ou alors c’est tellement marginal qu’on en entends pas parler), mais c’est en connaissance de cause.
Ensuite super si il y a une lib wrapper PHP qui facilite le travail, ça peut toujours servir, mais c’est pas le nerf de la guerre ici :frowning:

--
Cédric
Le 14 oct. 2019 à 10:55 +0200, peetdu <peetdu@gmail.com>, a écrit :

Hello

> J'ai réessayé récemment WKHTMLTOPDF qui s'appuie sur le moteur webkit de
> Safari, et j'ai pu voir qu'on obtenait de très bon résultats, d'où mon
> choix.

Pour info : je viens de voir que cela bouge du coté de WKHTMLTOPDF

Où il est effectivement confirmé que d'autres pensent la même chose, à
savoir que WKHTMLTOPDF est effectivement une lib excellente :

Voir
Top 5 : Best open source PDF generation libraries for PHP | Our Code World

…et le lien qui nous intéresse plus particulièrement ici :
GitHub - KnpLabs/snappy: PHP library allowing thumbnail, snapshot or PDF generation from a url or a html page. Wrapper for wkhtmltopdf/wkhtmltoimage.

Si je comprend bien, Snappy permettrait de lancer depuis une interface
Web la génération de PDF sur la base de la lib WKHTMLTOPDF ?

P

----
spip-zone@rezo.net - https://listes.rezo.net/mailman/listinfo/spip-zone

Le 14/10/2019 à 11:15, RastaPopoulos a écrit :

Les seules qui sortaient du lot c'était
- PrinceXML, la référence, pas libre du tout, qui gère en gros 100% (à
la fois CSS3 et tous les trucs complexes propres au print)
- Weasy, qui est libre, en python, et qui gérait le plus de choses dans
les trucs libres

J'étais tombé sur ce projet, en node.js, qui semble toujours actif (mais pas testé du tout)

Depuis les crédits techniques de ce mémoire :

--
nicod_

Le 14/10/2019 à 11:32, Cerdic a écrit :

Par contre dire que ça bouge ça me parait un grand mot

Héhé…oui je me suis peut être emporté sur le moment.

Pour conclure, voici un article récent de Smashing Magazine (19 juin 2019 - en anglais) qui fait un état des lieux clair et intéressant sur "Comment créer un PDF depuis une appli Web".

Voir How To Create A PDF From Your Web Application — Smashing Magazine

tschuss

Le 16/10/2019 à 11:09, peetdu a écrit :

Pour conclure, voici un article récent de Smashing Magazine (19 juin
2019 - en anglais) qui fait un état des lieux clair et intéressant sur
"Comment créer un PDF depuis une appli Web".

Voir How To Create A PDF From Your Web Application — Smashing Magazine

Et donc à propos de WKHTML elle dit très clairement exactement ce que je
disais :

Unfortunately, however, you will still run into the same problems as when printing directly from the web browser in terms of lack of support for the Paged Media specification

Avec cette lib, c'est juste un navigateur sans interface, ça ne gère
aucune des règles complexes propre au print de la spécification
officielle. Ça suffit juste à un layout super basique.

Et :

A free alternative, which is not quite as comprehensive as the above tools but may well achieve the results you need, is WeasyPrint. It doesn’t fully implement all of Paged Media, however, it implements more than a browser engine does. Definitely, one to try!

In the case that you would like more Paged Media support, but are not in a position to go for a commercial product, perhaps take a look at WeasyPrint.

Voilà voilà, tout pareil. :slight_smile:

--
RastaPopoulos