如何使用 iText 7 删除 PDF 文件中的重复字体
How to remove duplicate fonts in a PDF file using iText 7
我正在使用 iText 7
库 (v7.0.5.0)。我从 .Net
.
中的 RadDiagram
(Telerik 库)创建了一个 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 文件的示例。
此文件有:
- 8 宋体
- 3 SegoeUI
这是一个例子,但有时,我的文件很大,例如,压缩将大小从 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" 字体(带有另一个子集))。
我正在使用 iText 7
库 (v7.0.5.0)。我从 .Net
.
RadDiagram
(Telerik 库)创建了一个 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 文件的示例。
此文件有:
- 8 宋体
- 3 SegoeUI
这是一个例子,但有时,我的文件很大,例如,压缩将大小从 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" 字体(带有另一个子集))。