David Madore's WebLog: J'aimerais bien comprendre d'où viennent tous ces PDF cassés

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]

↓Entry #2543 [older| permalink|newer] / ↓Entrée #2543 [précédente| permalien|suivante] ↓

(mercredi)

J'aimerais bien comprendre d'où viennent tous ces PDF cassés

(Attention, râlerie !)

Tout le monde utilise le format PDF. Sur le principe, c'est une bonne idée : un format standardisé de documents sous forme vectorielle, c'est exactement ce dont on a besoin pour échanger des documents pré-formatés et prêts à être imprimés. Sauf qu'en fait, comme souvent dans le monde de l'informatique, il y a un truc qui est censé être un standard, et il y a, en fait, mille et une façons de l'interpréter, mille et une façons dont un document peut être rendu, et mille et une petites crottes de ragondin qui viennent tout compliquer. J'imprime mes PDF typiquement avec les programmes evince, xpdf ou okular, je suppose que, Unix étant Unix, les documents sont convertis douze fois en PostScript et de nouveau en PDF à travers les entrailles incompréhensibles de GhostScript, de CUPS, du système d'impression centralisé mis en place à Télécom ParisPloum, et enfin du photocopieur multifonction qui sert d'imprimante dans mon couloir (et qui accepte certainement les PDF directement, mais ce serait trop simple si on pouvait juste les lui envoyer !).

Par exemple, dès que j'imprime une page contenant de la transparence, comme le format PDF supporte la transparence mais pas le format PostScript (et je ne comprends pas pourquoi on n'a pas juste décidé en fait, si, les mécanismes de transparence de PDF sont rétroactivement déclarés valables en PostScript, ce qui aurait tout simplifié), quelque part dans ces entrailles incompréhensibles, un programme décide que hum, je ne peux pas fabriquer un PostScript avec de la transparence, ce n'est pas possible !, rasterisons ça en image bitmap à la place, et la page sort à l'impression complètement différente du reste du document, et beaucoup plus moche. (J'aimerais bien trouver comment lui dire bordel, produis un PostScript contenant de la transparence, ou passe par le format PDF tout du long puisque l'imprimante le supporte, ou à la limite, démerde-toi pour que la rasterisation produise un résultat parfaitement indiscernable à l'œil nu si elle est fait à ton niveau ou plus bas dans la chaîne, mais en tout cas, arrange-toi pour que les pages ayant de la transparence dans le PDF ne s'impriment pas différemment des autres ! ; mais ce n'est pas tellement ça l'objet de ma râlerie aujourd'hui.)

Parfois mes documents s'impriment à l'envers ou sont agrafés au mauvais endroit ou autre bug bizarre : pendant longtemps, tous les documents PDF que je récupérais de l'arXiv étaient imprimés avec la première page à l'envers (et juste la première page), certainement à cause du numéro que l'arXiv appose sur le côté de la première page, mais je ne comprends pas le rapport exact de cause à effet ; à un autre moment, tous les PDF que j'imprimais recto-verso n'étaient recto-verso qu'à partir de la page 2, la page 1 s'imprimant toujours seule sur une page (et du coup, la parité des pages était cassée). Bref, toutes sortes de bugs incompréhensibles, que j'ai tendance à mettre sur le dos du format PDF.

Mais parmi ces bugs, il y en a un que je rencontre particulièrement souvent. Il semble apparaître sur des PDF issus de vieilles versions de TeX, ou de vieilles sources, ou quelque chose de ce goût. J'en ai un exemple avec cet article (cliquez sur PDF dans la colonne download à droite). Selon l'outil que j'utilise pour lire ce PDF, soit c'est très lent, soit c'est très moche, soit il me crache des bordées d'injures. Notamment, xpdf, quand je lis un tel PDF, affiche des quantités énormes de lignes Syntax Warning: Bad bounding box in Type 3 glyph, ce qui donne une petite idée de ce qui se passe (les polices de Type 3 sont les polices PostScript/PDF les plus générales, celles qui peuvent contenir n'importe quelles commandes PostScript, et je suppose qu'elles sont générées par pdfTeX ou je ne sais lequel des mille et un mécanismes de conversion d'un fichier TeX en PDF — parce que ce serait Trop Facile s'il y en avait un seul — lorsque la police n'existe pas au format vectoriel compatible PDF et qu'il faut faire appel à Metafont pour générer des polices bitmap ; et une bounding box incorrecte doit signifier que la police déclare des métriques qui sont incompatibles avec ce qu'elle contient réellement ; mais ce que tout ça ne m'explique pas, c'est comment on s'est retrouvé à produire des polices Type 3 ayant une bounding box incorrecte ni, a fortiori, comment réparer ce problème).

Et un des symptômes de ce phénomène de fichiers PDF bizarrement cassés, c'est que parfois, quand on les manipule, tous les signes moins disparaissent. Par exemple, si je prends le PDF que j'ai donné ci-dessus comme exemple, et que je le passe par pdftocairo -pdf (qui est censé transformer un PDF en un PDF absolument identique, mais parfois ça aide à nettoyer des problèmes périphériques au format PDF), à la page 2, vers le milieu de la 4e ligne du dernier paragraphe, où on est censée lire the first i−1 induction steps, le texte devient the first i 1 induction steps (le signe moins disparaît complètement, quoi).

J'aimerais bien comprendre comment une merde de ce genre est possible. Je devine que le problème est lié au fait que la bounding box du signe moins est très peu haute, peut-être même de hauteur nulle (ce qui serait évidemment un bug en soi : aucun caractère visible ne peut avoir une boîte de taille nulle), mais ça ne m'explique pas comment ce problème est apparu pour commencer. Si le format PDF était bien foutu, ça devrait être possible de dire avec clarté soit que le fichier PDF distribué par l'arXiv est cassé (i.e., le programme qui l'a produit est cassé), soit que pdftocairo l'est, mais en tout cas que l'un d'entre eux doit être réparé. Mais je soupçonne que le format n'est pas assez bien défini pour qu'on puisse dire qui est coupable (et c'est peut-être « les deux »).

Je donne ici l'exemple de pdftocairo, on va me dire, je n'ai qu'à ne pas l'utiliser. Certes, mais il y a toutes sortes d'autres contextes où le même problème se produit. J'ai déjà entendu des histoires de matheux qui ont envoyé des articles à publier et quand le journal est sorti, tous les signes moins manquaient (sur le papier). Ce qui, s'agissant d'un article de maths, est un peu gênant ; et un peu mystérieux parce que ce n'était sans doute pas la première fois que le journal rencontrait un article produit par TeX. Le point commun entre tous les contextes « les signes moins disparaissent » est obscur (voir par exemple ce vieux fil de discussion comp.text.tex, qui n'a visiblement aucun rapport avec pdftocairo). On trouve un bug de ce genre (le même ?) rapporté contre evince dans ce bug-report, qui est censé avoir été corrigé dans Cairo, mais soit la correction n'a pas atteint la version 0.48.0 de pdftocairo que j'utilise, soit c'est encore autre chose (de toute façon, je doute que ce soit le même bug que celui signalé dans le fil comp.text.tex vieux de 17 ans, donc des variantes du même phénomène doivent réapparaître périodiquement).

Mise à jour () : En compilant un cairo récent (version 1.15.12) et un pdftocairo récent (poppler-0.67.0), le problème du signe moins qui disparaît ne se pose plus. (Comme je le dis en commentaire, c'est bien ma veine de tomber sur un bug vieux de vingt ans(?) et de découvrir qu'il est corrigé dans la version juste après celle que j'ai sur mon PC…) Ça ne m'empêche pas de penser que ce PDF est foireux (ou alors que les polices bitmap sont vraiment très mal gérées par tous les programmes que j'ai), ne serait-ce que compte tenu de la lenteur de l'affichage et de la laideur du résultat à l'écran : c'était peut-être un bug de pdftocairo de ne pas reproduire les caractères ayant une bounding box nulle, mais c'est aussi un bug du document si des caractères non vides ont une bounding box nulle.

Et surtout, j'aimerais bien savoir comment réparer ces PDF tout cassés : comment les transformer en des fichiers qui s'affichent à l'écran, avec tous les programmes que je suis susceptibles d'utiliser, de façon jolie et semblable à ce qui sortira effectivement de l'imprimante. (Dans certains cas, j'utilise pdftocairo à cet effet, mais comme je viens d'expliquer, là, ça ne marche pas.) Si c'est la bounding box qui pose problème, est-ce qu'il n'y a pas un outil pour recalculer la bounding box de tous les caractères du PDF, ou pour l'augmenter de 1 ou 2 points  ? (ou, si ça ne suffit pas, la rendre égale à la page tout entière, d'ailleurs). Si j'en juge par l'ancienneté de l'article de l'arXiv vers lequel j'ai fait un lien, ce problème existe depuis au moins 20 ans, c'est impressionnant qu'il continue à poser problème maintenant…

(Merci d'avoir fait semblant d'écouter ma râlerie et merci d'avance de vos témoignages de soutien et de compassion.)

↑Entry #2543 [older| permalink|newer] / ↑Entrée #2543 [précédente| permalien|suivante] ↑

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]