iText将文档与Acrofields合并

我目前有一个PdfReader和一个PdfStamper,我正在用它们填充acrofields。现在,我必须将另一张pdf复制到我一直填写的表格的末尾,当我这样做时,我会在新表格上丢失acrofield。这是代码。

public static void addSectionThirteenPdf(PdfStamper stamper, Rectangle pageSize, int pageIndex){

PdfReader reader = new PdfReader(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/resources/documents/Section13.pdf"));

AcroFields fields = reader.getAcroFields();

fields.renameField("SecurityGuidancePage3", "SecurityGuidancePage" + pageIndex);

stamper.insertPage(pageIndex, pageSize);

stamper.replacePage(reader, 1, pageIndex);

}

我创建原始文档的方式是这样的。

     OutputStream output = FacesContext.getCurrentInstance().getExternalContext().getResponseOutputStream();

PdfReader pdfTemplate = new PdfReader(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/resources/documents/dd254.pdf"));

PdfStamper stamper = new PdfStamper(pdfTemplate, output);

stamper.setFormFlattening(true);

AcroFields fields = stamper.getAcroFields();

有没有一种方法可以使用第一段代码合并并将两个acrofield合并在一起?

回答:

根据您的确切需求,可能会出现不同的情况,但是无论如何:您做错了。您应该使用PdfCopyPdfSmartCopy合并文档。

下面的视频教程介绍了不同的情况。

您可以在iText沙箱中找到大多数示例。

如果要合并 不同的

表单而不使其变平,则应PdfCopy按照MergeForms示例中的操作使用:

public void createPdf(String filename, PdfReader[] readers) throws IOException, DocumentException {

Document document = new Document();

PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));

copy.setMergeFields();

document.open();

for (PdfReader reader : readers) {

copy.addDocument(reader);

}

document.close();

for (PdfReader reader : readers) {

reader.close();

}

}

在这种情况下,readers是一个PdfReader包含 不同

形式(具有不同字段名称)的实例数组,因此我们使用PdfCopy并确保不会忘记使用该setMergeFields()方法,否则将不会复制字段。

在这种情况下,我们需要重命名字段,因为我们可能希望在不同页面上使用不同的值。在PDF中,一个字段只能有一个值。如果合并相同的表单,则您将在同一字段中具有多个可视化,但是

每个可视化将显示相同的值 (因为实际上,只有一个字段)。

让我们看一下MergeForms2示例:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {

Document document = new Document();

PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));

copy.setMergeFields();

document.open();

List<PdfReader> readers = new ArrayList<PdfReader>();

for (int i = 0; i < 3; ) {

PdfReader reader = new PdfReader(renameFields(src, ++i));

readers.add(reader);

copy.addDocument(reader);

}

document.close();

for (PdfReader reader : readers) {

reader.close();

}

}

public byte[] renameFields(String src, int i) throws IOException, DocumentException {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

PdfReader reader = new PdfReader(src);

PdfStamper stamper = new PdfStamper(reader, baos);

AcroFields form = stamper.getAcroFields();

Set<String> keys = new HashSet<String>(form.getFields().keySet());

for (String key : keys) {

form.renameField(key, String.format("%s_%d", key, i));

}

stamper.close();

reader.close();

return baos.toByteArray();

}

如您所见,该renameFields()方法在内存中创建一个新文档。该文档将使用与其他文档合并PdfSmartCopy。如果您在PdfCopy这里使用,您的文档将会be肿(我们很快就会发现)。

在FillFlattenMerge1中,我们使用填写表格PdfStamper。结果是一个PDF文件,该文件保留在内存中,并使用合并PdfCopy。如果您要合并其他表单,虽然此示例很好,但这实际上是有关

合并的示例(如视频教程中所述)。

该FillFlattenMerge2显示了如何合并所填写正确扁平相同的形式:

public void manipulatePdf(String src, String dest) throws DocumentException, IOException {

Document document = new Document();

PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));

document.open();

ByteArrayOutputStream baos;

PdfReader reader;

PdfStamper stamper;

AcroFields fields;

StringTokenizer tokenizer;

BufferedReader br = new BufferedReader(new FileReader(DATA));

String line = br.readLine();

while ((line = br.readLine()) != null) {

// create a PDF in memory

baos = new ByteArrayOutputStream();

reader = new PdfReader(SRC);

stamper = new PdfStamper(reader, baos);

fields = stamper.getAcroFields();

tokenizer = new StringTokenizer(line, ";");

fields.setField("name", tokenizer.nextToken());

fields.setField("abbr", tokenizer.nextToken());

fields.setField("capital", tokenizer.nextToken());

fields.setField("city", tokenizer.nextToken());

fields.setField("population", tokenizer.nextToken());

fields.setField("surface", tokenizer.nextToken());

fields.setField("timezone1", tokenizer.nextToken());

fields.setField("timezone2", tokenizer.nextToken());

fields.setField("dst", tokenizer.nextToken());

stamper.setFormFlattening(true);

stamper.close();

reader.close();

// add the PDF to PdfCopy

reader = new PdfReader(baos.toByteArray());

copy.addDocument(reader);

reader.close();

}

br.close();

document.close();

}

这是三种情况。对于任何人来说,您的问题都不清楚,但是您可以决定哪种方案最适合您的需求。我建议您在编码之前花点时间学习。观看视频,尝试示例,如果仍然有疑问,可以提出更聪明的问题。

以上是 iText将文档与Acrofields合并 的全部内容, 来源链接: utcz.com/qa/422078.html

回到顶部