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

时间:2018-08-03 10:42:56

标签: .net fonts pdf-generation itext7

我正在使用iText 7库(v7.0.5.0)。我从RadDiagram中的.Net Telerik库)创建了一个PDF文件(A-1B符合性)。

生成PDF文件时,其属性( Acrobat Reader > 文件> 属性> 字体 ),该文件带有很多自带字体,但只有4种主字体,并带有变体( Arial Segoe Tahoma ,< em> TimesNewRoman )。

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

如果我将文件从Acrobat Reader保存到“ 精简PDF文件”,则会清除所有重复的字体,每个字体名称仅保留一种字体。

我搜索以编程方式删除这些重复字体的解决方案,因为这些重复字体会大大增加PDF文件的大小。 通过Acrobat Reader压缩,文件大小从2,2 Mo减小到906 Ko(无质量损失)。

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

此文件具有:

  • 8 ArialMT
  • 3 SegoeUI

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

[ EDIT ] 关于我的用例

RadDiagram Telerik 对象中,将它们导出到PDF文件中,就像图像一样。该PDF文件(只有一页),被序列化为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

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

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

最后,这是相同的字体(它们具有相同的名称),但是每种字体都不会合并,因此会将它们添加到全局PDF文件中。

[结束编辑]

非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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