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.
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:
- How do I get a TextField from AcroFields using iText/Sharp?
- How to convert PDF to WORD in c#
- Insert text in existing pdf with itextsharp
- ITextSharp insert text to an existing pdf
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.
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. –
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