【问题标题】:Compress on the fly generated PDF files having embeded fonts即时压缩生成的具有嵌入字体的 PDF 文件
【发布时间】:2013-07-31 13:29:02
【问题描述】:

我们有一个应用程序生成带有嵌入 NMSYS 字体的动态 PDF 文件。

但与原始文件相比,它的大小非常大,原始文件具有较大的数据,然后动态生成具有相同的字体。

是否可以使用 php 任何脚本、API 或扩展来减小此类 PDF 的大小?以及为什么内容较大、字体相同的源PDF(不是由脚本生成的)尺寸较小?

编辑

例子-

file 1

file 2

文件 -1 是由我们的脚本生成的,它基本上显示了文件 2 中的一条信息。文件 -1 中只有 5 页,大小为 1.2 MB,文件 2 有 158 页类似的信息,但大小约为 4 MB。

为什么会有这种大小差异?

【问题讨论】:

  • 原文件也是PDF文件吗?您能否发布这样一个原始/动态生成的 PDF 文件的示例?很难说是什么占用了您的 PDF 文件中的空间而不实际能够看到一个 - 有很多不同的原因导致 PDF 文件可能比您想象的要大...
  • @David van Driessche:我上传了 2 个文件并编辑了帖子。请检查并让我知道您是否需要我提供任何其他信息。

标签: php pdf compression size-reduction


【解决方案1】:

我查看了这两个文件,差异确实主要与字体有关。我保存了使用 Adob​​e Acrobat XI 优化的两个文件 - 这(可以)做了很多优化,但最重要的区别(对于文件 1)来自字体子集:

文件 1:之前 1.2 MB / 之后 253 KB 文件 2:之前 4.7 MB / 之后 3.7 MB

您的文件 2 是使用 FrameMaker 创建的,它通常会生成非常干净的 PDF(即使在这种情况下使用的是非常旧版本的 Adob​​e Acrobat Distiller),您的文件 1 是由 DomPDF 生成的,显然没有子集嵌入字体。

如果您从 Acrobat 中查看第一个文件的空间审计报告:

您可以看到字体占据了文件中接近 96% 的空间。因此,对这个文件中使用的字体进行子集化基本上是您缩小它的唯一选择。

不同的库或应用程序有不同的选项来启用子集。专门针对 DOMPDF 使用选项 DOMPDF_ENABLE_FONTSUBSETTING 在它创建的 PDF 文件中启用字体子集:

def("DOMPDF_ENABLE_FONTSUBSETTING", true);

然后仅嵌入 PDF 文件中实际使用的那些字符,通常(取决于文本量和实际字体)创建更小的文件。

(从 cmets 添加的 DOMPDF 解决方案使答案更完整)

【讨论】:

  • 是的,我正在使用 som PDF,您能详细解释一下吗?我怎样才能以不同的方式生成它?以及我可以使用哪个库应用程序来子集字体
  • 我已经这样做了,在 dompdf 配置文件 DOMPDF_ENABLE_FONTSUBSETTING 中有一个选项将它的值更改为 true。现在文件大小减小了。感谢您的帮助。
  • 我很困惑我应该接受哪个答案,你们两个都帮我解决了这个问题。关于更改 DOMPDF 配置中的设置,我应该自己写答案吗?
  • 我认为最重要的是将信息提供给他人。因此,要么编写您自己的答案,要么简单地编辑现有答案之一以包含您在 DOMPDF 中所做的...
  • 这是解决方案 - 如果使用 DOMPDF,那么我们可以设置属性 DOMPDF_ENABLE_FONTSUBSETTING 以允许字体子集 def("DOMPDF_ENABLE_FONTSUBSETTING", true);它只会加载那些在布局中实际使用的字体并存储在 PDF 中。
【解决方案2】:

文件 1 使用 TrueType DejaVuSans 系列字体,它们不是子集。它们占用了大约 950kb 的 PDF 文件。其余的是图像、PDF 结构等。
文件 2 使用 TrueType Helvetica 字体,它们是子集。它们占用的空间要少得多。因为所有页面上的所有文本都使用几乎相同的字符,所以最终的字体非常小。

【讨论】:

  • 谢谢。任何建议如何解决这个问题?我应该做些什么改变来减少第一个文件的大小?请
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2012-02-21
  • 2020-07-07
  • 1970-01-01
相关资源
最近更新 更多