如何使用 iText 7 删除 PDF 文件中的重复字体

How to remove duplicate fonts in a PDF file using iText 7

我正在使用 iText 7 库 (v7.0.5.0)。我从 .Net.

中的 RadDiagramTelerik 库)创建了一个 PDF 文件(A-1B 一致性)

生成 PDF 文件后,在其属性中 (Acrobat Reader > File > Properties > Fonts), 文件自带的字体很多,但是master字体只有4个,还有变体(Arial, Segoe, Tahoma, TimesNewRoman).

我可以看到有很多重复的字体同名。

如果我将文件从 Acrobat Reader 保存到“reduced PDF 文件”,所有重复的字体都被清除,每种字体只保留一种字体名字。

我搜索了一个解决方案来以编程方式删除这些重复的字体,因为这些重复的字体会显着增加 PDF 文件的大小。 使用 Acrobat Reader 压缩,文件大小从 2,2 Mo 减小到 906 Ko(没有质量损失)。

您可以找到 here 我的 PDF 文件的示例。

此文件有:

这是一个例子,但有时,我的文件很大,例如,压缩将大小从 16 Mo 减小到 1 Mo,因为有很多重复的字体。

[编辑] 关于我的用例 :

来自 RadDiagram Telerik 对象,我将它们导出为 PDF 文件,如图像。此 PDF 文件(只有 1 页)被序列化为 Bytes() 并保存到数据库中。在特定的步骤中,所有序列化的 PDF 都被连接到一个全局 PDF 文件中。 显然,问题出在我保存每个 PDF 文件时,因为在每次创建时,我都会调用此代码:

_pdfFont = PdfFontFactory.CreateFont(FONT_PATH_ARIAL, PdfEncodings.IDENTITY_H, True)

声明:

Private Const FONT_PATH_ARIAL As String = "c:\windows\fonts\Arial.ttf"  
Private _pdfFont As PdfFont

每个 SetFont() 方法都会调用 _pdfFont 对象。

但是创建步骤很重要,因为当我关闭 de Document 对象时,这个对象需要知道字体,我是专门为它创建的。

A结束,这个是同一个字体(同名),但是各个字体没有合并,所以才添加到全局PDF文件中。

[结束编辑]

非常感谢。

最后,我找到了另一种保存 PDF 文件的方法。

现在,我没有将它们保存到数据库中,我只使用 1 个 PDF 文件,并且我正在使用 PDF 字体词典来重新使用它们而不是声明多种时间字体,所以不要' 增加使用的字体数量(即使这是 "same" 字体(带有另一个子集))。