根据 ISO 32000-1:2008,StemH 是可选的,StemV 是必需的(参见表 122)。唉,对于从哪里获取这些数据似乎没有明确的共识。
该变量可能源自 Adobe 最初的 Type 1 (CFF) 字体格式:
条目StdVW 是一个只有一个实数条目的数组
表示垂直茎的主要宽度(水平测量
以字符空间为单位)。通常,这将是宽度
小写字母的直词干。 (对于斜体字体程序,
给出以垂直角度测量的垂直茎的宽度
到词干方向。)例如:
/StdVW [85] def
(Adobe Type 1 字体格式,1993 年 2 月,1.1 版,第 42 页)
这是/Private CFF 字体字典中的一个可选条目。
但是,Werner Lemberg 指出 (http://blog.gmane.org/gmane.comp.fonts.freetype.devel/month=20130601)
如果嵌入字体,则 PDF 引擎不使用 StemV 值不
是 Type 1 或 CFF 字体;在这种情况下,来自
私人词典被使用。对于 CID 字体,关联的值
使用字形的字体 DICT。
如果PDF中没有StemV值,下面的算法
适用...
这增加了混乱,因为它在 PDF 规范中被标记为“必需”。
其他一些工具包的尝试
Apache FOP 在其字体
下的“目标”中注明
..如果[重要],则在构建 FOP xml 度量文件时解析 .pfb 文件以提取它..
(http://www.cs.helsinki.fi/group/xmltools/formatters/fop/fop-0.20.5/build/site/dev/fonts.html)
PDFLib使用FreeType,头文件ft_font.h包含一个列表:
+---------------------------------------------------------------------------+
Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. |
+---------------------------------------------------------------------------+
(.. omitted..)
/*
* these defaults are used when the stem value
* must be derived from the name (unused)
*/
#define FNT_STEMV_MIN 50 /* minimum StemV value */
#define FNT_STEMV_LIGHT 71 /* light StemV value */
#define FNT_STEMV_NORMAL 109 /* normal StemV value */
#define FNT_STEMV_MEDIUM 125 /* mediumbold StemV value */
#define FNT_STEMV_SEMIBOLD 135 /* semibold StemV value */
#define FNT_STEMV_BOLD 165 /* bold StemV value */
#define FNT_STEMV_EXTRABOLD 201 /* extrabold StemV value */
#define FNT_STEMV_BLACK 241 /* black StemV value */
注意“未使用”。此列表也仅出现在旧版本的 FreeType 中。
PrawnPDF 只是说 (http://prawnpdf.org/docs/0.11.1/Prawn/Font/TTF.html)
stemV()
不知道如何为真字体计算这个...
Apache FontBox 中的 TrueType 嵌入器做出有根据的猜测:
// StemV - there's no true TTF equivalent of this, so we estimate it
fd.setStemV(fd.getFontBoundingBox().getWidth() * .13f);
(https://pdfbox.apache.org/download.cgi) - 我觉得我必须补充一点,有总比没有好,但只有很小的差距。对于大多数字体来说,词干宽度和边界框之间的关系并不是这么简单的。还有一些著名的字体会“向内”变胖,因此它们的边界框实际上具有完全相同的值。
进一步的搜索让我回到了 1998 年的一篇 UseNet 帖子:
.ttf 表格,以及 PDF 的 StemV 值
发件人:约翰·布莱
日期:格林威治标准时间 1998 年 6 月 16 日星期二 17:09:19
在 PDF 中嵌入 TrueType 字体时,我需要一个垂直词干宽度值 - 我可以从各种 .ttf 表中获取我需要的所有其他值(上升、下降、斜体角度等),但我似乎无法定位或计算任何地方的平均或正常垂直(或水平)茎宽度。通过查看嵌入的 PDF 字体,我知道“OS/2”表中的“提示”是不够的——它是一个高度精确的值,而不是 1-10 的比例。有什么线索吗?感谢您的宝贵时间!
值不是 TrueType 字体。你必须通过分析,比如说,cap I glyph 来计算它。不要太担心输入一个精确的值:只有在 PDF 文件中不存在该字体时才会使用该值,而此时将使用一种模糊相似的字体。 -- 劳伦斯
(http://www.truetype-typography.com/ttqa_1998.htm)
“'OS/2'表”提示大概是usWeightClass。虽然它的值定义在 100 到 900 的范围内,但这不是一个连续的范围。仅使用整个 100,因此它是 1-9 的比例(不是上面问题中提到的 1-10)。比例源自微软的字体定义,它只有这 9 个不同的值。 (请注意,ft_font.h 文件仅列出 8 个预定义的词干值。还有一个问题。)
一个(不确定的)InDesign 测试
使用 Adobe InDesign CS4,我创建了一个小型测试 PDF,使用 Light、Regular 和 Bold 字体的 Aller,Regular、Bold 和 Black 粗体的 Arial(这些都是 TTF 字体)并发现 InDesign 写出了 StemV 的作为
Aller-Light 68
Aller-Regular 100
Aller-Bold 144
Arial 88
Arial-Bold 136
Arial-Black 200
这表明 InDesign 使用某种启发式方法来计算每个单独字体的字干宽度,而不依赖于基于固定权重的表格。它不像“大写'I'的宽度”那么简单,分别是69、102、147(Aller)和94.7、144.5、221.68(Arial)设计单位。我特意用无衬线字体进行了测试,因为衬线字体上的衬线需要估计字形一半的宽度。
我使用 InDesign CC 2014 导出了相同的文档并获得了完全相同的值。我对如何找出 InDesign 从何处获取这些值没有进一步的想法。
(稍后添加:)Minion Pro 是 CFF 风格的 OpenType 字体,因此它可能包含有效的 StdVW 值。经过测试,我发现确实如此:79 StdVW。非常值得注意:InDesign 不使用此值,而是将其导出为 /StemV 80。 Minion Pro Bold, 128, 的值是正确的,但在这一点上,我很肯定这可能纯属巧合。由于这两个已经不同,我没有进一步的动力去检查 Minion Pro Semibold 或 Minion Black。
TL、DR 总结:
- 如果您嵌入的是 Type 1 (CFF) 字体,您可以随意填写,实际值将从字体数据中读取
- 如果您要嵌入 TrueType 字体,则需要提供合适的值。
最糟糕的解决方案似乎是从 OS/2 标头中读取 usWeightClass 并将其直接映射到一个合理的值。