Я использую следующий код для объединения PDF файлов вместе с помощью iText:
public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException {
Document document = new Document();
FileOutputStream outputStream = new FileOutputStream(outputFile);
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
PdfContentByte cb = writer.getDirectContent();
for (File inFile : listOfPdfFiles) {
PdfReader reader = new PdfReader(inFile.getAbsolutePath());
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
document.newPage();
PdfImportedPage page = writer.getImportedPage(reader, i);
cb.addTemplate(page, 0, 0);
}
}
outputStream.flush();
document.close();
outputStream.close();
}
Это обычно отлично работает! Но раз и на время он поворачивает некоторые страницы на 90 градусов? Кто-нибудь когда-нибудь это случается?
Я сам просматриваю сами PDF файлы, чтобы узнать, что особенного в том, что перевернуто.
Ответ 1
Иногда возникают ошибки, потому что вы используете неправильный метод для конкатенации документов. Пожалуйста, прочтите главу 6 моей книги, и вы заметите, что использование PdfWriter
для конкатенации (или объединения) документов PDF неверно:
- Вы полностью игнорируете размер страницы страниц в исходном документе (предположите, что все они имеют размер A4),
- Вы игнорируете границы страниц, такие как поле обрезки (если есть),
- Вы игнорируете значение поворота, хранящееся в словаре страниц,
- Вы выбрасываете всю интерактивность, которая присутствует в исходном документе, и т.д.
Конкатенация PDF файлов выполняется с помощью PdfCopy
, например, пример FillFlattenMerge2:
Document document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
document.open();
PdfReader reader;
String line = br.readLine();
// loop over readers
// add the PDF to PdfCopy
reader = new PdfReader(baos.toByteArray());
copy.addDocument(reader);
reader.close();
// end loop
document.close();
В книге есть другие примеры.
Ответ 2
В случае, если кто-то ищет его, используя правильный ответ Бруно Лоугай, вот версия функции, которая, как представляется, не имеет проблемы с переводом страницы, описанной выше:
public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException {
Document document = new Document();
FileOutputStream outputStream = new FileOutputStream(outputFile);
PdfCopy copy = new PdfSmartCopy(document, outputStream);
document.open();
for (File inFile : listOfPdfFiles) {
PdfReader reader = new PdfReader(inFile.getAbsolutePath());
copy.addDocument(reader);
reader.close();
}
document.close();
}