У меня проблема, и мне нужна ваша помощь. Я использую itext 7.0.2. Я и я пытаюсь объединить список ArrayList типа PdfDocument в один 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.
Что мне нужно сделать, чтобы объединить этот документ PDF (у каждого по одной странице) в один файл 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);
}
Затем я хочу объединить эти PDF-документы в моем 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 и попробовал пример Бруно со слиянием сплющенных форм, но результатом всегда является pdf с пустыми формами.
Может ли кто-нибудь помочь преобразовать pdf-формы (все те же формы) в моем ArrayList в один 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 являются формами, и мне нужно сбросить значения при слиянии?