Page 1 sur 1

Une alternative à HTMLDOC ?

Posté : 17 nov. 2008, 18:24
par caroube
Bonjour,

Pour générer rapidement des documents PDF, j'utilise HTMLDOC. Comme son nom ne l'indique pas, c'est un logiciel qui prend en entrée un fichier HTML et ressort un fichier PDF. C'est peut-être moins souple que FPDF, mais c'est beaucoup plus facile pour produire rapidement des documents un peu lourds ou complexes. Par exemple, pas besoin de s'amuser à recalculer les tailles des tableaux puisque c'est le HTML qui le fait.

Avantage : c'est un exe, d'où une grande rapidité d'exécution (2 à 3 secondes pour générer un PDF de 800 pages) à partir d'une extraction de base de données et mise en forme en HTML. En plus il est accessible en ligne de commande, ce qui est nickel pour le déclencher depuis PHP.

Seul bémol de ce logiciel, c'est qu'il ne prend pas en compte les feuilles de style (peut-être qu'une prochaine version le fera - partiellement en plus - mais on ne sait pas quand elle sortira).

J'ai de plus en plus de documents HTML saisis par les utilisateurs sous FCKEditor (ou sous d'autres éditeurs Wysiwyg). Et là, problème : les feuilles de style ne sont pas utilisées et les documents imprimés sont plutôt moches.

J'essaye de trouver des solutions utilisables à partir de PHP pour faire cette génération de PDF. J'ai trouvé des trucs en ASP ou interfaçables avec de l'ASP ou online en ASP (par exemple http://www.pdfonfly.com/create-pdf.asp) , mais rien de bien sérieux pour le PHP.

Est-ce que vous connaissez un produit (même payant) qui permet de rendre comme il faut ce genre de tableau avec les couleurs, les fonds grisés, les bordures, .... Par exemple, PDFonFly (ASP) le fait parfaitement.

Code : Tout sélectionner

<table style="BORDER-COLLAPSE: collapse" height="129" cellspacing="0" cellpadding="0" width="514" border="1" bordercolor="black" x:str=""> <colgroup><col style="WIDTH: 74pt" width="99"></col><col style="WIDTH: 49pt" width="65"></col><col style="WIDTH: 35pt" width="46"></col><col style="WIDTH: 48pt" width="64"></col><col style="WIDTH: 32pt" width="42"></col><col style="WIDTH: 35pt" width="46"></col><col style="WIDTH: 29pt" width="39"></col><col style="WIDTH: 35pt" width="46"></col><col style="WIDTH: 29pt" width="38"></col><col style="WIDTH: 29pt" span="2" width="39"></col><col style="WIDTH: 35pt" width="46"></col><col style="WIDTH: 29pt" width="38"></col><col style="WIDTH: 35pt" width="46"></col></colgroup> <tbody> <tr style="HEIGHT: 15pt" height="20"> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; WIDTH: 74pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: silver" width="99" height="20"><font face="Trebuchet MS" color="#800000" size="2"><strong><em> </em></strong></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext; WIDTH: 49pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="65"><font face="Trebuchet MS" color="#800000" size="1"><strong><em> </em></strong></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext; WIDTH: 83pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="110" colspan="2"><font face="Trebuchet MS" color="#800000" size="1"><strong><em>France</em></strong></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext; WIDTH: 67pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="88" colspan="2"><font face="Trebuchet MS" color="#800000" size="1"><strong><em>Région</em></strong></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext; WIDTH: 64pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="85" colspan="2" x:num=""><font face="Trebuchet MS" color="#800000" size="1"><strong><em>27</em></strong></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext; WIDTH: 58pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="77" colspan="2" x:num=""><font face="Trebuchet MS" color="#800000" size="1"><strong><em>12</em></strong></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext; WIDTH: 64pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="85" colspan="2" x:num=""><font face="Trebuchet MS" color="#800000" size="1"><strong><em>57</em></strong></font></td> <td style="BORDER-RIGHT: black 1pt solid; BORDER-TOP: windowtext 1pt solid; BORDER-LEFT: windowtext; WIDTH: 64pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="84" colspan="2" x:num=""><strong><em><font face="Trebuchet MS" color="#800000" size="1">88</font></em></strong></td> </tr> <tr style="HEIGHT: 15pt" height="20"> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 1pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: silver" height="20"><font face="Trebuchet MS" size="1"> </font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; WIDTH: 49pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="65"><font face="Trebuchet MS" size="1">Définition</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Etab.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Eff.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Etab.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Eff.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Etab.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Eff.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Etab.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Eff.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Etab.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Eff.</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Etab.</font></p> </td> <td style="BORDER-RIGHT: windowtext 1pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver"> <p align="right"><font face="Trebuchet MS" size="1">Eff.</font></p> </td> </tr> <tr style="HEIGHT: 30pt" height="40"> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 1pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 30pt; BACKGROUND-COLOR: white" height="40"><font face="Trebuchet MS" size="1">Insee</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; WIDTH: 49pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" width="65"><font face="Trebuchet MS" size="1">NES 16 :  EG<sup>1</sup></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right" x:num="10702"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right"><font size="1">659</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right" x:num="3041"><font size="1">246</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right" x:num=""><font size="1">82</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right" x:num="4434"><font size="1">203</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right" x:num=""><font size="1">128</font></td> <td style="BORDER-RIGHT: windowtext 1pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: white" align="right"><font size="1"></font></td> </tr> <tr style="HEIGHT: 15.75pt" height="21"> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 1pt solid; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: silver" height="21"> <p align="left"><font face="Trebuchet MS" size="1">SESSI</font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; WIDTH: 49pt; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" width="65"> <div align="left"></div> <p align="left"><font face="Trebuchet MS" size="1">NES 16 :  EG<sup>1</sup></font><font face="Trebuchet MS" size="1"> <br /> </font></p> </td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1">2 716</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1">209 857</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1">160</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1">6 939</font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> <td style="BORDER-RIGHT: windowtext 1pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: silver" align="right"><font size="1"></font></td> </tr> </tbody> </table>

Posté : 18 nov. 2008, 00:04
par albat
Ne trouves-tu pas que ton code est illisible ? :shock:
L'intérêt des CSS, c'est non seulement de séparer le contenu de la mise en forme
mais aussi de factoriser intelligemment les styles pour éviter de pondre du code à rallonge.
<style>
td { border-right: windowtext 0.5pt solid; border-top: windowtext; border-LEFT: windowtext; border-bottom: windowtext 1pt solid; background-color: silver ; }
</style>
Et c'est quoi, ce "windowtext" ?

Posté : 18 nov. 2008, 11:01
par phoeniix07
Je pense que phpdoc n'accepte pas les css.

Ca donne un truc vraiment dur a lire !

Posté : 18 nov. 2008, 12:24
par caroube
Ne trouves-tu pas que ton code est illisible ?
Ce n'est pas "mon" code, c'est du code généré par un de mes utilisateurs avec FCKEditor (essentiellement des compte-rendus de réunion ou des documents préparatoires saisis dans un système online), peut-être même copié à partir de Word. Du code comme ça, j'en ai environ 200 à 300 pages par jour, générées par des dizaines d'utilisateurs différents. Et je n'ai pas les ressources nécessaires pour m'amuser à mettre en conformité ces dizaines de milliers de lignes HTML. D'autant plus qu'elles s'affichent tout à fait correctement dans des browsers tels qu'IE ou Firefox. Maintenant, il faut juste trouver le moyen que ce qui est "beau" à l'écran (ou du moins lisible) le soit également sur un document PDF avec un fond de page, un entête, un bas de page, une numérotation, ... Tout ça, c'est OK : c'est juste ce morceau de code HTML dont je veux que la sortie PDF soit la même que la sortie à l'écran.

Je rappelle donc le but de ma demande : trouver un outil qui permette de générer un fichier PDF qui prenne en compte ce code HTML (même s'il est pourri) qui contient des éléments CSS aussi bien que les browsers IE ou FF.
Je pense que phpdoc n'accepte pas les css.
Pour moi phpdoc, c'est un système de documentation en ligne comme javadoc. Je ne vois pas bien le rapport.

Posté : 19 nov. 2008, 22:17
par phoeniix07
erreur de frappe je parlé de htmldoc !

Posté : 20 nov. 2008, 02:47
par Calimero
Je pense que tu en demande beaucoup. FPDF a l'avantage d'avoir un support partiel de CSS qui peut peut-être te suffire... Tu le connais déjà, mais l'as-tu essayé ?

Une autre alternative à considérer serait de passer par un traitement de texte (style Word ou OOWriter) ou pourquoi pas un browser + une imprimante PDF...

Posté : 20 nov. 2008, 13:22
par caroube
erreur de frappe je parlé de htmldoc !
OK.
J'envoie un message où je demande si vous connaissez une alternative à HTMLDOC parce qu'il ne gère pas les CSS et tu me réponds que HTMLDOC ne gère pas les CSS. Merci pour ta réponse.
Je pense que tu en demande beaucoup.
Il existe des outils qui permettent de transformer une page HTML/CSS en PDF. Ces outils existent en ASP. Le support de HTMLDOC me dit que ce sera dans leur prochaine version, mais est incapable de me fournir une date, même approximative. Donc, non, je n'ai pas l'impression de demander l'impossible.
FPDF a l'avantage d'avoir un support partiel de CSS (...) Tu le connais déjà, mais l'as-tu essayé ?
Je connais et j'ai déjà utilisé FPDF pour créer des documents. Et c'est justement pour éviter cette galère de mise en page à base de positionnement (X,Y), de gestion de hauteur de ligne, ... que je me suis tourné vers des solutions plus rapides de génération de PDF à partir de code HTML.
En particulier pour la génération de tableaux. Parce qu'il y a un truc que fait bien HTML : c'est la largeur automatique des colonnes d'un tableau en fonction du contenu. Je n'ai rien trouvé de pareil dans FPDF, ni dans PDFLib.

Mais, comme je ne connais pas tout, peux-tu m'expliquer ce que tu entends par FPDF supporte CSS. Est-ce que tu as un lien qui explique comment transformer du HTML en PDF avec FPDF ? Je suis preneur.
browser + une imprimante PDF...
Idem. Si tu as une solution à base de browser et d'imprimante PDF téléguidable à partir de PHP, je suis preneur.

Posté : 20 nov. 2008, 15:06
par Calimero
Mais, comme je ne connais pas tout, peux-tu m'expliquer ce que tu entends par FPDF supporte CSS. Est-ce que tu as un lien qui explique comment transformer du HTML en PDF avec FPDF ? Je suis preneur.
Je me suis un peu embrouillé dans les noms, je pensais à ceci (basé sur FPDF) : http://html2pdf.fr/
Idem. Si tu as une solution à base de browser et d'imprimante PDF téléguidable à partir de PHP, je suis preneur.
Pas de solution clé en main, c'est une piste de recherche vu que tu es exigeant sur le résultat. Il existe sous windows des pseudo-imprimantes PDF qui, me semble t-il, donnent de bons résultats. Reste à établir l'envoi de données vers cette imprimante (choix d'un moteur de rendu) et automatiser le tout via PHP.

Posté : 21 nov. 2008, 12:25
par caroube
Pour ceux que ça intéresse, un outil en ligne de commande (donc qu'on peut lancer à partir de PHP), mais uniquement sous Windows pour générer du PDF à partir de HTML avec des feuilles de styles

http://www.verypdf.com/htmltools/html-tools.html

400$, mais à mon avis, ça coûte beaucoup moins cher que de se taper la génération à la main.