如何检测PDF文档中的签名行,然后插入签名?
问题描述:
上周我被要求为一个盲人构建一个应用程序,以编程方式填写一份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.
但我现在的问题是,如果当时没有字段存在,尽管它可能有“在这里签名”旁边的虚线,没有办法插入文本到虚线不知道虚线的位置,我的用户也不能选择虚线,因为这会破坏程序的重点。
我已经看过了一些以前的问题和答案,其中包括:
- 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
老实说,我坚持,这是我第一次使用PDF文档。我需要一种方法来检测签名行,然后将他的名字插入到签名行中,而不是在字段名称中进行注释。无论是在存在正确标记的字段的情况下,还是在签名行可能不超过一行表示“在此处签字”的文本的情况下。
任何帮助将不胜感激,甚至部分解决方案和推动正确的方向。
答
的强大的解决方案(又名“努力工作解决方案”)
- 实现IEventListener(iText7类)
- 使用IEventListener得到通知的文本渲染指令和画线操作
- 呈现指令做并不总是以逻辑(读取)顺序出现。修正了通过根据比较
- 使用语言检测来确定语言实现比较这些对象
- 排序(正克的方法很简单,但应该足够了)
- 字典攻击。查找所有在文件写入时以任何语言表示“在此签字”的词的出现(因此步骤5)
- 如果有多个候选人或没有候选人,请使用行渲染指令查找可能的臭名昭着的候选人“虚线”
这种方法并不容易,但是对于pdf文件中结构元素的识别有很多研究。特别是,如果您运行Google学者搜索,则会发现大量有用的文章,其中有人试图检测表格,列表,段落等。
如果您获得任何实际字段而不仅仅是扫描图像。但是表单的来源是什么?提交ADA申诉并获得修正表格。 –
他寄给我的一些例子包括TWC替代品W-9和直接存款表格以及其他官方文件,我正在寻找一种程序化的解决方案,它可以用于包含签名行的任何类型的PDF。我已经考虑了光学字符识别方法,但是我想知道在我走下那条路线之前是否有可用的解决方案。 – Kris