Поворот текста в PDF

Итак, у меня есть такая ситуация:

с помощью pdftoxml.exe с sourceforge.net я получил текстовые токены и их координаты. Если PDF-файл был повернут (т.е. он имеет /Rotate 90 записано в источнике) pdftoxml.exe меняет высоту и ширину заданной страницы, а также координаты x и y любого заданного объекта. Это то, что я понимаю.

Я был счастлив с этим, пока я не наткнулся на файл PDF, который использовал re рисовать толстые линии. То есть для толстой линии рисуется 4 тонких линии и пространство заполняется, как на этом рисунке. Слева вы видите две тонкие линии (не цветные), которые являются частью большего прямоугольника (сильно увеличенный). Я опустошил пространство между ними, которое на самом деле было заполнено черным, чтобы увидеть линии:

Кроме того, выше PDF вращается. Так чтобы получить B в конце концов, эта текстовая матрица была использована: 0 1 -1 0 90.72 28.3705 Tm, Тонкие линии были нарисованы так из 83.04 27.891 0.48 0.48 re (Координаты могут отличаться, но это была какая-то повторная операция. x y width height re а также re для прямоугольника из PDF Adobe 1.7 стр. 133). Здесь важен расчет 27.891 + 0.48 = 28.371 который не округляется или изменяется из-за проблем с плавающей точкой. Это точное значение х строки и, к сожалению, оно больше, чем жестко B SX, который является 28.3705:

83.52 27.891 m 92.39999999999999 27.891 l s

92.39999999999999 27.891 m 92.39999999999999 28.371 l s

92.39999999999999 28.371 m 83.52 28.371 l s

83.52 28.371 m 83.52 27.891 l s

Координаты страницы идут как 842 x 595,2 в соответствии с PDFX Измените просмотрщик из левого верхнего угла. Что кажется естественным, поскольку страница поворачивается. Не повернутый, это будет нижний левый угол, так что должно быть в порядке.


Когда текст изменяется с 1 0 0 1 90.72 28.3705 Tm в исходную ориентацию можно увидеть сворачивающуюся нижнюю линию с линией слева:

чего я и ожидал, так как B 's y это 28.3705 и и горизонтальное положение линии 28.371 (как видно из второй строки приведенных выше строк кода). Так что, вероятно, B Нижняя граница выходит за рамки 28.371 но я не мог увеличить это.

Теперь, где разрыв между линией и B откуда на первой картинке? Это важно для меня, потому что я пытался выяснить, какая ближайшая линия слева B и был удивлен двумя значениями, а именно предполагаемым значением x текста, который я получаю из pdftoxml.exe, который 28.3705 и линии горизонтальное значение 28.371, Так как я знал, что линия на самом деле далеко за пределами левой B это не может быть правильно, по крайней мере, в смысле "занять позицию х строки, взять позицию х Б, сравнить, и если х строки меньше, чем B 's x, строка слева ".

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

Это код рисования текста:

BT
%0 7.5 -7.5 0 90.72 28.3705 Tm
0 1 -1 0 90.72 28.3705 Tm
%1 0 0 1 90.72 28.3705 Tm
/F1 1 Tf
1 Tr
q
0.01 w
(B) Tj
Q
ET

Таким образом, ничего не происходит с размером B или толщиной линии.

Можете ли вы помочь мне разобраться?


Это обновленная картинка с двумя I нарисовано на той же странице, для верхнего I с помощью 0 1 -1 0 90.72 28.3705 Tm (повернуто на 90 градусов математически), для нижнего 1 0 0 1 90.72 28.3705 Tm, Так что я не понимаю, как ниже I повернутый +90 и заканчивает тем, что был верхним?

Вот код PDF. Он довольно большой, но вы должны иметь возможность скопировать его в свой файл и назвать его sth.pdf.

Пример PDF (вам нужно действительно увеличить левый верхний угол, чтобы увидеть I )

РЕДАКТИРОВАТЬ Я на самом деле нашел некоторую интересную информацию о нахождении ограничивающей рамки глифа, но я пока не мог собрать кусочки вместе.

1 ответ

Пожалуйста, посмотрите на

Метрика глифа

Источник глифа - это точка (0, 0) в системе координат глифа. Tj и другие операторы отображения текста должны располагать начало первого глифа, который будет нарисован, в начале текстового пространства.

(бесстыдно скопировано с рисунка 39, раздел 9.2.4 ISO 32000-1).

Как вы можете видеть, координаты, где расположен глиф, источник глифа, не обязательно должны начинаться с фактического ограничивающего прямоугольника глифа. Это может объяснить пробел в вашем первом изображении.

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

Для более глубокого анализа предоставьте данные шрифта.

РЕДАКТИРОВАТЬ свой двойной вопрос... в своем комментарии выше вы сказали, что действительно ожидали увидеть общую точку - точку поворота - в обоих символах I, чтобы вы могли получить надежную горизонтальную координату для левой ограничительной рамки персонажа.

двойная ситуация

Разве точка пересечения красных линий не является вашей точкой вращения? Это должно быть начало глифа для обеих операций Tj, и I-глифы имеют свое происхождение там. Теперь вы можете измерять с этого момента.

Другие вопросы по тегам