2017-08-07 43 views
0

上周我被要求为一个盲人构建一个应用程序,以编程方式填写一份PDF文档。他遇到的问题是,如果文档中的字段没有正确标记,那么他无法将他的签名和其他信息放在正确位置的文档中。如何检测PDF文档中的签名行,然后插入签名?

我的第一种方法是尝试使用iTextSharp的阅读文档,然后将他的签名改成这是最有可能是签名框中的字段:

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(); 
      } 
     } 

这个工程通过采取字典集,键是单词或短语,根据PDF字段进行检查,如果字段与键中的单词或短语相匹配,则将值插入字段中。

The signature box before my program edits it.

The signature box after.

但我现在的问题是,如果当时没有字段存在,尽管它可能有“在这里签名”旁边的虚线,没有办法插入文本到虚线不知道虚线的位置,我的用户也不能选择虚线,因为这会破坏程序的重点。

我已经看过了一些以前的问题和答案,其中包括:

老实说,我坚持,这是我第一次使用PDF文档。我需要一种方法来检测签名行,然后将他的名字插入到签名行中,而不是在字段名称中进行注释。无论是在存在正确标记的字段的情况下,还是在签名行可能不超过一行表示“在此处签字”的文本的情况下。

任何帮助将不胜感激,甚至部分解决方案和推动正确的方向。

+1

如果您获得任何实际字段而不仅仅是扫描图像。但是表单的来源是什么?提交ADA申诉并获得修正表格。 –

+0

他寄给我的一些例子包括TWC替代品W-9和直接存款表格以及其他官方文件,我正在寻找一种程序化的解决方案,它可以用于包含签名行的任何类型的PDF。我已经考虑了光学字符识别方法,但是我想知道在我走下那条路线之前是否有可用的解决方案。 – Kris

回答

1

的强大的解决方案(又名“努力工作解决方案”)

  1. 实现IEventListener(iText7类)
  2. 使用IEventListener得到通知的文本渲染指令和画线操作
  3. 呈现指令做并不总是以逻辑(读取)顺序出现。修正了通过根据比较
  4. 使用语言检测来确定语言实现比较这些对象
  5. 排序(正克的方法很简单,但应该足够了)
  6. 字典攻击。查找所有在文件写入时以任何语言表示“在此签字”的词的出现(因此步骤5)
  7. 如果有多个候选人或没有候选人,请使用行渲染指令查找可能的臭名昭着的候选人“虚线”

这种方法并不容易,但是对于pdf文件中结构元素的识别有很多研究。特别是,如果您运行Google学者搜索,则会发现大量有用的文章,其中有人试图检测表格,列表,段落等。