Функция, которая может использовать iText для объединения/объединения PDF файлов вместе, что вызывает некоторые проблемы

Я использую следующий код для объединения 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();
}