【问题标题】:Embed JPG data properly in PDF files generated by Inkscape在 Inkscape 生成的 PDF 文件中正确嵌入 JPG 数据
【发布时间】:2025-12-02 03:15:01
【问题描述】:

有一个bug in Inkscape,其中包含在 SVG 文档中的 JPEG 图像在导出为 PDF 文件时作为位图而不是 JPEG 嵌入。

结果是文件大小大幅增加。例如,我有一个简单的 SVG 绘图,其中包含 2 MB JPEG 图像;导出为 PDF 会生成一个 14 MB 的文件。

我正在寻找解决方法。有没有办法通过插入正确编码的 JPG 图像来修复生成的 PDF,也许是通过某种 pdftk 技巧?

(在我的情况下,生成的 PDF 将作为图形包含在使用 pdflatex 呈现的 LaTeX 文档中,因此除了直接修复 Inkscape 生成的 PDF 之外,可能还有其他解决方法。)

【问题讨论】:

  • 最终在 Inkscape 0.91 中修复。

标签: pdf jpeg inkscape


【解决方案1】:

其中一个方法是使用pdf2ps 后跟ps2pdf,这会将位图数据重新编码为JPEG:

pdf2ps made-by-inkscape.pdf foo.ps
ps2pdf foo.ps smaller-file.pdf

对于我的测试用例,文件大小为:

original JPEG           2.1M
made-by-inkscape.pdf   15M
foo.ps                104M
smaller-file.pdf        1.5M

当然,这涉及重新编码 JPEG 数据,最好避免。

【讨论】:

  • 注意ps2pdf可以将pdf作为输入,不需要先生成ps文件。
【解决方案2】:

我发现使用 Inkscape 0.48.1 导出到 EPS,并将生成的 EPS 文件传递​​给 epstopdf script,会产生良好的结果。 PNG/JPG 文件在 PDF 文件中保留 PNG/JPG,字体看起来不错,等等。

【讨论】:

  • 这对我来说在 Inkscape 0.48.4(Ubuntu 14.04 中的库存)上效果不佳。用 305604 字节的 JPEG 创建了一个准平凡的 SVG。导出为 PDF 产生 2414085 字节,pdfimages -j 提取 2904016 字节 PPM。导出到 EPS 产生 28295129 字节。 epstopdf(在 Ubuntu 包 texlive-font-utils 中)生成 1223973 字节的 PDF。 pdfimages -j 提取 821634 字节的 JPEG。结论:它已被重新编码。