Как добавить слова на новой странице при добавлении изображений и слов в itext - PullRequest
1 голос
/ 11 апреля 2019

Мне нужно добавить несколько групп изображений в 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());
        }

Тем не менее, pri они были по одному, слова не были добавлены на новую страницу:

the wrong example

Это то, что я ожидаю:

the right example

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

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

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

Подробно

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

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

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

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

Ваш оригинальный случай

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

OP's screenshot

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

Ваш обход

В случае обхода

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

* 1036.*

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

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

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

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

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

writer.setStrictImageSequence(true);

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

0 голосов
/ 11 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...