gpt4 book ai didi

java - Itext - 如何使用 acrofields 克隆页面?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:35:03 24 4
gpt4 key购买 nike

我正在用 Java 编写一个程序,用于打印宾果卡的 PDF 文件。每页是一张卡片。为了方便我,我创建了一个带有 acrofields 的模板 PDF 文件,这样程序只需要创建该模板的副本,用数字填充 acrofields,然后将其展平。截至目前,我可以创建 1 张宾果卡。我想在一个 PDF 文件中包含多页(因此,多张卡片)。但我不知道该怎么做。我读到的是 PDFStamper 与一个且只有一个 PDFReader 对象相关联。有没有一种方法可以做到这一点,而无需创建多个 PDF 文件并将它们合并为一个文件(我上次这样做,但发现速度很慢)提前致谢!

最佳答案

我花了一段时间才弄明白这一点。这不是最有效的编码方式,但本质上是它的作用:

  • 创建文档
  • 对于每个带有 acrofield 的页面:
  • 复制你的模板
  • 填写表格
  • 扁平化表格
  • 添加页面

这是我的实现,您可以尝试修改它以满足您的需求:

private void createPdf() throws Exception {
Document doc = new Document();
PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
doc.open();

PdfReader reader;
PdfStamper stamper;
AcroFields form;
ByteArrayOutputStream baos;

for(int i = 0; i < getTotalPages(); i++) {
copyPdf(i);

reader = new PdfReader(String.format("%d%s", i, "template.pdf"));
baos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, baos);
form = stamper.getAcroFields();

//methods to fill forms

stamper.setFormFlattening(true);
stamper.close();

reader = new PdfReader(baos.toByteArray());
copy.addPage(copy.getImportedPage(reader, 1));
}

doc.close();
}

private void copyPdf(int currentPage) throws Exception {
PdfReader reader = new PdfReader("timesheet.pdf");
Document doc = new Document();
File file = new File(String.format("%d%s", currentPage, "template.pdf"));
file.deleteOnExit();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(file));
stamper.close();
}

copyPdf() 方法创建临时文件,用于在不影响整个文档的情况下填写表单。如果您找到更有效的方法来执行此操作,请告诉我。

此外,我发现在基于 Intel 的 Mac 与 Windows 计算机上,Mac 完成此操作的速度要快得多。

如果您不反对购买 iText 引用书,我会推荐 Bruno Lowagie 的“iText in Action,第二版”。这是一本很棒的书,非常有帮助。

关于java - Itext - 如何使用 acrofields 克隆页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5817945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com