vendredi, décembre 22 2006

Le PDF du manuel 8.2.0 de PostgreSQL enfin disponible

Il m'aura donné du fil à retordre, le bougre.

En tentant de le générer, fop ajoutait des pages et des pages sans jamais s'arrêter. La version 8.1.5 tient sur environ 1200 pages. Après 20000 pages, fop continuait la génération de la version 8.2.0. Un petit Ctrl-C l'a calmé mais le PDF n'était pas généré. Seul message bizarre : « [INFO] No spaces to justify text in line » en très, très grand nombre. Évidemment, impossible de savoir comme cela dans quel fichier se posait le problème.

Conseil très sérieux : si vous générez un PDF à partir de plusieurs fichiers XML, réduisez la génération à quelques fichiers. Procédez par dichotomie. C'est ainsi que je me suis aperçu que le fichier coupable était func.xml. Le message d'erreur plus haut indique généralement que fop n'a pas suffisament de place pour intégrer le texte dans l'espace donné. Généralement, c'est dû à un tableau mal dimensionné. Cela n'a pas de conséquence fâcheuse habituellement. Comme func.xml comprend de nombreux tableaux, il y avait de fortes chances que l'un d'entre eux posait problème. Là encore, procédez par dichotomie.

J'ai réussi à isoler le tableau qui posait problème. J'ai même poussé le vice à isoler la cellule qui causait ce méchant désagrément. Il y avait un nom de fonction que je ne pouvais pas couper. J'ai donc simplement augmenter la taille de la colonne. Et ça passe.

Deux semaines sans PDF à cause d'une colonne trop petite. Je suis ravi d'avoir résolu ce problème mais j'enrage d'avoir perdu tout ce temps.

samedi, mai 20 2006

Des nouvelles du département rajoutons-une-couche-sur-docbook-et-pdf...

Peter Eisentraut voulait que je vérifie l'utilisation de FOP avec une JVM libre. C'est chose faite, ça fonctionne sans problème. En fait, libgcj était déjà installé sur ma Kubuntu. J'ai donc modifié l'emplacement pointé par la variable d'environnement JAVA_HOME et lancé un make pdf... si ce n'est le manque de la bibliothèque de rendu des images, j'ai obtenu mon PDF. J'ai ajouté JAI pour intégrer les images mais ce fut une mauvaise expérience... un beau plantage à la fin. Je suis donc passé à Jimi qui a rempli le boulot sans sourciller.

Maintenant, j'essaie de générer un document pour débutant, style « Précis et concis », avec la page d'installation et les références. Je tente le format A6 mais, même avec un format si petit (1/4 de A4), j'obtiens plus de 300 pages. Pas vraiment concis :)

lundi, mai 1 2006

Césure et alignement

J'avais quelques soucis avec fop lorsque je voulais qu'il utilise la césure. Il ne trouvait pas un fichier pour la césure française. Cette discussion m'a mis sur la piste. En fait, il faut télécharger un fichier jar supplémentaire. Ce fichier est proposé par un projet sourceforge nommé offo. Comme l'indique la page d'installation, il faut télécharger ce paquet, le décompresser et déplacer le fichier jar (fop-hyph.jar) dans $FOP_HOME/lib.

Une fois ceci intégré et l'option de césure activée (<xsl:param name="hyphenate">true</xsl:param>), j'ai pu générer le manuel PostgreSQL en PDF et avec césure. J'ai testé deux versions :

Je n'arrive pas à me décider sur le bon. L'alignement à gauche fait que ce n'est pas aligné à droite, ce qui est moche. Le justifié est bien aligné à gauche comme à droite mais me change la taille des espaces ce qui est très moche dans les tableaux. Et je ne sais même pas ce que demande la typographie française.

jeudi, avril 20 2006

/me persiste et persévère

J'ai continué mes investigations hier soir avec un furieux doute en tête : comment se fait-il que fop ne semble pas impacté par la mémoire que je lui alloue ? Comme indiqué dans la page FOP sur BLFS, j'ai créé un fichier .foprc et placé dedans une initialisation de FOP_OPTS. J'alloue une grande valeur (-Xmx128m), j'ai mon message « out of memory » à la page 252. J'alloue une plus grande valeur, même message au même endroit. J'alloue une valeur ridiculement petite, idem. Bref, gros doute sur ma façon de configurer le bazar.

Dans tous les documents que j'ai pu parcourir, il est fait référence à un wrapper nommé fop.sh. Rien de tel sur ma Debian évidemment. Pourtant, tout semblait bien installé. En fait, dernièrement, le wrapper s'appelle fop. En l'ouvrant, je me rend compte qu'il utilise la variable JAVA_OPTS... un petit export JAVA_OPTS avec une valeur convenable et ça fonctionne tout de suite beaucoup mieux... mais ça plante encore, page 353.... grmbl. Message d'erreur : -2. Un peu court, jeune homme :) L'option -d me donnera plus d'infos mais cela restera quand même incompréhensible.

On me propose d'essayer la version beta de fop (version 0.91beta). Je télécharge, j'installe, je relance fop. Le résultat est bien pire : aucune page générée, une erreur aussi incompréhensible. fevrier m'apprend que le message d'erreur est dû à l'utilisation d'extensions propriétaires spécifiques à fop 0.20.5 lors de la génération du fichier .fo. Je regénère sans cette extension. J'ai d'autres erreurs, toutes aussi incompréhensibles. J'en ai marre...

J'ai aussi essayé html2ps suivi d'un ps2pdf... aucun problème, ça fonctionne rapidement et directement mais le résultat est vraiment moche.

Bon, reprenons calmement avec LFS et essayons de générer un HTML et un PDF propre. Ensuite, je retournerai au manuel de PostgreSQL.

mercredi, avril 19 2006

Suite de mes aventures dans le beau monde de XSLT et FOP

J'ai fini par comprendre le problème de l'erreur du make pdf d'hier. Voici comment je suis arrivé à générer un PDF avec fop...

Le fichier .fo généré par xsltproc est un peu bordélique. J'ai donc commencé par ranger les balises une par une avec la commande sed suivante :

sed 's/>/>
/g' lfs-pdf.fo > lfs-pdf2.fo

L'erreur étant internal-destination or external-destination must be specified in basic-link, j'ai recherché tous les basic-link du fichier .fo :

grep "basic-link" lfs-pdf2.fo

ce qui me donne à peu près ceci

[... j'en coupe une grosse partie ...]
<fo:basic-link internal-destination="ch-system-pwdgroup">
</fo:basic-link>
<fo:basic-link internal-destination="ch-system-man-pages">
</fo:basic-link>
<fo:basic-link internal-destination="">
description</fo:basic-link>

Le dernier internal-destination est bien vide. Comme il ne contient rien de bien intéressant, j'ai supprimé toute la cellule, à savoir les lignes suivantes :

<fo:table-cell>
<fo:block>
<fo:basic-link internal-destination="">
description</fo:basic-link>
</fo:block>
</fo:table-cell>

La génération ne pose plus aucun problème ! J'ai un superbe PDF pour LFS que vous pouvez voir sur le site de la traduction de LFS (superbe dans le sens joli et utilisable... en effet, les liens sont disponibles, les numéros de page sont exacts... un vrai bonheur). Très content, je me suis mis en tête de faire celui du manuel de PostgreSQL. Je modifie un peu le script Makefile pour tenir compte des spécificités de ce manuel. Malheureusement, j'obtiens une erreur bien gênante :

Exception in thread "main" java.lang.OutOfMemoryError

Y compris après avoir modifié FOP_OPTS pour lui donner 1 Go de mémoire, rien à y faire, il s'arrête à la page 252.

Google me dit gentiment de changer de processeur FO... mouais, me suis déjà embêté à installer celui-là. Les autres sont soit propriétaires soit non disponibles via apt-get... pfff. Je testerais ce soir la génération d'un fichier HTML complet que je balancerais à html2ps, puis ps2pdf.