【问题标题】:PDF calculate Glyph sizesPDF 计算字形大小
【发布时间】:2010-10-20 11:03:47
【问题描述】:

我(认为)在 PDF 中具有文本渲染的所有值。

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

我的问题是我不知道如何处理这些值。我浏览了 PDF Spec 1.7 几次,找不到公式来计算 PDF 中每个字形的实际像素大小。能给我一个提示吗?

谢谢。

【问题讨论】:

  • 您想做什么?您的问题与 iphone、quartz-graphics 和线性代数有什么关系?

标签: iphone pdf ios quartz-graphics linear-algebra


【解决方案1】:

你想做什么?渲染 PDF 是一项繁重的工作,您还需要考虑行距、文本提升、字距调整、CTM 和其他几个因素。

【讨论】:

  • 我正在尝试突出显示文本。我使用 Quartz 2D 方法成功解析了 PDF。我想我掌握了所有信息,现在我必须做一些数学来找出一些文本/单词的“CGRects”。
【解决方案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')   

我花了一周的时间来理解它......

【讨论】:

【解决方案3】:

如果您只想突出显示文本,则无需计算文本。您可以向页面添加任意数量的内容对象(矩形、图像、线条、半透明的东西)并重新计算 PDF 结构。这真的很简单。询问您的鼠标选择坐标))

【讨论】:

    【解决方案4】:

    这些值旨在正确排版类型,而不是绘制字形,因此您无法从这些属性中获得每个字形的确切像素大小。获得字形精确像素尺寸的唯一方法是将字形绘制到图像中并分析该图像。

    FontBBox(字体边界框)是容纳每个字形的最小框。 Widths Array 包含有关每个字符应绘制多远的信息,而不是实际字形图像大小。某些字体会绘制一些超出该宽度的字形。

    当您在典型的文本编辑器中突出显示文本时,突出显示将是字体的整个高度以及每个字符的宽度。这个高亮是通过从 Widths Array 中获取 FontBBox 高度和每个字符的宽度,并转换这些值以匹配当前字体的属性(大小等)来实现的。这些信息足以让您的应用绘制类型类似于典型应用。

    【讨论】:

    • 如何将 FontBBox 值转换为设备空间值(实际像素值)?
    • FontBBox 和 Widths 值位于 FontMatrix 指定的字形空间中。通过连接字体矩阵和文本空间构建一个转换矩阵,将 FontBBox 值映射到设备空间。
    • 你有一个精确的公式来计算 FontBBox-Height + Width-Array 到设备空间,我可以得到字符大小吗?
    猜你喜欢
    • 2021-03-07
    • 2012-03-08
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多