Обрезка изображения в формате PDF почти правильно

#image #pdf #pdf-generation

#изображение #PDF #pdf-генерация

Вопрос:

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

Например, если размер большого изображения составляет 1000 x 400 пикселей, код рисует фрагмент, извлеченный из верхнего левого края большого изображения ((от 0, 0) до (250, 200)), а затем рядом с ним рисуется другой фрагмент, извлеченный из верхней середины большого изображения ((250, 0), (500, 200)) ( в этом посте я описываю координаты обрезки, используя стандартную систему координат изображения с началом координат в верхнем левом углу).

Способ, которым код делает это, заключается в создании вторичного XObject, который просто рисует большое изображение, соответствующим образом масштабируется и смещается. Итак, чтобы извлечь изображение из ((250, 0) в (500, 200)), он определяет новый XObject следующим образом:

 /Type/XObject /Subtype/Form /FormType 1 /Name/Img4 /BBox [0 0 1 1] /Matrix [1 0 0 1 0 0] /Length 26/Resources << /XObject << /img3 23 0 R >> >>

4 0 0 2 1 1 cm
/img3 Do
  

(очевидно, я вырезал много PDF, не волнуйтесь, это работает, поэтому PDF, который вы не видите, в основном правильный)

Который, если я правильно понимаю, берет XObject исходного изображения (который представляет собой квадрат размером 1 x 1), делает его в 4 раза больше в направлении x и в 2 раза больше в направлении y, смещает его на 1 как по x, так и по y, и теперь частьизображение, которое мы хотим, появится в прямоугольнике XObject ((0, 0), (1, 1)). Таким образом, код может просто нарисовать этот новый XObject там, где он хочет, и получит обрезанную часть большого изображения.

В основном это работает правильно, но, конечно, в реальном мире размер изображения составляет 656 x 656, а извлекаемые фрагменты имеют размеры 308 x 120 и 40 x 120, поэтому цифры не такие приятные.

Если я посмотрю на полученный PDF-файл с большим увеличением (1600%) в Adobe Acrobat Reader, он будет идеальным. Все пиксели точно там, где они должны быть.

Часть вывода PDF при 1600%

Проблема, с которой я сталкиваюсь, заключается в том, что при меньшем увеличении (200%) я получаю это странное смещение, когда 2 изображения примыкают:

Часть выходного файла PDF на 200%

Для этого примера матрица преобразования, которая выполняет обрезку, является:

 2.12987 0 0 5.46667 -0 -4.46667 cm
  

кажется, что должно быть достаточно цифр точности, но даже если я увеличу точность:

 2.1298701 0 0 5.4666667 -0 -4.4666667 cm
  

возникает точно такая же проблема.

Похоже, что Adobe Reader где-то в своих вычислениях сокращает точность.

Есть идеи, почему это происходит, и как я могу это обойти?