首页 > 解决方案 > 如何强制 PDFsharp 仅嵌入字体的子集?

问题描述

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

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

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

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

查看 PDFsharp 资源,我发现了该功能

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

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

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

标签: pdfpdf-generationpdfsharpmigradocfont-embedding

解决方案


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


推荐阅读