Итак, у меня такая ситуация:
используя 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
для прямоугольника из adobe pdf 1.7 стр. 133). Здесь важно вычисление 27.891 + 0.48 = 28.371
, которое не округляется и не изменяется из-за проблем с плавающей запятой. Это точное значение x строки, и, к сожалению, оно больше, чем жестко запрограммированное значение x B
, равное 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
согласно просмотрщику PDFXChange из верхнего левого угла. Что кажется естественным, поскольку страница вращается. Без поворота это будет нижний левый угол, так что все должно быть в порядке.
Когда текст изменяется с помощью 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
, это не могло быть правильным, по крайней мере, не в том смысле, что «возьмите x позицию линии, возьмите x позицию B, сравните, и если x линии меньше, то чем x B
, линия находится слева".
Я не могу найти правильную строку со значениями 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
)
РЕДАКТИРОВАТЬ Я действительно нашел интересную информацию о поиске ограничения глифа коробку, но я еще не мог собрать воедино.
28.3705
жестко закодировано в источнике pdf, а число28.371
было рассчитано27.891 + 0.48
, и это правильный ответ. - person panny   schedule 30.01.2013Real objects represent mathematical real numbers. The range and precision of numbers may be limited by the internal representations used in the computer on which the conforming reader is running
- person dwarring   schedule 30.01.20130.1
, принимая нижний левый угол B. Наверху больше, чем28.4
, а внизу, вероятно,28.3705
. Не будет ли это слишком много для проблемы округления? Может что-то с вращением, но когда я поворачиваю нижнюю картинку B в голове вверх, она не прыгает на0.1
вправо автоматически? - person panny   schedule 30.01.2013