如何对pdf中使用的字体进行子集化? (使用iTextSharp)

时间:2011-04-14 08:58:34

标签: pdf fonts itextsharp subset

我用ASP.NET + iTextSharp生成了一个pdf报告 我在其中使用了几种类型的字体,每种字体都应用于一个单词或2出于艺术原因 所以文件很大。

我怎样才能嵌入我实际使用的字体?就像我们使用MS Office Options一样。

MS Office Word 2007是这样的:
“在文件中嵌入字体:
仅嵌入文档中使用的字符(最适合减小文件大小)
不要嵌入常见的系统字体“

或者我也可以接受另一种解决方案 将整页展平为高分辨率图片 如果编程很方便,我实际上更喜欢这个解决方案。

感谢。

1 个答案:

答案 0 :(得分:2)

在创建启用嵌入的BaseFont实例时,您需要致电myBaseFont.setSubset(true)。请注意,使用编码“Identity-H”(AKA BaseFont.IDENTITY_H),这会自动发生:

// find all fonts in the usual places across multiple OSs.
// This can be pretty slow if you have a large number fonts, or the fonts
// themselves are Really Big (ArialUnicodeMS: 23mb).
FontFactory.registerDirectories();

// here's one way to do it, using identity-h forces subsetting
Font myFontSubset1 = FontFactory.getFont(fontName1, BaseFont.IDENTITY_H);

// here's another, explicitly enable subsetting for the underlying BaseFont.
Font myFontSubset2 = FontFactory.getFont(fontName2, FontFactory.defaultEncoding, true);
myFontSubset2.getBaseFont().setSubset(true);

//or you can create the BaseFont yourself, with automagic subsetting
BaseFont myFontSubset3 = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H);

// or create it with some other encoding, and enable subsetting.
BaseFont myFontSubset4 = BaseFont.createFont(fontPath, BaseFont.WINANSI, true);
myFontSubset4.setSubset(true);

请注意,这都是Java。在C#中,函数名的第一个字母大写,setX(newX)getX()成为属性。