Как я могу изменить происхождение страницы? - Изображение вставлено в неожиданном месте - PullRequest
0 голосов
/ 23 января 2020

Используя iText 7.1.9 java edition, я пытаюсь добавить изображение в PDF в фиксированном / абсолютном месте. Если PDF не в альбомной ориентации, я поворачиваю его на 90 градусов, однако, как только страница поворачивается исходная точка (была в левом нижнем углу) также поворачивается (теперь в верхнем левом углу и повернута на 90 градусов), поэтому, когда я вставляю изображение, оно поворачивается и использует неправильную исходную точку. См. Два примера PDF, ссылки на которые приведены ниже, для визуального представления о том, что происходит.


Есть ли способ изменить исходную точку страницы в нижний левый угол после поворота страницы? Есть ли лучший способ повернуть страницу, чем использовать PdfDocument.getPage(p).setRotation?

Должен ли я просто повернуть изображение и выполнить некоторые математические расчеты, чтобы определить новое местоположение для каких-либо дополнительных элементов? Я попытался повернуть изображение, используя imageData.setRotation(90), но оно, похоже, ничего не делает.


Ниже приведены входные данные с использованием PDF, прикрепленные в нижней части этого вопроса:

//String pdfPath = "before_expected.pdf";
//String pdfDest = "after_expected.pdf";
//Or
String pdfPath = "before_unexpected.pdf";
String pdfDest = "after_unexpected.pdf";

Ниже приведен мой код для поворота страниц и добавления изображения:

//Open existing PDF
FileInputStream inputStream = new FileInputStream(pdfPath);
PdfReader reader = new PdfReader(inputStream).setUnethicalReading(true);

//Create new PDF
FileOutputStream outputStream = new FileOutputStream(pdfDest);
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(reader, writer);

//Load sample image
ImageData imageData = ImageDataFactory.create("C:/sample_image.png");
Image image = new Image(imageData);

//Get root element of PDF
Document document = new Document(pdfDocument);

//Get orientation
Rectangle pageSize = pdfDocument.getPage(1).getPageSize();
System.out.println("Original rotation " + pdfDocument.getPage(1).getRotation() + System.lineSeparator() + pageSize.toString());
//Rotate 90 if page is not landscape - placeholder
if (pageSize.getHeight() > pageSize.getWidth())
{
    pdfDocument.getPage(1).setRotation(pdfDocument.getPage(1).getRotation() + 90);
}

//Find page size
Rectangle currentPageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
//Locate image 40% across page and 20% up page
float absoluteXpos = currentPageSize.getWidth() * 0.4f;
float absoluteYpos = currentPageSize.getHeight() * 0.2f;
System.out.println("Image location from origin: " + absoluteXpos + ", "+absoluteYpos);

//Add image
image.setFixedPosition(absoluteXpos, absoluteYpos);
document.add(image);

//Removed code to close any tidy up
document.close();

Вывод второго PDF-файла (before_unexpected.pdf) показывает, что он поворачивается, но, как уже упоминалось выше, при дальнейшем вращении страницы появляется без разницы при добавлении дополнительного контента:

Original rotation 90
Rectangle: 842.0x1191.0
Image location from origin: 336.80002, 238.2

Вот файлы PDF, которые я использовал для тестирования:

Первые два изображения показывают ожидаемое / желаемое поведение, последние два показать, как изображение вставлено в неправильное место (на основании неправильного начала координат / поворота).

Щелкните здесь для получения исходного файла для первого файла pdf Original file expected behaviour

Нажмите здесь, чтобы получить обработанный файл для первого файла pdf Created file expected behaviour


Нажмите здесь для просмотра оригинального файла для второго pdf Original file unexpected behaviour

Нажмите здесь, чтобы получить обработанный файл для второго файла pdf Created file unexpected behaviour

1 Ответ

2 голосов
/ 25 января 2020

Прежде всего, при определении, является ли текущая страница не альбомной (if (pageSize.getHeight() > pageSize.getWidth())), вы должны уже использовать getPageSizeWithRotation() вместо простого getPageSize(). Вы используете этот метод позже в коде, и вы должны были использовать его и на более ранней стадии.

Во-вторых, если вы хотите добавить некоторый контент в фиксированную позицию независимо от поворота страницы, вы можете использовать Следующая инструкция перед добавлением содержимого:

pdfDocument.getPage(1).setIgnorePageRotationForContent(true);

Полный код:

//Open existing PDF
FileInputStream inputStream = new FileInputStream("C:/in.pdf");
PdfReader reader = new PdfReader(inputStream).setUnethicalReading(true);

//Create new PDF
FileOutputStream outputStream = new FileOutputStream("C:/Users/Alexey/Desktop/exp.pdf");
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(reader, writer);

//Load sample image
ImageData imageData = ImageDataFactory.create("C:/sample_image.png");
Image image = new Image(imageData);

//Get root element of PDF
pdfDocument.getPage(1).setIgnorePageRotationForContent(true);
Document document = new Document(pdfDocument);

//Get orientation
Rectangle pageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
System.out.println("Original rotation " + pdfDocument.getPage(1).getRotation() + System.lineSeparator() + pageSize.toString());
//Rotate 90 if page is not landscape - placeholder
if (pageSize.getHeight() > pageSize.getWidth())
{
    pdfDocument.getPage(1).setRotation(pdfDocument.getPage(1).getRotation() + 90);
}

//Find page size
Rectangle currentPageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
//Locate image 40% across page and 20% up page
float absoluteXpos = currentPageSize.getWidth() * 0.4f;
float absoluteYpos = currentPageSize.getHeight() * 0.2f;
System.out.println("Image location from origin: " + absoluteXpos + ", "+absoluteYpos);

//Add image
image.setFixedPosition(absoluteXpos, absoluteYpos);
document.add(image);

//Removed code to close any tidy up
document.close();

Это дает мне одинаковый результат для обоих входных файлов:

result

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