在 PDF 文件中重用图形资源
Reusing graphical assets in PDF files
作为包含基于浏览器的可视化编辑器的项目的一部分,我使用 fabric.js
创建 SVG 文件,然后将其转换为 PDF 文件。
在某些情况下,最终结果是生成的 PDF 文件在整个文档中多次出现相同的图像,这会导致大量不必要的文件膨胀,从而导致 PDF 文件非常大。
在 SVG 上,这可以通过使用单个 <image>
元素并将其与 <use>
元素一起重复使用来轻松解决(如我的 中所回答)。使用 Inkscape 将 SVG 转换为 PDF 格式,而 Inkscape 似乎没有 'get the hint',因为它会为文档中的每一次出现重新嵌入重复的图像。
Smallpdf.com 的 PDF 压缩工具似乎可以解决这个问题,但我不明白它是如何做到的;我也不能用 Inkscape 或我知道的任何其他工具复制这种优化。
是否有这种技术的名称,或者更好的方法让我自己复制它?我读到 PDF 中的 XObject
s 是适合此目的的工具,但我不知道如何自己实现它们,也找不到任何实际示例。
一般来说,PDF 确实通过使用 XObjects 以非常相似的方式提供了与 SVG 相同的功能。
XObject 可用于定义图像或一组图形运算符,否则它们将成为页面内容的一部分。它有一个名称和自己的内容流,并拥有自己的资源以使其成为一个独立的内容片段。然后可以使用 "Do" 运算符将此 XObject 包含在页面内容中,这与您在 SVG 中使用 "use" 描述的内容非常相似。
理论上,XObject 可以在 PDF 文件中出现一次,然后在整个文档中多次使用,而不会显着增加 PDF 文件的文件大小。是否发生这种情况取决于 PDF 创建库或 PDF 库的优化能力。
例如,Adobe PDF 库能够优化 PDF 文件,以便优化 XObjects 中出现的重复内容 - 然后保留 XObject 的单个副本,并且在页面描述中每次使用该 XObject 都指的是单个对象。我见过在可变数据场景中文件大小从数 GB 的数据减少到不到 1 MB 的示例。
要使用它,您需要:
- 重复内容实际上包含在 XObject 中的 PDF 文件
- 能够正确创建或足够智能优化 PDF 文件以利用此功能的 PDF 生成器或处理器
作为包含基于浏览器的可视化编辑器的项目的一部分,我使用 fabric.js
创建 SVG 文件,然后将其转换为 PDF 文件。
在某些情况下,最终结果是生成的 PDF 文件在整个文档中多次出现相同的图像,这会导致大量不必要的文件膨胀,从而导致 PDF 文件非常大。
在 SVG 上,这可以通过使用单个 <image>
元素并将其与 <use>
元素一起重复使用来轻松解决(如我的
Smallpdf.com 的 PDF 压缩工具似乎可以解决这个问题,但我不明白它是如何做到的;我也不能用 Inkscape 或我知道的任何其他工具复制这种优化。
是否有这种技术的名称,或者更好的方法让我自己复制它?我读到 PDF 中的 XObject
s 是适合此目的的工具,但我不知道如何自己实现它们,也找不到任何实际示例。
一般来说,PDF 确实通过使用 XObjects 以非常相似的方式提供了与 SVG 相同的功能。
XObject 可用于定义图像或一组图形运算符,否则它们将成为页面内容的一部分。它有一个名称和自己的内容流,并拥有自己的资源以使其成为一个独立的内容片段。然后可以使用 "Do" 运算符将此 XObject 包含在页面内容中,这与您在 SVG 中使用 "use" 描述的内容非常相似。
理论上,XObject 可以在 PDF 文件中出现一次,然后在整个文档中多次使用,而不会显着增加 PDF 文件的文件大小。是否发生这种情况取决于 PDF 创建库或 PDF 库的优化能力。
例如,Adobe PDF 库能够优化 PDF 文件,以便优化 XObjects 中出现的重复内容 - 然后保留 XObject 的单个副本,并且在页面描述中每次使用该 XObject 都指的是单个对象。我见过在可变数据场景中文件大小从数 GB 的数据减少到不到 1 MB 的示例。
要使用它,您需要:
- 重复内容实际上包含在 XObject 中的 PDF 文件
- 能够正确创建或足够智能优化 PDF 文件以利用此功能的 PDF 生成器或处理器