Après quelques recherches rapides autour des fichiers PDF et one of Adobe's pdf references (source) il se trouve qu'un champ de texte peut avoir une clé « MaxLen » dont la valeur est un nombre entier représentant la longueur maximale du texte du champ, en caractères (Voir page 444 dans la référence mentionnée). Il semble que si aucune clé n'est présente, il n'y a pas de longueur maximale. Ce que l'on pourrait alors faire, c'est simplement de chercher le fichier pdf pour les clés "MaxLen" (si plusieurs champs de texte, sinon vous pouvez juste en chercher un) et renvoyer leurs valeurs. Par exemple:
import re
with open('your_file.pdf', 'r', errors='ignore') as pdf_file:
content = pdf_file.read()
# Matches every substring "n" (n is an integer) with a preceding "/MaxLen "
regexp = '(?<=\/MaxLen)\d+'
max_lengths = [int(match) for match in re.findall(regexp, content)]
(.. Si le fichier est énorme, vous ne pouvez pas être en mesure de lire tout en mémoire à la fois Si tel est le cas, la lecture ligne par ligne pourrait être une solution)
max_lengths sera alors une liste de toutes les valeurs "MaxLen", ordonnées après apparition dans le fichier (la première occurrence sera la première, etc.). Toutefois, en fonction de ce dont vous avez besoin, vous devrez peut-être poursuivre votre recherche et ajouter d'autres conditions à mon code. Par exemple, si un fichier contient plusieurs champs de texte mais pas tous une longueur maximale, vous ne pouvez pas savoir quelle longueur correspond à quel champ. En outre, si un fichier PDF a été modifié et enregistré (sans utiliser "Enregistrer sous"), les modifications seront ajoutées à l'ancien fichier au lieu de l'écraser complètement. Je ne sais pas exactement comment cela fonctionne, mais je suppose que cela pourrait vous faire obtenir les longueurs max des champs précédemment supprimés, etc. si vous ne faites pas attention et vérifiez cela.
(Travailler avec les pdf de cette façon est très nouveau pour moi, s'il vous plaît corrigez-moi si je me trompe à propos de quoi que ce soit.Je ne dis pas qu'il n'y a pas de bibliothèque qui peut faire cela pour vous. sera probablement plus avancé.)
Mise à jour 23-10-2017
Je crains que le problème est devenu beaucoup plus difficile. Je crois que vous devriez toujours être en mesure de déduire la largeur des champs de texte en analysant les bonnes parties du fichier pdf. Pourquoi? Parce que le logiciel d'Adobe peut le rendre correctement (au moins Adobe Acrobat Pro DC) sans nécessiter de mot de passe pour le déchiffrer en premier. Le problème est que je ne connais pas comment pour l'analyser. Creuser assez profondément et vous pouvez découvrir, ou non.Je suppose que vous pouvez résoudre le problème de manière graphique, en ouvrant chaque pdf avec un visualiseur qui peut les lire correctement, puis en mesurant la largeur des champs de texte. Mais, ce serait assez lent et je ne suis pas sûr de savoir comment vous allez reconnaître les champs de texte. Cela n'aide pas que les formulaires n'utilisent pas une police à espacement fixe, mais c'est un problème plus petit qui peut être résolu (trouver la police utilisée par les champs de texte, rechercher la largeur de tous les caractères de cette police) et utilisez cette information dans vos calculs).
Si vous parvenez à résoudre le problème, s'il vous plaît partager. :)
Pourriez-vous montrer à quoi ressemble le formulaire? Aussi utilisez-vous PyPDF? – Worm
Combien de champs doivent être remplis par l'utilisateur? – Worm
Il y a 4 champs qui doivent être remplis, mais ils ont tous la même largeur, donc j'ai juste besoin de la longueur sur un. Je n'ai pas utilisé PyPDF, mais je n'ai pas besoin du script pour entrer directement dans le PDF. J'ai juste besoin d'une chaîne qui va copier et coller et s'adapter sur le terrain. – SlicedBadge