使用iText删除PDF中的重复字体

时间:2015-01-29 08:56:11

标签: java itextsharp itext

我正在使用iText 2.1.5合并2个PDF文件。我的问题是,当生成连接的pdf时,两个pdf中使用的所有字体都是重复的。有没有更好的方法来处理这个,所以字体只嵌入一次?

源代码:

    public class GroupingPDF {

    public static final String RESULT = "/home/asagaama/Documents/groupementpdf/get/concatenated.pdf";;

    public static void main(String[] args) {
        try {
            String[] files = {
                    "/home/asagaama/Documents/groupementpdf/get/1.pdf",
                    "/home/asagaama/Documents/groupementpdf/get/2.pdf" };
            Document document = new Document();
            PdfSmartCopy pdfSmartCopy = new PdfSmartCopy(document,
                    new FileOutputStream(RESULT));
            document.open();
            PdfReader reader;

            int n;
            // loop over the documents you want to concatenate
            for (int i = 0; i < files.length; i++) {
                reader = new PdfReader(files[i]);
                // loop over the pages in that document
                n = reader.getNumberOfPages();
                for (int page = 0; page < n;) {
                    pdfSmartCopy.addPage(pdfSmartCopy.getImportedPage(reader,
                            ++page));
                }
            }
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我检查了你的文件,并且我已经截取了每个页面使用的字体资源的屏幕截图:

第1页: Page 1

我们看到5种字体:

  1. EUDXLQ + FranklinGothic图书
  2. XQNBQD + FranklinGothicLT图书
  3. DDOZBL + Helvetica.ttf
  4. DYKMGD + FranklinGothicLT-黛咪
  5. MZDMJV + ArialMT
  6. 第2页: page 2

    我们看到4种字体:

    1. KWKZVU + FranklinGothic-Book(富兰克林哥特式书籍的一个子集<强>不同与第1页的
    2. WUQFPY + FranklinGothicLT-Book(与第1页 不同的FranklinGothicLT的子集)
    3. SQWYVD + FranklinGothicLT-Demi(FranklinGothicLT-Demi的一个子集与第1页的不同
    4. ZKEBIA + ArialMT(ArialMT的一个子集与第1页的不同
    5. 第3页: page 3

      此页面有2种字体:

      1. KWKZVU + FranklinGothic-Book(与第2页相同的相同子集,它也是相同对象:对象34 0)
      2. ZKEBIA + ArialMT(相同子集与第2页相同,它也是相同对象:对象44 0)
      3. 第4页: page 4

        此页面有2种字体:

        1. KWKZVU + FranklinGothic-Book(与第2页相同的相同子集,它也是相同对象:对象34 0)
        2. ZKEBIA + ArialMT(相同子集与第2页相同,它也是相同对象:对象44 0)
        3. 如果这是使用PdfSmartCopy的结果,那么iText已经完成了它的工作。相同的字体子集存储在同一个对象中(没有冗余字体)。

          不幸的是,ArialMT和一些FranklinGothic字体无法重复使用,因为字体的子集不同。 iText无法合并相同字体的不同字体集。

          我已在评论中解释过这一点,但后来你提出了一些不正确的指控。只有在您分享文档后,我才能证明您的问题是基于错误的假设。

          <强>更新

          如果要连接PDF并减少字体数量,有什么选择?

          如果您没有嵌入字体,那么iText将检测相同的字体词典,iText将删除冗余字体词典。如果嵌入完整字体也是如此(因此,如果您不允许PDF生成器创建子集)。但是,嵌入完整字体并不总是一种选择。根据字体的不同,这可能会导致文件大小更大。

          我们在技术路线图上有字体改进,但我不认为将字体子集合并为单个字体不属于该子项目。在某些情况下,在iText中实现这一点可能是可行的,例如:在使用可预测编码的情况下。在其他情况下,合并不同的子集几乎是不可能的,因为它需要重写整个内容流。