3 votes

Apache FOP peut-il être utilisé pour convertir un HTML arbitraire en PDF ?

J'ai essayé d'utiliser Apache FOP pour convertir du HTML en PDF. ( HTML -->XHTML--> XSL-FO --> PDF). J'ai utilisé le xhtml2fo.xsl d'Antenna House pour la conversion xhtml --> XSL-FO.

Il fonctionne pour les simples fichiers html.

Elle le fait no fonctionne pour les fichiers html avec du style (via css intégré ou par attribut de style). Un PDF est créé mais complètement non formaté. J'essaie de convertir un fichier HTML pour lequel je n'ai pas beaucoup de contrôle sur le style/contenu.

Créer un xslt pour chaque html n'est pas pratique dans mon cas d'utilisation.

Actuellement, j'ai une implémentation qui fonctionne avec flyingsaucer. Cependant, l'exigence demande une implémentation sans licence AGPL.

Ma question est la suivante : peut-on y parvenir avec FOP ?

J'apprécie toute aide

2voto

lfurini Points 2893

version abrégée :

Dans la situation la plus générale, pas de vous ne pouvez pas utiliser le FOP pour convertir tout html en conservant les styles originaux (et changer de formateur ne résoudrait pas le problème).

Cependant, vous pouvez utiliser FOP (ou tout autre formateur) pour essayer de traiter raisonnablement bien un grand sous-ensemble de documents html ; cela pourrait nécessiter quelques ajustements XSLT.


Pourquoi cela ne peut pas fonctionner en général

HTML --> XHTML --> XSL-FO --> PDF

Votre description de la chaîne de transformation nécessaire est pertinente.

Cependant, Le FOP n'est impliqué que dans la dernière étape à l'exception des fonctionnalités qui ne sont pas encore mises en œuvre, le fichier PDF final doit respecter les caractéristiques typographiques exprimées dans le fichier FO.

J'ai utilisé le xhtml2fo.xsl d'Antenna House pour la conversion xhtml --> XSL-FO. [...]

Un PDF est créé, mais il n'est pas du tout formaté.

Est-ce que la feuille de style que vous utilisez celui-ci provient du site AntennaHouse ?

D'après un rapide coup d'œil, il semble que devrait convertir le style="..." produisant des attributs séparés dans la sortie FO, mais il ne traite pas les fichiers CSS externes .

En conséquence, les fichiers HTML stylisés avec des CSS externes seront transformés en fichiers FO sans aucun attribut de formatage ( font-family , font-size , text-align , ...).

Peut-on y parvenir avec le FOP ?

Si c'est effectivement le cas, le formateur ne peut rien faire d'autre que utiliser les valeurs par défaut dont quelques-uns ( font-family me vient à l'esprit) dépendent de l'application.

Ainsi, selon le formateur que vous utilisez, vous aurez une légèrement résultat différent, mais toujours "non formaté".

Ce dont vous avez besoin est soit un outil pour "fusionner" les fichiers html et css, en mettant les styles en ligne pour que le XSLT puisse les traiter, soit une feuille de style différente capable de prendre en compte les fichiers css externes (mais je soupçonne qu'il ne serait pas facile d'en écrire une qui fonctionne dans un cas général).

Ce qui peut être réparé avec peu d'efforts

Lors du traitement des tableaux html, le XSLT lié utilise la fonction fo:table-and-caption qui n'est pas pris en charge par FOP, de sorte que les tableaux "disparaissent" de la sortie.

Cela peut être corrigé avec un petit changement dans le XSLT, ou (probablement une solution plus propre) en utilisant une feuille de style personnalisée qui importe l'autre :

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:html="http://www.w3.org/1999/xhtml">

  <xsl:include href="xhtml2fo.xsl"/>

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>

  <xsl:template match="html:table" priority="2">
    <fo:table xsl:use-attribute-sets="table">
      <!-- warning: table caption is not processed! -->
      <xsl:call-template name="process-table"/>
    </fo:table>
  </xsl:template>

</xsl:stylesheet>

Il est possible que la feuille de style que vous utilisez actuellement nécessite quelques ajustements similaires pour mieux fonctionner en conjonction avec FOP.

Divulgation : je suis un développeur FOP, bien que je ne sois plus très actif aujourd'hui.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X