Использование iText (iTextSharp) для заполнения полей формы XFA в PDF?
Вопрос
Мне нужно заполнить поля формы XFA в PDF-файле (созданном с помощью Adobe LiveCycle Designer). Мы пытаемся использовать iText (на самом деле iTextSharp с C #), чтобы проанализировать PDF, заполнить поля XFA и затем сохранить измененный PDF обратно.
Все примеры, которые я могу найти с iText (очень мало примеров iTextSharp), рассказывают об изменении полей AcroForm. Этот PDF-файл НЕ имеет полей AcroForm и использует только XFA.
Было бы полезно использовать указатели на любые нестандартные ресурсы (я уже выполнил необходимое поиск по этой теме и не нашел ничего полезного).
Примеры кода здесь были бы замечательными для любого, кто действительно сделал то, что я пытаюсь сделать.
Решение
Если вы можете получить пакет данных в PDF, среда выполнения XFA в Acrobat заполнит эти поля данными в пакете данных.
Если вы хотите посмотреть, как это выглядит, создайте форму в LiveCycle Designer (поставляется с Acrobat Pro), добавьте в нее несколько полей и сохраните ее в виде динамического PDF. Откройте форму в Acrobat, введите некоторые значения в поля и сохраните ее. Р>
Откройте PDF с помощью инструмента, который позволяет вам просматривать данные PDF, и вы найдете / Catalog / AcroForm / XFA поток, который имеет < xfa: datasets > пакет со значениями, которые вы ввели. Это то, что вам нужно создать самостоятельно и вставить в PDF.
Спецификация XDP включает описание пакета данных и алгоритма слияния. Вы можете найти его здесь:
http://partners.adobe.com/public/developer/xml/ index_arch.html р>
Кроме того, вы покупаете сервер LiveCycle у Adobe, который позволяет вам делать все это программно различными способами, в том числе посредством вызовов веб-служб.
Другие советы
iTextSharp может работать с XFA. Чтобы снять все сомнения, посмотрите образец на сайте iText:
using (FileStream existingPdf = new FileStream("existing.pdf", FileMode.Open))
using (FileStream sourceXml = new FileStream("source.xml", FileMode.Open))
using (FileStream newPdf = new FileStream("new.pdf", FileMode.Create))
{
// Open existing PDF
PdfReader pdfReader = new PdfReader(existingPdf);
// PdfStamper, which will create
PdfStamper stamper = new PdfStamper(pdfReader, newPdf);
stamper.AcroFields.Xfa.FillXfaForm(sourceXml);
stamper.Close();
pdfReader.Close();
}
У меня та же проблема, и я думаю, что нашел решение. Я использую Powershell для проверки объекта PDF.
Загрузите библиотеку iTextSharp.
Add-Type -Path "C:\Users\micah\Desktop\itextsharp.dll"
Загрузить PDF в переменную:
$PDF = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList "C:\Users\micah\Desktop\test.pdf"
Осмотреть этот объект:
$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Get-Member
То, что вы ДОЛЖНЫ увидеть, это то, что все ваши поля в вашем PDF находятся в этом объекте как свойство. Вы можете получить быстрый просмотр всех ваших полей, как это:
$PDF.AcroFields.XFA.DomDocument.XDP.DataSets.Data.TopMostSubForm | Select-Object -Property "*"
Это должен быть волшебный билет. Это местоположение - оба поля из исходной формы и часть формы XFA.
Там сказано, что в книге, потому что itext этого не делает. Можете ли вы конвертировать PDF? Р>