【发布时间】:2018-05-11 09:09:15
【问题描述】:
我有一个问题,需要你的帮助。我正在运行 itext 7.0.2。 java,我正在尝试将 PdfDocument 类型的列表 ArrayList 合并到一个 pdf 中。
我尝试了以下方法:
ByteArrayOutputStream bosGes = new ByteArrayOutputStream();
PdfWriter writerGes = new PdfWriter(bosGes);
PdfDocument docGes = new PdfDocument(writerGes);
ArrayList<PdfDocument> pdfs = AListOfSomePreviousCreatedPdfDocuments;
for (int i=0; i < pdfs.size(); i++) {
PdfDocument d = pdfs.get(i);
PdfPage p = d.getFirstPage().copyTo(docGes);
docGes.addPage(p);
d.close();
}
导致这个错误:
com.itextpdf.kernel.PdfException:无法从正在写入的文档中复制间接对象。
然后我尝试了以下方法:
ByteArrayOutputStream bosGes = new ByteArrayOutputStream();
PdfWriter writerGes = new PdfWriter(bosGes);
PdfDocument docGes = new PdfDocument(writerGes);
for (int i=0; i < pdfs.size(); i++) {
PdfDocument d = pdfs.get(i);
docGes.addPage(d.getFirstPage());
d.close();
}
com.itextpdf.kernel.PdfException: 页面 com.itextpdf.kernel.pdf.PdfPage@1d85315f 无法添加到文档 com.itextpdf.kernel.pdf.PdfDocument@32ae81bb,因为它属于文档 com。 itextpdf.kernel.pdf.PdfDocument@4b8d06af.
我需要做什么,将这个 PdfDocuments(每个只有一页)合并到一个 Pdf 中?
好吧,我要疯了。从头开始解释。
我创建这样的 pdf 格式
ArrayList<PdfDocument> pdfs = new ArrayList<PdfDocument>();
while (rs.next()) {
URL fullPath = context.getResource("/formulare/kontrollbogen.pdf");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(bos);
PdfReader reader = new PdfReader(fullPath.getFile());
PdfDocument doc = new PdfDocument(reader, writer);
PdfAcroForm form = PdfAcroForm.getAcroForm(doc, true);
String firma = rs.getString("firma");
if (firma != null && !firma.equals("")) {
form.getField("firma").setValue(firma);
}
.
.
.
pdfs.add(doc);
}
然后我想像这样将这个 PdfDocuments 合并到我的 ArrayList 中:
ByteArrayOutputStream bosGes = new ByteArrayOutputStream();
PdfWriter writerGes = new PdfWriter(bosGes);
PdfDocument resultDoc = new PdfDocument(writerGes);
for (int i=0; i < pdfs.size(); i++) {
PdfReader r = pdfs.get(i).getReader();
PdfDocument sourceDoc1 = new PdfDocument(r);
int n1 = sourceDoc1.getNumberOfPages();
for (int j = 1; j <= n1; j++) {
PdfPage page = sourceDoc1.getPage(j).copyTo(resultDoc);
resultDoc.addPage(page);
}
sourceDoc1.close();
}
resultDoc.close();
不起作用。结果是一个包含更多页面但未填写表格的 pdf。
所以我尝试了 RTFM 并尝试了 Bruno 的合并扁平表单的示例,但结果始终是带有空表单的 pdf。
任何人都可以帮助将我的 ArrayList 中的 pdf 表单(所有相同的表单)转换为一个 pdf 文件吗?
我尝试了布鲁诺的提示,但它不起作用。我所做的是:
//Initialize PDF document with output intent
PdfDocument pdf = new PdfDocument(writerGes);
PdfMerger merger = new PdfMerger(pdf);
//Add pages from the first document
PdfDocument firstSourcePdf = pdfs.get(0);
merger.merge(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());
//Add pages from the second pdf document
PdfDocument secondSourcePdf = pdfs.get(1);
merger.merge(secondSourcePdf, 1, secondSourcePdf.getNumberOfPages());
firstSourcePdf.close();
secondSourcePdf.close();
pdf.close();
但它再次出现此错误:
com.itextpdf.kernel.PdfException: 无法从正在写入的文档中复制间接对象。
这可能是因为我的 pdf 是表单,我必须在合并时重置值?
【问题讨论】:
-
您阅读手册了吗?查看developers.itextpdf.com/content/itext-7-jump-start-tutorial-net/… 并查找
PdfMerger。 -
我试过但没有成功。不知道我做错了什么
-
您问题中的代码与您在评论中声明的内容相矛盾。您问题中的代码与教程中显示的代码完全不同,因此我只能假设您没有尝试教程中的示例。
-
好的。我得再试一次。我的问题是 Thema 以下。有人给我一个带有填写公式的 pdfdocument-objects 的 Arraylist。每一个只有一页。我必须将它们与所有文档的页数合并为一个 pdfdocument
-
错误消息 “无法从正在写入的文档中复制间接对象。” 似乎表明您要合并的
PdfDocument对象尚未创建只是PdfReader,但至少还有PdfWriter。