PDF计算字形尺寸
我认为在PDF中具有文本渲染的每个值。PDF计算字形尺寸
* Position (Text Matrix)
* FontDescriptor with Widths Array
* FontBBox
* StemV/StemH
* FontName
* Descent
* Ascent
* CapHeight
* XHeight
* ItalicAngle
我的问题是我不知道如何处理这些值。我经历了PDF Spec 1.7几次,无法找到一个公式来计算PDF中每个字形的实际像素大小。你能给我一个提示吗?
谢谢。
这些值被设计为正确排版类型,而不是绘制字形,因此您无法从这些属性中获取每个字形的确切像素大小。获得字形的精确像素尺寸的唯一方法是将字形绘制到图像中并分析该图像。
FontBBox(字体边界框)是将保存每个字形的最小框。宽度数组保存有关每个字符应该相隔多远的信息,而不是实际的字形图像大小。一些字体会画出一些大于这个宽度的字形。
当您在典型的文本编辑器中突出显示文本时,突出显示将是字体的整个高度以及每个单独字符的宽度。通过获取FontBBox高度以及Widths数组中每个字符的宽度,并将这些值转换为与当前字体的属性(大小等)相匹配,即可实现此高光。这些信息足以使您的应用程序像典型的应用程序一样绘制。
你想做什么?渲染PDF是一项很多工作,您还需要考虑领先,文本提升,字距调整,CTM和其他几个因素。
我想突出显示一段文字。我用Quartz 2D方法成功解析了PDF。我想我掌握了所有的信息,现在我必须做一些数学来找出一些文字/单词的“CGRects”。 – andidol 2010-10-21 10:05:53
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')
我花了一周时间,去了解它...
有没有机会实现iOS的选择和高亮文本?或者这只是基本的解释? – 2014-11-12 19:08:25
有很多关于选择和突出显示的信息http://stackexchange.com/search?q=select+pdf+text+ios – 2014-11-13 20:39:28
如果你只想突出显示文本,它没有必要计算的文本。您可以添加尽可能多的内容对象到页面(矩形,图像,线条,半透明的东西)并重新计算PDF结构。这非常简单。问你的鼠标有关选择坐标))
你想要做什么,你的问题与iPhone,石英图形和线性代数有关怎么样? – Bobrovsky 2010-10-21 00:22:49