Мне нужно добавить несколько групп изображений в pdf с помощью itext5 , и разделить разные группы словами. Я надеюсь, что каждая группа изображений начинается на новой странице, мой код выглядит так:

        Document document = new Document();
        byte[] imageA1 = .......;
        byte[] imageA2 = .......;
        byte[] imageA3 = .......;
        byte[] imageA4 = .......;
        byte[] imageB1 = .......;
        byte[] imageB2 = .......;
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
            PdfWriter writer = PdfWriter.getInstance(document, bos);
            document.open();
            document.newPage();
            document.add(new Paragraph("(This is groupA"));
            document.add(Image.getInstance(imageA1));
            document.add(Image.getInstance(imageA2));
            document.add(Image.getInstance(imageA3));
            document.add(Image.getInstance(imageA4));
            document.newPage();
            document.add(new Paragraph("(This is groupB"));
            document.add(Image.getInstance(imageB1));
            document.add(Image.getInstance(imageB2));
            document.close();
            byte[] result = bos.toByteArray();
        } catch (Exception ex) {
            throw new RuntimeException(ex.getLocalizedMessage());
        }

Однако , они были приглашены один за другим, слова не были добавлены на новую страницу:

the wrong example

Вот чего я ожидал:

the right example

Как это решить?

1
Wong.F.R 11 Апр 2019 в 13:37

2 ответа

Лучший ответ

Короче говоря

Это поведение вызвано тем, что iText по умолчанию рассматривает изображения как нечто, что может перемещаться на следующую страницу, если для текущей страницы недостаточно места для изображения. Вы можете переопределить этот эффект, установив для свойства StrictImageSequence PdfWriter значение true. В определенных обстоятельствах ваш двойник newPage также выполняет свою работу.

В деталях

Плавающие изображения в iText

При добавлении изображения на страницу iText сначала проверяет, достаточно ли места на странице для изображения. Если этого не происходит, iText по умолчанию не сразу запускает новую страницу для размещения изображения, а просто сохраняет изображение в локальной переменной. Когда в конечном итоге новая страница создается по какой-либо другой причине, например, добавив достаточное количество текста для вызова переключения страниц или явного вызова newPage(), сохраненное изображение немедленно добавляется на новую страницу в качестве первого содержимого.

Это предотвращает в основном пустые страницы в случае сочетания огромных изображений и текста.

Остерегайтесь, поскольку для этого существует только одна переменная изображения, добавление еще одного неподходящего изображения приведет к генерации новой страницы и, тем не менее, к рисованию первого ожидающего изображения.

Ваш оригинальный чехол

В случае вашего вывода

OP's screenshot

Изображение вверху было добавлено в документ, когда предыдущая страница была еще текущей. Он не подходит, поэтому он был сохранен в переменной. Затем ваш явный вызов newPage() создал новую страницу, и изображение из переменной было добавлено в качестве первого содержимого на этой новой странице, и только после этого ваше «(Это группа B)», которое вы хотели стать первым содержимым, был нарисован.

Ваш обходной путь

В случае вашего обходного пути

если я вызываю document.newPage () дважды, это работает

Еще одна новая страница генерируется после того, как изображение нарисовано в ходе первого newPage() вызова.

С другой стороны, если для новой страницы нет сохраненного изображения, второе newPage() игнорируется, поскольку по умолчанию iText подавляет пустые страницы.

Таким образом, ваш обходной путь может быть полезен в вашем случае.

Отключение плавающих изображений в iText

Тем не менее, более общим решением было бы полное подавление плавающих изображений в iText. Вы можете сделать это, установив для свойства PdfWriter StrictImageSequence значение true:

writer.setStrictImageSequence(true);

Это также может быть лучшим решением в вашем случае, особенно если вы в конечном итоге начнете добавлять дополнительный текст между изображениями в одной группе.

0
mkl 15 Апр 2019 в 10:46

Я не знаю вашу iText версию, но я предполагаю, что вы должны создать PdfDocument вместо Document.

0
Sascha 11 Апр 2019 в 11:32