2017-08-07 11 views
0

La semaine dernière, on m'a demandé de créer une application pour un aveugle pour remplir par programme un document PDF. Le problème est que si les champs dans le document ne sont pas étiquetés correctement, il n'est pas capable de mettre sa signature et d'autres informations dans le document au bon endroit.Comment détecter une ligne de signature dans un document PDF, puis insérer une signature?

Ma première approche a consisté à tenter de lire le document à l'aide iTextSharp puis insérez sa signature dans le champ qui était le plus susceptible d'être la boîte de signature:

public string[] MassFieldEdit(IDictionary<string, string> userData, string originalDocument, string edittedDocument, bool flatten) 
     { 
      PdfReader reader = new PdfReader(originalDocument); 
      reader.SelectPages("1-" + reader.NumberOfPages.ToString()); 
      using (PdfStamper stamper = new PdfStamper(reader, new FileStream(edittedDocument, FileMode.Create))) 
      { 
       AcroFields form = stamper.AcroFields; 
       ICollection<string> fieldKeys = form.Fields.Keys; 
       List<string> leftover = new List<string>(fieldKeys); 
       foreach (string fieldKey in fieldKeys) 
       { 
        foreach (KeyValuePair<string, string> s in user) 
        { 
         //Replace Form field with my custom data 
         if (fieldKey.ToLower().Contains(s.Key.ToLower())) 
         { 
          form.SetField(fieldKey, s.Value); 
          leftover.Remove(fieldKey); 
         } 
        } 
       } 
       //The below will make sure the fields are not editable in 
       //the output PDF. 
       stamper.FormFlattening = flatten; 
       return leftover.ToArray(); 
      } 
     } 

Cela fonctionne en prenant un ensemble de dictionnaire, la la clé étant un mot ou une phrase, en vérifiant cela par rapport aux champs PDF, puis en insérant la valeur dans les champs si le champ correspond au mot ou à la phrase de la clé.

The signature box before my program edits it.

The signature box after.

Mais le problème que j'ai maintenant que si aucun champ existe alors bien qu'il puisse avoir « signer ici » juste à côté de la ligne pointillée, il n'y a pas moyen d'insérer du texte sur la ligne pointillée sans savoir exactement où est la ligne pointillée, et mon utilisateur ne peut pas sélectionner la ligne pointillée parce que cela vainc le point du programme.

J'ai regardé un certain nombre de questions et de réponses précédentes, y compris:

Honnêtement, je suis coincé, ce c'est la première fois que je travaille avec des documents PDF. J'ai besoin d'un moyen de détecter la ligne de signature, puis insérez son nom sur la ligne de signature avec plus de certitude que de prendre des photos de pot aux noms de champ. Dans les situations où un champ correctement étiqueté existe et aussi dans les situations où la ligne de signature peut être pas plus d'une ligne de texte qui dit "signer ici".

Toute aide sera grandement appréciée, même partielle et poussée dans le bon sens.

+1

Vous avez de la chance si vous obtenez des champs réels et pas seulement une image numérisée . Mais quelle est la source des formes? Déposer une plainte ADA et obtenir les formulaires corrigés. –

+0

Parmi les exemples qu'il m'a envoyés, il y a le TWC Substitute W-9 et Direct Deposit Form et d'autres documents officiels. Je suis à la recherche d'une solution programmatique qui fonctionnera pour tout type de PDF contenant une ligne de signature. J'ai envisagé une approche de la reconnaissance optique des caractères, mais j'aimerais savoir s'il existe déjà une solution avant de me lancer dans cette voie. – Kris

Répondre

1

La solution robuste (alias "solution de travail")

  1. Mettre en œuvre IEventListener (classe iText7)
  2. Utilisez IEventListener pour être averti des instructions de rendu de texte, et les opérations de dessin de ligne
  3. instructions de rendu font n'apparaissent pas toujours dans l'ordre logique (lecture). Résoudre ce problème en mettant en œuvre un comparateur pour ces objets
  4. Classer par comparateur
  5. Utilisation de détection de la langue pour déterminer la langue (approche n-gramme est simple, mais devrait suffire)
  6. attaque dictionnaire.Recherchez toutes les occurrences de mots qui signifient «signer ici» dans la langue dans laquelle le document est écrit (d'où l'étape 5)
  7. En cas de candidats multiples, ou pas de candidats, utilisez des instructions de rendu de ligne pour rechercher un candidat probable du tristement célèbre "pointillé"

Cette approche n'est pas facile, mais il y a beaucoup de recherche sur la reconnaissance des éléments structurels dans les fichiers pdf. En particulier, si vous lancez une recherche google scholar, vous trouverez des articles utiles où les gens ont essayé de détecter des tableaux, des listes, des paragraphes, etc.