2017-08-13 36 views
1

我有一个文件夹,其中多个客户端上传多个PDF文件。其中一些正在使用嵌入式字体,有些则不。
我一直在努力优化(在文件大小方面)该文件夹中的PDF文件的服务。
每个用户可能上传大约400个文件,重量介于80K到10M之间,我的任务是优化所有文件,尽可能减小文件大小,减少质量损失。如何检查PDF文件是否使用嵌入字体?

PDF库在这方面做得很好。我唯一的问题是,我无法从所有文件中删除所有嵌入的字体,因为某些文件可能会使用这些字体,结果将成为我无法使用的文件。

所以我的问题是:

  1. 我如何检测哪些文件使用,哪些文件不使用嵌入字体?
  2. 优化使用嵌入字体的文件时,如何才能删除未使用的字体?

我想要实现的是从大多数文件中删除所有嵌入字体,但将嵌入字体保留在实际需要它们的文件中。我知道这取决于我在我的系统中使用的字体(这些文件应该保留在一个系统中,因此可移植性对我来说并不重要),所以我试图找到一种方法来在优化之前识别哪些文件看起来OK没有嵌入字体,以及我需要保留嵌入字体的文件。

+0

的建议@mjwills感谢。我想这可能是可能的,但我有点希望避免使用多个第三方课程。 PDF库是由Adobe编写的,已经支付了,所以我希望我可以得到一个解决方案,只基于此... –

+0

@mjwills对不起,但没有。首先,我正在寻找一种方法来删除未使用的嵌入字体,而不是添加嵌入字体(如您提供的链接的注释中的描述),其次,我不会说cpp ... –

+0

我不喜欢不认为第一个可用,但第二个是(我可以得到一个嵌入式字体列表)。但是,这不是问题。从该列表中我想知道是否在文档中没有使用嵌入字体,以便我可以删除它们,或者更好,然后查明是否可以安全地删除所有嵌入字体。我的目标是最小化文件大小,所以如果我能从哪些文件中找到可以安全删除所有嵌入字体的文件,它可以对输出文件产生非常显着的影响。 –

回答

0

APDFL有一个PDFontIsEmbedded()调用。 DotNet接口的Font类具有Embedded属性。使用GarbageCollect SaveFlag保存应该删除任何未引用的间接对象,包括字体。

请注意,资源字典可能会被多个页面共享,以便一个页面未使用的字体可能被另一个使用相同资源字典的页面使用。

+0

谢谢,明天我会试一试。我可能会有后续问题,但这看起来很有希望。 –

+0

我编辑了我的问题来解释我想要做的更好一点。请检查。 –

+0

不幸的是,我只能在保存文档时使用保存标志,我没有找到任何方式将其与PDFOptimizer一起使用。 –

0

Adob​​e PDF Library 15及更高版本有一项服务可以为您优化PDF文件。

优化器具有对所有嵌入字体进行子集的功能。这将做的是创建一个字体的子集,仅限于文档实际使用的字体的字形。 API如下。

void Datalogics::PDFL::PDFOptimizer::SetOption (OptimizerOption option, bool value) 
void Datalogics::PDFL::PDFOptimizer::Optimize (Document document, string newPath) 

这是选项,你需要

SubsetAllEmbeddedFonts  
+0

谢谢,我已经将它设置为true,但即使在删除所有嵌入字体后,文件看起来仍然可用,但此选项与“RemoveAllEmbeddedFonts”选项不具有相同的文件大小的显着效果。 –

+0

我编辑了我的问题来解释我想要做的更好一点。请检查。 –

相关问题