Редактируемый PDF-файл, объединенный с iText, теряет данные формы, когда Acrobat Pro сохраняет как отдельный PDF-файл.

Мы заменяем Adobe LiveCycle Server на iText 5.4.1 в существующем веб-приложении, чтобы объединить данные XML с созданными LiveCycle Designer PDF-шаблонами, создавая редактируемые PDF-файлы из нескольких сотен шаблонов.

Этот код объединяет данные с шаблоном, возвращая байтовый массив PDF:

// Import data into the PDF form
if (pdfTemplateFileName != null && inputXmlDataFile != null) {

    // set up the objects
    template = new PdfReader(pdfTemplateFileName);
    filledPDF = new ByteArrayOutputStream();
    stamper = new PdfStamper(template, filledPDF);
    AcroFields form = stamper.getAcroFields();

    // fill in the form with the data
    XfaForm xfa = form.getXfa();
    xfa.fillXfaForm(inputXmlDataFile);

    //closing the stamper is necessary to flush to filledPDF
    stamper.close();
    returnPDF = filledPDF.toByteArray();
}

Этот код объединяет байтовые массивы PDF в портфель:

List<byte[]> assemblingPdfList = assemblingPdfMap.get("newStyleForms");

// create PDF portfolio of editable documents
com.itextpdf.text.Document document = new com.itextpdf.text.Document();
ByteArrayOutputStream mergedPDFOutput = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, mergedPDFOutput);

document.open();

Paragraph coverSheet = new Paragraph("Multiple files are bound together in this PDF Package");
coverSheet.setAlignment(com.itextpdf.text.Element.ALIGN_CENTER);
document.add(coverSheet);

// define the collection
PdfCollection collection = new PdfCollection(PdfCollection.DETAILS);
PdfCollectionSchema schema = new PdfCollectionSchema();
PdfCollectionField filename = new PdfCollectionField("Name", PdfCollectionField.FILENAME);
filename.setOrder(0);
schema.addField("FILENAME", filename);
PdfCollectionField description = new PdfCollectionField("Description", PdfCollectionField.TEXT);
description.setOrder(1);
schema.addField("DESCRIPTION", description);
PdfCollectionField modified = new PdfCollectionField("Modified", PdfCollectionField.MODDATE);
modified.setOrder(2);
schema.addField("MODIFIED", modified);
PdfCollectionField size = new PdfCollectionField("Size", PdfCollectionField.SIZE);
size.setOrder(3);
schema.addField("SIZE", size);
collection.setSchema(schema);
writer.setCollection(collection);

// loop through the PDF documents and add each to the portfolio
PdfFileSpecification fs;
PdfCollectionItem item;

int iNum = 0;
for (byte[] pdf : assemblingPdfList) {
    fs = PdfFileSpecification.fileEmbedded(writer, null,
    String.format("StylesResult_%s.pdf", iNum++), pdf);
    fs.addDescription("Styles Result File", false);
    item = new PdfCollectionItem(schema);
    item.addItem("DESCRIPTION", "Styles Result File");
    item.addItem("MODIFIED", new PdfDate() );
    fs.addCollectionItem(item);
    writer.addFileAttachment(fs);
}
// close document
document.close();
mergedPDFOutput.flush();
mergedPDFOutput.close();
return mergedPDFOutput.toByteArray();

Сначала iText не будет заполнять поля формы. Мы использовали LiveCycle Designer для изменения привязки данных большинства полей с Normal на Global, что позволило iText правильно заполнить большинство из них. Исключением были повторяющиеся (например, "таблица") строки данных; установка привязки 'Global' привела к тому, что первое значение данных повторялось вниз по столбцу для каждой из записей данных. Задание повторяющихся полей 'bindings' в Normal, казалось, сработало.

Объединенные в iText редактируемые портфолио PDF запускаются в Internet Explorer 10. Если мы нажмем "Открыть файл", чтобы открыть отдельный файл PDF в Adobe Acrobat XI Pro, все данные будут там. Однако если мы щелкнем "Файл" / "Сохранить как" в Acrobat Pro, чтобы сохранить его в новом файле PDF, а затем откроем новый файл, некоторые или все данные формы исчезнут (в одном случае сохранение "первого поколения") оставил большую часть данных нетронутыми, но повторяющиеся данные подчиненной формы были стерты. Сохранение снова, создание сохранения "второго поколения", удаление всех данных.)

Мои неудачные попытки решения включают: (а) инициализацию PdfStamper в режиме 'добавления'; (б) Модификация моего PdfStamper с помощью "stamper.setEncryption(false, "", "", PdfWriter.ALLOW_{everything}...)'.

Портфели, созданные сервером Adobe LiveCycle Server, не теряют данные, независимо от того, сколько поколений было сохранено.

0 ответов

Другие вопросы по тегам