根据您的确切需求,可能会出现不同的情况,但是无论如何:您做错了。您应该使用
PdfCopy或
PdfSmartCopy合并文档。
下面的视频教程介绍了不同的情况。
您可以在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();}这是三种情况。对于任何人来说,您的问题都不清楚,但是您可以决定哪种方案最适合您的需求。我建议您在编码之前花点时间学习。观看视频,尝试示例,如果仍然有疑问,可以提出更聪明的问题。



