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



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

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

我可以使用什么特殊设置吗 有人能告诉我正确的方向吗

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

通过查看PDFsharp来源,我发现了功能

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

评论如下:创建一个新的字体图像,该图像是仅包含指定字形的字体图像的子集这正是我想要在这里使用的。

我不明白的是,为什么在创建PDF时似乎没有使用这个功能。要使其发挥作用,需要满足哪些标准

刚刚找到了一个解决我的问题的方案,不需要大量摆弄额外的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。哈哈!!!

有些字体有"loca表",有些则没有。loca表存储字形在字体中位置的偏移量。

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

最新更新