2017-10-12 5 views
1

J'ai un pdf remplissable avec des champs qui doivent être remplis par l'utilisateur. J'essaie de générer automatiquement des réponses pour ces champs avec python, mais j'ai besoin de connaître la largeur/longueur des champs de formulaire afin de savoir si mes réponses rentreront dans le champ.Trouver la largeur du champ de formulaire pdf en python

Comment puis-je trouver la largeur de ces champs, ou au moins tester si une réponse possible va s'adapter? Je pensais que si je connaissais la police et la taille de police du champ, cela pourrait aider. Edit: Je viens de me rendre compte que le pdf est crypté, donc l'interface avec le pdf d'une manière programmatique peut être impossible. Toutes les suggestions pour une solution rapide et sale sont les bienvenues.

Lien vers le formulaire: http://static.e-publishing.af.mil/production/1/af_a1/form/af910/af910.pdf

Je dois connaître la largeur des blocs de commentaires.

+0

Pourriez-vous montrer à quoi ressemble le formulaire? Aussi utilisez-vous PyPDF? – Worm

+0

Combien de champs doivent être remplis par l'utilisateur? – Worm

+0

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

Répondre

0

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. :)

+0

La limite de champ n'est pas en caractères. Après avoir regardé la page 444 de cette référence que vous avez liée, je crois que le drapeau DoNotScroll est activé. Cela limite la taille du champ dans l'espace mais pas dans les caractères, donc WWW occupe plus de place que iii. – SlicedBadge

+0

@SlicedBadge Intéressant, pourriez-vous télécharger un de ces PDF quelque part et partager un lien de téléchargement? – GBlomqvist

+1

C'est une forme commune de l'armée de l'air. J'ai ajouté un lien dans la description de la question. – SlicedBadge