Itext 7 добавить несколько изображений в верхней части отдельных страниц - PullRequest
0 голосов
/ 05 марта 2019

Я искал несколько похожих постов и пробовал различные конфигурации, чтобы добиться этого, но не смог заставить его работать с последними библиотеками iText 7.

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

Мое требование - создать документ PDFс несколькими изображениями, каждое из которых расположено в верхнем левом углу отдельной страницы (после поля по умолчанию 36 единиц).например, если есть 5 изображений, в результате pdf будет иметь 5 страниц (размер A4), каждая из которых содержит одно изображение в верхней части страницы.

Я начал с примера iText 7, доступного по следующей ссылке, для создания нескольких страниц.

https://itextpdf.com/en/resources/examples/itext-7/multiple-images

Пара изменений, которые я сделал:

  1. Установить автоматическое масштабирование true

    Image image = new Image(imageData).setAutoScale(true);

  2. Добавить новую страницу с размером по умолчанию.

    pdfDocument.addNewPage(i+1);

Но в приведенном выше примере ссылка добавляет изображение в нижнем левом углу каждогостр.Поэтому я сначала попытался вычислить нижнюю позицию, но вычесть высоту изображения, используя getImageScaledHeight().Этот метод возвращает высоту изображения в пикселях, а не в пользовательских единицах, поэтому он все еще оставляет некоторое поле сверху.

Я попробовал другой подход, установив pageNumber(i+1) и setMarginTop(0).Но похоже, что когда вы устанавливаете поле, номер страницы не оказывает никакого влияния, и все изображения добавляются одно за другим на первой странице.

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

PDF # 1 - Без флага автоматического масштабирования # 2 На изображении установлен автоматический масштаб

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Решение для добавления нескольких изображений в PDF вверху каждой страницы с масштабированием.

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

Получается, что метод getImageScaledHeight() не работает, если автоматическое масштабирование включено с помощью setAutoScale(true).Автоматическое масштабирование произойдет, но только после того, как изображение будет добавлено в документ, но для установки положения изображения в верхней части страницы нам понадобится масштабированная высота изображения при вызове следующего метода

image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

Чтобы включить масштабированиеизображения, чтобы поместиться на странице, а также расположить их в нужном месте на странице, вам нужно

  1. Сначала масштабируйте изображение, используя метод image.scaleToFit(fitWidth, fitHeight), а затем рассчитайте нижнее положение, используямасштабированный

  2. Рассчитать нижнюю позицию, используя масштабированную высоту изображения (image.getImageScaledHeight()) и высоту страницы .

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

Решение № 1.Несколько изображений в PDF на отдельной странице вверху без полей

image.scaleToFit(pdfA4usableWidth, pdfA4usableHeight);
image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

Нажмите здесь, чтобы увидеть пример кода с консольным выводом

Решение № 2.Несколько изображений в PDF на отдельной странице сверху с полями

float leftMargin = document.getLeftMargin(), rightMargin = document.getRightMargin();
float topMargin = document.getTopMargin(), bottomMargin = document.getBottomMargin();
float pdfA4usableWidth = PageSize.A4.getWidth() - leftMargin - rightMargin;
float pdfA4usableHeight = PageSize.A4.getHeight() - topMargin - bottomMargin;

System.out.println("A4 usable width: "+pdfA4usableWidth+", usable height: "+pdfA4usableHeight);

image.scaleToFit(pdfA4usableWidth, pdfA4usableHeight);
image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

Щелкните здесь, чтобы увидеть пример кода с консольным выводом

PDF сгенерировано ...

Изображение добавлено в PDF без полей

Изображение добавлено в PDF с полями по умолчанию

Измерение полей в PDF

Примечания:

  1. На прилагаемых снимках экрана PDF-файлов серый цвет является просто фоном средства просмотра PDF.
  2. Файлы изображений представлены в виде test1.jpg и test2.jpg, чтобы этот пример кода был простым.
0 голосов
/ 05 марта 2019

Давайте внесем еще несколько изменений в пример MultipleImages:

1) (незначительный) Нет необходимости создавать Document с пользовательским размером страницы, этого было бы достаточно: Document doc = new Document(pdfDoc);

2) Давайте изменим нижний параметр метода setFixedPosition, извлекая высоту изображения из высоты страницы по умолчанию: image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

Результирующий PDF-файл выглядит так, как ожидается:

enter image description here

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