Применение одинаковых операций с изображениями к двум разным PDF-файлам, разные результаты - PullRequest
2 голосов
/ 02 августа 2020

Я работаю с двумя файлами PDF, которые не идентичны, но к ним должна быть применена одна и та же операция.

  • Первый из них создается Microsoft Office 365 путем загрузки документа Word как a PDF
  • Второй генерируется Google Диском путем загрузки документа Google Docs в формате PDF

Я работаю с некоторым предварительным кодом, используя Aspose чтобы применить одно и то же изображение к обоим файлам PDF, используя один и тот же код. Я не склонен сразу обвинять библиотеку, поскольку она способна генерировать правильный вывод при работе с документом Office 365:

// note: Anyone familiar with the PDF format itself should have no 
//       issues inferring the low-level operations being performed here...

fun Page.writeImage(image: InputStream) {

    val imageName = resources.images.add(image.inMemory());

    val rectangle = rectangleFromTopLeft(0.0, 0.0, 400.0, 200.0);
    val matrix = rectangle.defaultMatrix();

    contents.add(listOf(
        GSave(),
        ConcatenateMatrix(matrix),
        Do(imageName),
        GRestore()
    ));
}

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

Для PDF-файла, производного от Office 365, изображение применяется к странице, как я указываю. Все становится странно, когда я открываю PDF-файл, полученный из Google Docs, изображение накладывается перевернутым по вертикали и внизу страницы!

Просмотрите четыре файла PDF в их состоянии до и после.

Я хотел бы, чтобы любые эксперты по PDF, возможно, смогли объяснить мне, что здесь происходит. Мое первоначальное подозрение заключается в том, что какое-то предыдущее состояние или операция в PDF-документе Google Документов действует до моей операции с изображением.

Тем не менее, я недостаточно знаком (пока!) С PDF-файлом c выковыривать ...

1 Ответ

2 голосов
/ 03 августа 2020

Я не знаю, кого вы должны винить, но есть очевидная причина разницы.

В документе Google Docs есть поток страниц, который начинается с:

1 0 0 -1 0 792 cm

Это в основном вертикальное переворачивание страницы, 792 служит для компенсации и перемещения элементов обратно на страницу - это должна быть высота страницы в точках.

Это не инкапсулируется в q ... Q пара, чтобы выполнить «сохранить ... восстановить», что означает, что эта матрица теперь установлена ​​для оставшейся части всего, что следует на странице. Как вы, возможно, уже знаете, спецификация PDF не дает возможности сбросить матрицу страницы, вы можете только добавить к ней.

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

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

Как это исправить? Что ж, если ваша библиотека не предоставляет способ узнать, что такое текущая матрица страниц, это будет очень сложно. Конечно, ее можно решить «только для этого документа», применив обратную матрицу, чтобы отменить глупую вещь, которую Google сделал здесь, но я могу представить, что это не лучший способ справиться с тем, что вы бы искали.

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