【问题标题】:How do I detect a signature line in a PDF document and then insert a signature?如何检测 PDF 文档中的签名行然后插入签名?
【发布时间】:2018-01-14 06:05:57
【问题描述】:

上周我被要求为盲人构建一个应用程序,以编程方式填写 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 文档。我需要一种方法来检测签名行,然后将他的名字插入到签名行中,这比在字段名称上进行拍摄更有把握。无论是在存在正确标记的字段的情况下,还是在签名行可能不超过一行显示“在此处签名”的文本的情况下。

我们将不胜感激任何帮助,即使是部分解决方案和正确方向的推动。

【问题讨论】:

  • 如果您获得任何实际字段而不仅仅是扫描图像,那么您很幸运。但是表格的来源是什么?提交 ADA 投诉并修复表格。
  • 他发给我的一些示例包括 TWC 替代 W-9 和直接存款表格以及其他官方文件,我正在寻找一种适用于任何类型 PDF 的程序化解决方案,其中包含虽然是签名行。我已经考虑过一种光学字符识别方法,但我想知道在我走这条路之前是否已经有可用的解决方案。

标签: c# pdf itext electronic-signature blind


【解决方案1】:

稳健的解决方案(又名“勤奋解决方案”)

  1. 实现 IEventListener(iText7 类)
  2. 使用 IEventListener 获取有关文本渲染指令和线条绘制操作的通知
  3. 渲染指令并不总是以逻辑(读取)顺序出现。通过为这些对象实现比较器来解决此问题
  4. 根据比较器排序
  5. 使用语言检测来确定语言(n-gram 方法很简单,但应该足够了)
  6. 字典攻击。查找以任何语言编写文档的所有表示“在此处签名”的单词的出现(因此是第 5 步)
  7. 如果有多个候选者或没有候选者,请使用线条渲染指令寻找臭名昭著的“虚线”的可能候选者

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多