Использование iText (iTextSharp) для заполнения полей формы XFA в PDF?
Мне нужно заполнить поля формы XFA в формате PDF (созданного с помощью Adobe LiveCycle Designer). Мы пытаемся использовать iText (на самом деле iTextSharp с С#) для разбора PDF файла, заполнения полей XFA и сохранения сохраненного PDF файла.
Все примеры, которые я могу найти в iText (очень немногие примеры iTextSharp), рассказывают об изменении полей AcroForm. Этот PDF файл не имеет полей AcroForm и использует только XFA.
Указатели на любые нестандартные ресурсы были бы полезны (я уже сделал необходимый Googling по этой теме и не нашел ничего полезного).
Примеры кода здесь были бы удивительными от всех, кто действительно сделал то, что я пытаюсь сделать.
Ответы
Ответ 1
Если вы можете получить пакет данных в 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, который позволяет делать все это программно несколькими способами, в том числе через вызовы веб-сервисов.
Ответ 2
iTextSharp может работать с XFA. Чтобы устранить все сомнения, пожалуйста, взгляните на образец на веб-сайте iText:
http://itextpdf.com/examples/iia.php?id=165
Ответ 3
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();
}
Ответ 4
У меня такая же проблема, и я думаю, что нашел решение. Я использую Powershell для проверки PDF-объекта.
Загрузите iTextSharp DLL.
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 формы.
Ответ 5
В нем говорится, что в книге, потому что itext этого не делает. Можете ли вы конвертировать PDF?