gpt4 book ai didi

pdf - TrueType 字体的 StemV 值

转载 作者:行者123 更新时间:2023-12-04 19:48:59 27 4
gpt4 key购买 nike

我将 TrueType 字体嵌入到 pdf 中,因此需要为其创建描述符字典。
必填字段包括 StemV 而且我还没有在 ttf 中找到存储此信息的位置。
我想我在某处看到了一个提示,它是 CVT 的一部分。程序,但没有什么具体的。

所以,我的问题是如何找出给定 TrueType 字体的 StemV 值。我想直接从 ttf 文件中读取这个值(而不是使用 ie windows API),因为我想编写跨平台解决方案。

更新 :

Grep-ed LibreOffice 5.1.0.3 源,似乎在导出为 pdf 时,FontDescriptor生成于 vcl/source/gdi/pdfwriter_impl.cxx , 方法 PDFWriterImpl::emitFontDescriptor() .在那里,第 3888 行附近是以下代码:

// According to PDF reference 1.4 StemV is required
// seems a tad strange to me, but well ...
aLine.append( "\n"
"/StemV 80\n" );

现在的问题是为什么是 80 ,不是 42 ?说真的,如果像 LibreOffice 这样的项目使用硬编码常量,它似乎表明该值要么没有存储到字体文件中,要么读取它的成本非常高(即需要实现 TrueType 字体引擎来解释字体程序)。

顺便说一句,对于那些想知道这个 StemV 是什么的人 - 在“PDF 引用
第六版”它被描述为“在水平方向上测量的字体中主要的字形垂直词干的厚度”。

最佳答案

根据 ISO 32000-1:2008,而 StemH是可选的,StemV是必需的(见表 122)。唉,对于从哪里获取这些数据似乎没有明确的共识。

该变量可能源自 Adob​​e 的原始 Type 1 (CFF) 字体格式:

The entry StdVW is an array with only one real number entry expressing the dominant width of vertical stems (measured horizontally in character space units). Typically, this will be the width of straight stems in lower case letters. (For an italic font program, give the width of the vertical stem measured at an angle perpendicular to the stem direction.) For example:

/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 )

The StemV value is not used by the PDF engine if the embedded font is either a Type 1 or CFF font; in that case the value from the private dictionary gets used. For a CID font, the value associated with the glyph's font DICT gets used.

In case there is no StemV value in the PDF, the following algorithm applies ...



这增加了困惑,因为它在 PDF 规范中被标记为“必需”。

其他一些工具包的尝试

Apache FOP 注释在其“目标”下 字体

.. if [important], parse the .pfb file to extract it when building the FOP xml metric file ..



( 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 中。

大虾PDF 只是说 ( http://prawnpdf.org/docs/0.11.1/Prawn/Font/TTF.html )

stemV()
not sure how to compute this for true-type fonts...



中的 TrueType 嵌入器Apache 字体框 做出有根据的猜测:

// 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 tables, and PDF's StemV value

From: John Bley
Date: Tue, 16 Jun 1998 17:09:19 GMT
When embedding a TrueType font in PDF, I require a vertical stem width value - I can get all the other values (ascent, descent, italic angle, etc.) that I need from various .ttf tables, but I can't seem to locate or calculate the average or normal vertical (or horizontal) stem width anywhere. By watching an embedded PDF font, I know that the "hint" in the 'OS/2' table is not enough - it's a highly precise value, not a 1-10 kind of scale. Any clues? Thanks for your time!

The value is not in TrueType fonts. You have to calculate it by analysis of, say, the cap I glyph. Don't worry too much about putting in a precise value: the value will only ever be used if the font is not present with the PDF file, when a vaguely similar font will be used instead. -- Laurence



( http://www.truetype-typography.com/ttqa_1998.htm )

“'OS/2' 表”提示大概是 usWeightClass .虽然它的值定义在 100 到 900 的范围内,但这不是一个连续的范围。只使用了整个 100ths,所以它是 1-9 的比例(而不是上面问题中提到的 1-10)。比例来自 Microsoft 的字体定义,它只有这 9 个不同的值。 (注意 ft_font.h 文件只列出了 8 个预定义的词干值。还有一个问题。)

一个(不确定的)InDesign 测试

使用 Adob​​e InDesign CS4,我使用 Light、Regular 和 Bold 中的 Aller 字体以及常规、Bold 和 Black 粗细中的 Arial(这些都是 TTF 字体)创建了一个小型测试 PDF,发现 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值(value)。经过测试,我发现它确实如此: 79 StdVW .非常值得注意:InDesign 确实 不是 使用此值但将其导出为 /StemV 80反而。 Minion Pro Bold 的值 128 是正确的,但在这一点上,我确信这可能纯属巧合。由于这两个已经不同,我没有进一步的动力去检查 Minion Pro Semibold 或 Minion Black。

TL,DR 摘要:
  • 如果您嵌入的是 Type 1 (CFF) 字体,您可以随意填写,实际值将从字体数据中读取
  • ...除非它不在那里。
  • 如果您要嵌入 TrueType 字体,则需要提供一个合适的值。

  • 最糟糕的解决方案似乎是阅读 usWeightClass从 OS/2 header 中提取出来,并将其直接映射到一个合理的值。

    关于pdf - TrueType 字体的 StemV 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35485179/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com