2010-10-20 3 views
3

Я (думаю) имеет все значения для текстового рендеринга в PDF.PDF вычислить размеры глифов

* Position (Text Matrix) 
* FontDescriptor with Widths Array 
* FontBBox 
* StemV/StemH 
* FontName 
* Descent 
* Ascent 
* CapHeight 
* XHeight 
* ItalicAngle 

Моя проблема: я не знаю, что делать с этими значениями. Я несколько раз просматривал PDF Spec 1.7 и не могу найти формуляр для вычисления реальных размеров пикселей каждого глифа в PDF. Можете ли вы дать мне подсказку?

спасибо.

+1

Что вы пытаетесь сделать и как ваш вопрос связан с iphone, кварцевой графикой и линейной алгеброй? – Bobrovsky

ответ

0

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

FontBBox (ограничитель шрифта) - это самая маленькая коробка, в которой будет храниться каждый символ. Массив Widths содержит информацию о том, как далеко друг от друга должен быть нарисован каждый символ, а не фактический размер изображения глифа. Некоторые шрифты будут рисовать некоторые глифы, превышающие эту ширину.

Когда вы выделяете текст в типичном текстовом редакторе, подсветкой будет полная высота шрифта и ширина каждого отдельного символа. Это подчеркивание достигается путем получения высоты FontBBox и ширины каждого символа из массива Widths Array и преобразования этих значений в соответствии с атрибутами текущего шрифта (размером и т. Д.). Эта информация достаточна для того, чтобы ваш тип приложения рисовал, как обычные приложения.

+0

Как преобразовать значения FontBBox в значения пространства устройства (реальные значения пикселей)? – andidol

+0

Значения FontBBox и Widths находятся в пространстве глифов, как определено FontMatrix. Постройте матрицу преобразований путем конкатенации матрицы шрифтов и текстового пространства, чтобы отобразить значения FontBBox в пространстве устройства. –

+0

У вас есть формула excact для вычисления FontBBox-Height + Width-Array в пространстве устройства, чтобы я мог получить размеры символов? – andidol

3

Что вы пытаетесь сделать? Рендеринг PDF - это большая работа, и вам также необходимо учитывать ведущий, текстовый рейз, кернинг, CTM и ряд других факторов.

+0

Я пытаюсь выделить текст. Я тщательно разбирал PDF с помощью кварцевых 2D-методов. Я думаю, что у меня есть всякая информация, теперь мне нужно сделать некоторую математику, чтобы узнать «CGRects» некоторых текстов/слов. – andidol

2
Position:  (optional, you can avoid it) 
Text Matrix: (optional, you can avoid it) 
Widths Array: (use empty array [], PDF can read it directly from CFF (FontFile3 stream)) 
FontBBox:  font file->'CFF ' table->Top DICT INDEX->DICT-> 4 operands for 'FontBBox'  operator 
StemV:  (optional, you can avoid it) 
StemH:  (optional, you can avoid it) 
FontName:  font file->'name' table->records 
     or: font file->'CFF ' table->Top DICT INDEX->string by index 0 for 'fonts names' operator 

Descent:  font file->'hhea' table->'Descender' parameter 
Ascent:  font file->'hhea' table->'Ascender' parameter 
CapHeight: font file->'OS/2' table->'sCapHeight' parameter 
XHeight:  font file->'OS/2' table->'sxHeight' parameter 
ItalicAngle: font file->'OS/2' table->'sxHeight' parameter 

На самом деле вы можете рассчитать массив Widths. Для каждого знака:

Decoding array(PDF) -> Glyph name (PDF) -> Glyph index (CFF table of font file) -> table 'hmtx' -> Glyph 'hMetrics'[Glyph index] = array ('advanceWidth', 'leftSideBearing') 

Я провел неделю, чтобы понять это ...

+0

У вас есть возможность реализовать выделение и выделение текста для iOS? или это просто базовое объяснение? –

+0

Существует много информации о выборе и подсветке http://stackexchange.com/search?q=select+pdf+text+ios –

1

Если вы хотите просто выделить текст, это не обязательно вычислять текст. Вы можете добавить столько, сколько хотите объекты контента на страницу (прямоугольник, изображение, линия, полупрозрачный материал) и пересчитать структуру PDF. Это действительно просто. Задайте свою мышку о координатах выбора))

Смежные вопросы