Поворот текста в 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 для прямоугольника из 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 )

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


person panny    schedule 30.01.2013    source источник
comment
выглядит довольно общим сравнением с плавающей запятой и проблемами округления, поэтому они были изменены.   -  person dwarring    schedule 30.01.2013
comment
Я не думаю, что есть проблема с числами, хотя они выглядят некрасиво, но это не проблема для рисования линий или кругов в pdf. а также число 28.3705 жестко закодировано в источнике pdf, а число 28.371 было рассчитано 27.891 + 0.48, и это правильный ответ.   -  person panny    schedule 30.01.2013
comment
Справедливо. Между прочим, вот что говорится в спецификации PDF 1.7 о представлении с плавающей запятой: Real 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.2013
comment
Я не знаю... может быть. Цифры такие маленькие. Разница между двумя картинками выглядит примерно так: ~ 0.1, принимая нижний левый угол B. Наверху больше, чем 28.4, а внизу, вероятно, 28.3705. Не будет ли это слишком много для проблемы округления? Может что-то с вращением, но когда я поворачиваю нижнюю картинку B в голове вверх, она не прыгает на 0.1 вправо автоматически?   -  person panny    schedule 30.01.2013
comment
Возможно, на вас также влияет разрешение того, что вы используете для вывода/отображения PDF. Он просто не может точно показать такие маленькие различия?   -  person dwarring    schedule 30.01.2013
comment
На самом деле это показывает разницу fwics - только почему такая разница? Справедливости ради, вы правы, мой зритель показывает много, но не так много, как хотелось бы. Я пропускаю точные значения для точки, так как это трудно сказать по линейкам.   -  person panny    schedule 30.01.2013
comment
Относительно вашей двойной I-графики --- пожалуйста, опубликуйте PDF-файл и подробно объясните, что вас удивляет.   -  person mkl    schedule 30.01.2013
comment
@mkl Я включил для вас ссылку, пожалуйста, посмотрите, сможете ли вы скачать.   -  person panny    schedule 30.01.2013
comment
@panny Я только что посмотрел твой PDF. Начнем с того, что в вашем потоке контента есть ошибки, на первый взгляд: 1. Вы используете специальные операторы графического состояния (q и Q) внутри текстового объекта, который не разрешено (см. рис. 9, раздел 8.2, ИСО 32000-1); 2. У вас есть неиспользованная цифра 7 в начале первого текстового объекта. И, пожалуйста, объясните, что вы ожидали увидеть вместо этого.   -  person mkl    schedule 30.01.2013
comment
@mkl спасибо, что посмотрели. О, извините, да, 7 была просто ошибкой, извините. Его следует удалить. Я не думал об операторах состояний, но спасибо за подсказку. На самом деле я не после создания pdf, это просто распечатка для проверки человеческого глаза. Я ожидал увидеть общую точку — точку вращения — в обоих символах I, чтобы я мог получить надежную горизонтальную координату для левой стороны ограничивающей рамки символа. У вас есть идеи, как это узнать? Программа для чтения pdf, очевидно, может разместить текст в правильном месте, действительно ли она вычисляет его из шрифта?   -  person panny    schedule 30.01.2013
comment
@danny Точка вращения должна быть началом глифа, не так ли? Я дополнил свой ответ отредактированной копией вашего изображения, указывающей на общее происхождение глифов I-глифов. PdfReaders просто преобразуют глифы в пользовательское пространство, происхождение глифа, т.е. (0, 0) в системе координат глифа сопоставляется с вашим (90,72, 28,3705), и глиф рисуется соответственно вашему (0, 1, -1 , 0) и (1, 0, 0, 1) соответственно и размер шрифта   -  person mkl    schedule 30.01.2013
comment
спасибо мкл! Это огромная помощь. Мне нужно подумать об этом, я не могу понять, как делать расчеты. вернемся к этому позже.   -  person panny    schedule 30.01.2013
comment
@mkl Вы знаете, почему происхождение глифа определено немного левее, чем ограничивающая рамка? Есть ли в этом особый смысл?   -  person panny    schedule 31.01.2013


Ответы (1)


Пожалуйста, взгляните на

Показатели глифов

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

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

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

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

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

ИЗМЕНИТЬ относительно вашего вопроса с двойным I... в своем комментарии выше вы говорите, что на самом деле ожидали увидеть общую точку - точку вращения - в обоих символах I, поэтому вы может получить достоверную горизонтальную координату для левой стороны ограничивающей рамки символа.

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

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

person mkl    schedule 30.01.2013
comment
Спасибо за эту хорошую иллюстрацию точки вращения. Поскольку в спецификации pdf указано, что начало глифа находится в текстовом пространстве, эта точка имеет координаты (28.3705, 90.72). Тем не менее, нет способа получить координаты ограничивающей рамки, то есть расстояние зазора? - person panny; 31.01.2013