当Acrobat Pro另存为单独的PDF时,iText合并的可编辑PDF将丢失表单数据

当Acrobat Pro另存为单独的PDF时,iText合并的可编辑PDF将丢失表单数据,pdf,pdf-generation,itext,acrobat,data-loss,Pdf,Pdf Generation,Itext,Acrobat,Data Loss,我们正在现有Web应用程序中用iText 5.4.1替换Adobe LiveCycle Server,以将XML数据与LiveCycle Designer生成的PDF模板合并,从数百个模板生成可编辑的PDF文件 此代码将数据与模板组合,返回PDF字节数组: // Import data into the PDF form if (pdfTemplateFileName != null && inputXmlDataFile != null) { // set up th

我们正在现有Web应用程序中用iText 5.4.1替换Adobe LiveCycle Server,以将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();
List assemblingPdfList=assemblingPdfMap.get(“newStyleForms”);
//创建可编辑文档的PDF公文包
com.itextpdf.text.Document Document=新建com.itextpdf.text.Document();
ByteArrayOutputStream mergedPDFOutput=新建ByteArrayOutputStream();
PdfWriter writer=PdfWriter.getInstance(文档,mergedPDFOutput);
document.open();
段落封面=新段落(“此PDF文件包中多个文件绑定在一起”);
setAlignment(com.itextpdf.text.Element.ALIGN\u CENTER);
文件。添加(封面);
//定义集合
PdfCollection collection=新的PdfCollection(PdfCollection.DETAILS);
PdfCollectionSchema模式=新的PdfCollectionSchema();
PdfCollectionField filename=新的PdfCollectionField(“名称”,PdfCollectionField.filename);
filename.setOrder(0);
schema.addField(“文件名”,文件名);
PdfCollectionField description=新的PdfCollectionField(“description”,PdfCollectionField.TEXT);
说明.设定顺序(1);
schema.addField(“DESCRIPTION”,DESCRIPTION);
PdfCollectionField modified=新的PdfCollectionField(“modified”,PdfCollectionField.MODDATE);
修改。设置顺序(2);
schema.addField(“已修改”,已修改);
PdfCollectionField size=新的PdfCollectionField(“size”,PdfCollectionField.size);
大小。设置顺序(3);
schema.addField(“SIZE”,SIZE);
集合。集合模式(模式);
writer.setCollection(collection);
//循环浏览PDF文档并将每个文档添加到公文包中
PDF规范fs;
PdfCollectionItem;
int iNum=0;
for(字节[]pdf:assemblingPdfList){
fs=PdfileSpecification.fileEmbedded(writer,null,
String.format(“StylesResult_u%s.pdf”,iNum++),pdf);
fs.addDescription(“样式结果文件”,false);
项目=新的PdfCollectionItem(模式);
item.addItem(“说明”、“样式结果文件”);
添加项(“修改”,新PdfDate());
fs.添加集合项目(项目);
writer.addFileAttachment(fs);
}
//关闭文档
document.close();
mergedPDFOutput.flush();
mergedPDFOutput.close();
返回mergedPDFOutput.toByteArray();
起初,iText不会填充表单字段。我们使用LiveCycle Designer将大多数字段的数据绑定从普通更改为全局,这使iText能够正确填充其中的大多数字段。例外情况是重复(想想“表”)行数据;将绑定设置为“全局”会导致在每个数据记录的列中重复第一个数据值。将重复字段的绑定设置回“正常”似乎有效

iText合并的可编辑PDF公文包在Internet Explorer 10中启动。如果我们点击“打开文件”来打开Adobe Acabas席Pro中的个人PDF,所有的数据都在那里。但是,如果在Acrobat Pro中单击“文件”/“另存为”以保存为新的PDF文件,然后打开新文件,则部分或全部表单数据已消失(在一种情况下,“第一代”保存保留了大部分数据,但重复的子表单数据已被删除。再次保存,创建“第二代”保存,将删除所有数据。)

我失败的解决方案尝试包括:(a)在“附加”模式下初始化PdfStamper;(b) 使用'stamper.setEncryption(false,“,”,PdfWriter.ALLOW_{everything}…'修改我的PdfStamper


Adobe LiveCycle Server生成的公文包不会丢失数据,无论保存了多少代。

您提到过支持的pdf版本吗?然而,当你说,如果我们保存到一个新的PDF文件,然后打开新文件,部分或全部表单数据已经消失,我想到的第一件事是确保所有功能都与PDF版本兼容iText生成的公文包的第一行是%PDF-1.7。相应Adobe生成的公文包的第一行是%PDF-1.6。我是pdf内部的新手,所以如果我没有回答你的问题,请告诉我。我应该做些不同的事情吗?你是在混合不同的东西,比如公文包(又名便携式集合)、表单(如果你谈论的是AcroForm技术或XML表单体系结构又名XFA,你就不提了),你没有向我们解释如何保存文档,。。。如果我们需要对你问题中的每一个不清楚的元素进行猜测,那么我们需要探索的可能场景的数量将以指数级增长。我将投票结束你的问题,因为它不清楚。你是对的-我正在使用另一个开发人员的代码,不完全理解。我将检查代码并改进问题。谢谢。布鲁诺,我想更新一下,我们发现我们已经支付了iText支持费用,所以我们已经将这些信息和样本提供给了我们的支持票。只是想让你知道。”