PDF рассчитать размеры глифа - PullRequest
3 голосов
/ 20 октября 2010

У меня (кажется) есть все значения для рендеринга текста в PDF.

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

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

Спасибо.

Ответы [ 4 ]

3 голосов
/ 21 октября 2010

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

2 голосов
/ 15 августа 2012
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

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

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

Я потратил НЕДЕЛЮ, чтобы понять это ...

1 голос
/ 15 августа 2012

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

0 голосов
/ 20 октября 2010

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

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

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

...