Использование iText (iTextSharp) для заполнения полей формы XFA в PDF?

StackOverflow https://stackoverflow.com/questions/1041652

  •  22-07-2019
  •  | 
  •  

Вопрос

Мне нужно заполнить поля формы 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:

http://itextpdf.com/examples/iia.php?id=165

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?

scroll top