如何避免重复的字体资源?

时间:2013-05-13 22:43:24

标签: fonts itextsharp

我有一些代码使用iTextSharp的PdfSmartCopy类将多个较小的PDF文件合并为一个大文件:

FileStream outStream = new FileStream(outputFilename, FileMode.Create, FileAccess.Write);
Document document = new Document();
PdfSmartCopy copy = new PdfSmartCopy(document, outStream);
document.Open();

foreach (string filename in fileList)
{
   PdfReader reader = new PdfReader(filename);

   for (int pageNum = 1; pageNum <= reader.NumberOfPages; ++pageNum)
   {
      copy.AddPage(copy.GetImportedPage(reader, pageNum));
   }
}

document.Close();

当我使用mutool extract提取PDF资源时,它使用的每种字体都有多个相同的副本:

C:\[...]>sha1sum *.cff *.ttf *.png | sort
0d150f99593d385764a1c7096b72448d09af8d72 *JPIOAD+Helvetica-0020.cff
0d150f99593d385764a1c7096b72448d09af8d72 *JPIOAD+Helvetica-0036.cff
0d150f99593d385764a1c7096b72448d09af8d72 *JPIOAD+Helvetica-0049.cff
0d150f99593d385764a1c7096b72448d09af8d72 *JPIOAD+Helvetica-0069.cff
0d150f99593d385764a1c7096b72448d09af8d72 *JPIOAD+Helvetica-0084.cff
0d150f99593d385764a1c7096b72448d09af8d72 *JPIOAD+Helvetica-0099.cff
17a99e597d3ec2cabf567cbfec032972f7e00962 *DXLQZY+LetterGothicW1Bold-0032.ttf
17a99e597d3ec2cabf567cbfec032972f7e00962 *GMYLDU+LetterGothicW1Bold-0014.ttf
17a99e597d3ec2cabf567cbfec032972f7e00962 *MNVLMO+LetterGothicW1Bold-0045.ttf
[etc.]

我已经检查了FontForge中的* .cff和* .ttf文件,看起来它们只包含文档中实际使用的字符子集。

有没有办法让生成的文件只包含一个字体副本?

1 个答案:

答案 0 :(得分:2)

iText和iTextSharp可以将字体子集合并为一个子集。对于某些字体,制作如此大的子集可能是可行的,但在某些情况下,将不同的字体合并为一个是不可能的(理论上,对于非常大的字体集,例如中文),在其他情况下,将是非常困难的(这可能意味着需要重写整个内容流,因为合并字体中的字符/字形映射已经改变)。

换句话说:你问的是一些不平凡的事情。它不受支持。这是我们在付费咨询的背景下只考虑的功能。