J'en ai déjà écrit un (pour des besoins similaires), et je peux dire ceci : Amusez-vous bien. C'est une tâche assez complexe. Le site Spécification PDF est grande et peu maniable. Il existe plusieurs méthodes pour stocker du texte à l'intérieur. Et le comble, c'est que chaque générateur de PDF est différent dans son fonctionnement. Ainsi, alors que quelque chose comme TFPDF ou DOMPDF crée des PDF VRAIMENT faciles à lire (du point de vue de la machine), Acrobat produit des documents vraiment infernaux.
La raison est la façon dont il écrit le texte. La plupart des moteurs de rendu basés sur le DOM - que j'ai utilisés - écrivent la ligne entière comme une seule chaîne de caractères, et la positionnent une seule fois (ce qui est vraiment facile à lire). Acrobat essaie d'être plus efficace (et il l'est) en écrivant seulement un ou peut-être quelques caractères à la fois, et en les positionnant indépendamment. Si cela simplifie VRAIMENT le rendu, cela rend la lecture BEAUCOUP plus difficile.
L'avantage, c'est que le format PDF est en soi très simple. Vous avez des "objets" qui suivent une syntaxe régulière. Vous pouvez ensuite les relier entre eux pour générer le contenu. La spécification fait un bon travail de description du format de fichier. Mais la lecture dans le monde réel va nécessiter un peu de matière grise...
Quelques conseils utiles que j'ai dû apprendre à la dure si vous voulez écrire vous-même :
- Adobe aime remodeler les polices. Ainsi, les caractères
65
ne sera probablement pas A
... Il faut trouver un objet map et en déduire ce qu'il fait en fonction des caractères qu'il contient. Et c'est efficace puisque si un caractère n'apparaît pas dans le document pour cette police, il ne l'inclut pas (ce qui rend la vie difficile si vous essayez d'éditer un PDF par programme)...
- Écrivez-le aussi abstrait que possible. Ecrivez des classes pour chaque type d'objet, et chaque type natif (chaînes de caractères, nombres, etc.). Laissez ces classes analyser pour vous. Il y aura pas mal de répétitions là-dedans, mais vous vous économiserez à la fin quand vous réaliserez que vous avez besoin de modifier quelque chose pour un seul type spécifique)...
- Écrivez pour une ou deux versions spécifiques de la spécification PDF, et appliquez-la. Vérifiez le numéro de version, et s'il est supérieur à ce que vous attendez, renoncez... Et n'essayez pas de "faire en sorte que ça marche". Si vous voulez supporter des versions plus récentes, sortez la spécification et mettez à jour l'analyseur syntaxique à partir de là. N'essayez pas de faire des essais et des erreurs à votre façon (ce n'est pas amusant)...
- Bonne chance avec les flux compressés. J'ai découvert que, typiquement, vous ne pouvez pas faire confiance aux arguments de longueur pour vérifier ce que vous décompressez. Parfois (pour certains générateurs) cela fonctionne bien... D'autres fois, il y a une erreur d'un ou plusieurs octets. J'essaie juste de le déflater si le filtre correspond, et ensuite je force la longueur...
- Lorsque vous testez des longueurs, n'utilisez pas
strlen
. Utilisez mb_strlen($string, '8bit')
car il compensera les différents jeux de caractères (et autorisera des caractères potentiellement invalides dans d'autres jeux de caractères).
Sinon, bonne chance...