На прошлой неделе меня попросили создать приложение для слепого, чтобы программно заполнить 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 и затем вставляя значение в поля, если поле совпадает со словом или фразой в ключе.
Поле для подписи перед его редактированием моей программой.
Но проблема, с которой я столкнулся сейчас, заключается в том, что если поля не существует, тогда, хотя у него может быть «знак здесь» рядом с пунктирной линией, нет способа вставить текст в пунктирную линию, не зная точно, где находится пунктирная линия, и не может мой пользователь выбирает пунктирную линию, потому что это нарушает суть программы.
Я просмотрел ряд предыдущих вопросов и ответов, в том числе:
- Как получить TextField из AcroField с помощью iText / Sharp?
- Как преобразовать PDF в WORD на C #
- Вставить текст в существующий PDF-файл с помощью itextsharp
- ITextSharp вставить текст в существующий PDF-файл
Честно говоря, я застрял, я впервые работаю с PDF-документами. Мне нужен способ обнаружить линию подписи, а затем вставить его имя в строку подписи с большей уверенностью, чем делать снимки по названиям полей. Как в ситуациях, когда существует правильно помеченное поле, так и в ситуациях, когда строка подписи может быть не более, чем строкой текста с надписью «подпишите здесь».
Мы будем благодарны за любую помощь, даже частичные решения и толчки в правильном направлении.