合并重复的嵌入字体

合并重复的嵌入字体

我在我的 LaTeX 文档(使用 pdflatex 创建)中使用了许多 PDF 图像(从 SVG 转换而来)。

我注意到我的最终文档中有很多重复的嵌入子集字体。我知道这是由于使用的图像造成的。

经过一番搜索,我发现合并嵌入字体很麻烦。我不太明白为什么,因为一个工具可以合并这些子集,删除所有具有相同编码的条目并相应地修改文本块(但我们不要进一步讨论这个问题,我会相信互联网 :) )。我放弃了嵌入子集字体。

现在我重新生成了所有图像,确保它们没有字体的子集,但包含完整的字体。(我用检查过了pdffonts。)

再次构建文档后,它仍然具有重复的(非子集)字体:

$> pdffonts mydoc.pdf
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
...
DejaVuSans                           TrueType          WinAnsi          yes no  yes   1066  0
DejaVuSans-Bold                      TrueType          WinAnsi          yes no  yes   1067  0
DejaVuSans                           TrueType          WinAnsi          yes no  yes   1117  0
DejaVuSans-Oblique                   TrueType          WinAnsi          yes no  yes   1118  0
DejaVuSans                           TrueType          WinAnsi          yes no  yes   1136  0
DejaVuSans-Oblique                   TrueType          WinAnsi          yes no  yes   1137  0
DejaVuSans-Oblique                   TrueType          WinAnsi          yes no  yes   1243  0
...

我的问题是:为什么会有重复的字体?!pdflatex 删除这些重复的字体应该很容易...还是我需要为 pdflatex 提供一些标志?或者在我的文档中添加一个包?

更新

可以下载所请求的文档这里并使用以下方式构建:

\documentclass{article}
\usepackage{graphicx}

\begin{document}
\includegraphics{image1}
\includegraphics{image2}
\end{document}

如果需要,可以找到包括测试图像和 SVG 原件的完整项目这里

PDF 图像包含文本“Image1”和“Image2”,并且均完全嵌入字体。 pdffonts显示最终文档的以下信息:

$ pdffonts mydoc.pdf 
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
SDXKYB+CMR10                         Type 1            Builtin          yes yes no       6  0
DejaVuSans                           TrueType          WinAnsi          yes no  yes     11  0
DejaVuSans                           TrueType          WinAnsi          yes no  yes     17  0

DejaVuSans 嵌入了两次,每次嵌入一个使用的图像。我的真实文档包含大量图像,因此问题更加严重...

我不知道这是否有趣,但 pdflatex 说:

这是 pdfTeX,版本 3.1415926-2.5-1.40.14(TeX Live 2013/Debian)

答案1

pdfTeX 程序仅合并 Type 1(或 Type 1C)格式的字体。image1.pdfimage2.pdf包含 TrueType 字体。从 pdfTeX 的来源来看pdftoepdf.cc

static void copyFont(char *tag, Object * fontRef)
{
    ...
    // Only handle included Type1 (and Type1C) fonts; anything else will be copied.
    // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true.
    ...
}

答案2

我发现了一个有趣的问题,可以找到解决这个问题的方法,并且仍然允许您使用字体子集:

正如您已经发现的,合并字体子集并不是一件容易实现的事情(至少对于开源软件来说)。

但是由于您拥有原始 SVG,因此还有另一种解决方案:将它们合并为多页 PDF。事实上,如果您设法这样做,则只会创建一个子集:一个包含不同 SVG 中包含的所有字符的字形的子集,并且 LaTeX 只会将其嵌入一次。

您现在的目标是正确生成多页 PDF...我没能找到一个可以正确执行此操作的命令行,但这肯定是可行的。我找到的最佳解决方案是,rsvg-convert但出于某种原因,它会生成多页 PDF,其中所有页面的大小相同,从而破坏您的图像格式:

rsvg-convert -a -f pdf -o images.pdf *.svg

因此,让我们假设您成功地从 SVG 中生成了多页 PDF,然后您只需像这样调用您的图像:

\includegraphics[page=1]{images.pdf}
\includegraphics[page=2]{images.pdf}

希望这可以帮助 ;)

2016 年 8 月 18 日更新

经过大量调查,我未能找到任何好的命令来从 SVG 创建多页 PDF,并且生成的 PDF 中的页面大小会有所不同。

因此,我最终决定根据rsvg-convert工作原理创建自己的命令。它可在此处获得:https://github.com/pimpreneil/svgstopdf

这个命令非常简单,语法如下:

svgstopdf *.svg out.pdf

使用此命令与上述 LaTeX 代码片段结合,您将能够将所有 SVG 集成到 LaTeX 文档中,而无需任何字体子集重复!

2016 年 8 月 19 日更新

因为我发现使用页面的这种语法很难弄清楚包含了哪个图像,所以我--latex-package在命令中添加了一个附加选项,以便生成一个更容易集成的 LaTeX 包:

svgstopdf 1.svg 2.svg out.pdf --latex-package

此命令将生成一个附加svgimages.sty文件,其中包含 includesvg 命令。加载图像的 LaTeX 代码现在将变为:

\usepackage{svgimages}

\includesvg{1.svg}
\includesvg{2.svg}

您甚至可以传递一些includegraphics支持的参数:

\includesvg[scale=0.8]{1.svg}

相关内容