如何强制PDFsharp仅嵌入字体的子集?

时间:2018-07-30 14:09:41

标签: pdf pdf-generation pdfsharp migradoc font-embedding

我能够使用PDFsharp和MigraDoc成功创建PDF文件。 两个私有字体(OTF格式)用于创建单页PDF。创建的PDF包含完全嵌入的两种字体。 不幸的是,每种字体也都包含中文字母,因此每个字体大小约为4 MB,导致PDF文件大小约为9 MB(仅包含一页文本!)。 :shock:

是否可以使用这些字体的子集来节省宝贵的空间。 关键是我需要创建几千个PDF文件,因此文件大小至关重要。

我可以使用特殊设置吗? 有人能指出我正确的方向吗?

更新: 我使用fontforge提取嵌入的字体subgroub,发现从pdf派生的字体与完整的字体文件完全匹配。 因此,根本没有使用字体子集。 :(

看看PDFsharp的源代码,我发现了该函数

public OpenTypeFontface CreateFontSubSet(Dictionary<int, object> glyphs, bool cidFont)

,其注释如下:创建一个新的字体图像,它是此字体图像的子集,仅包含指定的字形。 这正是我要在这里使用的。

我不明白的是为什么创建PDF时似乎不使用此功能。 要使其生效,需要满足哪些条件?

2 个答案:

答案 0 :(得分:1)

有些字体有一个“位置表”,有些则没有。 loca表存储字体中字形位置的偏移量。

CreateFontSubSet是并且只能用于带有loca表的字体,该表提供创建子集所需的信息。

答案 1 :(得分:0)

刚刚找到了解决我的问题的方法,不需要额外摆弄其他pdf框架。我能够使用ghostscript(命令行)创建字体子集。

实际上,ghostscript会获取(pdfsharp-)生成的文件并重写它(同时优化字体)。这里是命令行解决方案:

gswin64 -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dCompressFonts=true -dSubsetFonts=true -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=optimized.pdf -c ".setpdfwrite <</NeverEmbed [ ]>> setdistillerparams" -f my_pdfsharp.pdf

我的文件大小约为9 MB,现在降至51 KB。 Yihaa !!!