代码之家  ›  专栏  ›  技术社区  ›  Yishai

如何用背景图像缩小BIRT生成的PDF文件的大小?

  •  11
  • Yishai  · 技术社区  · 15 年前

    似乎(至少这是我们目前对这个问题的理解)给出了一个BIRT中的背景图像,PDF生成例程在PDF中重复图像信息,而不是将其作为PDF所有页面的背景图像引用。

    这会导致我们的BIRT生成的PDF太大。有没有一种方法可以让BIRT只将图像存储在PDF中一次,并且在保持文件大小更合理的同时将其作为PDF的每一页上的背景图像?

    1 回复  |  直到 13 年前
        1
  •  7
  •   Tim Cooper    13 年前

    是的,BIRT将为每个页面创建一个相同背景图像的新化身。不幸的是,它埋得太深了 org/eclipse/birt/report/engine/emitter/pdf/PDFPage.java 很容易破解,而且是绝对不可配置的。

    但绝望不是!你可以使用 iText (birt内部使用的相同itext)to 消除重复实体 PdfSmartCopy . 沿着这条线的东西:

    PdfReader reader  = new PdfReader(PDF_IN_FROM_BIRT);
    Document document = new Document();
    PdfSmartCopy copy = new PdfSmartCopy(document,
      new FileOutputStream(PDF_OUT_NO_DUPLICATES));
    document.open();
    for (int page = 1; page <= reader.getNumberOfPages(); page++) {
      copy.addPage(copy.getImportedPage(reader, page));
    }
    document.close();
    

    如果上述情况不可接受,那么您可以 补丁 com.itextpdf.text.Image.getInstance(URL) 以独身的方式行事 ,返回现有 com.itextpdf.text.Image 对象(如果已从同一对象获取图像) URL 在过去。您可以修补和重建birt使用的itext jar,或者使用 Javassist 在运行时执行代码注入而不需要重新编译。