iText PdfSmartCopy正在创建重复的字体

时间:2018-11-05 17:21:17

标签: itext

我正在使用iText(5.5.12)PdfSmartCopy将两个具有嵌入式,未分组字体的文件合并在一起(并且恰巧是在同一台计算机上生成的,因此我知道它们是指的是同一字体),希望最终结果将只有该字体的一个副本。

但是我发现合并结果的字体嵌入了两次。

这是我正在使用的代码:

String[] srcs = ...
Document document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(result));

document.open();
for (int i = 0; i < srcs.length; i++) {
    PdfReader reader = new PdfReader(srcs[i]);
    copy.addDocument(reader);
    copy.freeReader(reader);
    reader.close();
}
document.close();

这是pdffonts在相关文件上的输出:

输入文件1:

name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
TimesNewRomanPSMT                    CID TrueType      Identity-H       yes no  yes     14  0

输入文件2:

name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
TimesNewRomanPSMT                    CID TrueType      Identity-H       yes no  yes     11  0

输出文件:

name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
TimesNewRomanPSMT                    CID TrueType      Identity-H       yes no  yes      3  0
TimesNewRomanPSMT                    CID TrueType      Identity-H       yes no  yes     25  0

1 个答案:

答案 0 :(得分:1)

与您的假设相反

  

两个具有嵌入式,未分组字体的文件

字体的子集,并且是不同的。

来自file1.pdf:

from file 1

来自file2.pdf:

from file 2

如您所见,存在许多不同之处,文件1中有一个非空字形,但文件2中没有“ 1”字形,反之亦然,“ 2”等等……

因此,这些字体并不相同,并且PdfSmartCopy不能正确替换另一种字体。


我认为pdffonts不会将它们识别为子集,因为它们没有正确地标记为子集字体,特别是其名称没有必需的子集标签,并且没有可选的 CharSet 列出了字体子集中定义的字符名称。因此,字体不仅没有被取消设置,而且设置也被错误地完成了。

因此,不要怪您pdffonts的不正确假设,而应该归咎于创建输入文件的PDF生成器。