如何以编程方式减少导出的BIRT PDF报告的保证金?

时间:2012-02-24 09:28:59

标签: birt

使用 BIRT API 有没有办法降低PDF报告的边距

我尝试将 PDF呈现选项设置为:

PDFRenderOption renderOption = new PDFRenderOption();
renderOption.setOutputFormat(PDFRenderOption.OUTPUT_FORMAT_PDF);
renderOption.setOption(IPDFRenderOption.PDF_HYPHENATION, true);
renderOption.setOption(IPDFRenderOption.PDF_TEXT_WRAPPING, true);
renderOption.setOption(IPDFRenderOption.PAGE_OVERFLOW,
                       IPDFRenderOption.ENLARGE_PAGE_SIZE);

基本上我遇到的问题是,如果我在一个列中有一个较长的文本(来自其中一个表),它将在下一行获得它,但如果我将IPDFRenderOption.PDF_HYPHENATION设置为{{1}我将在文本中间分割文本(见下文)。

false设置为IPDFRenderOption.PDF_HYPHENATION

的PDF

PDF_HYPHENATION is true

true设置为IPDFRenderOption.PDF_HYPHENATION

的PDF

PDF_HYPHENATION is false

所以,我试图将PDF的边距设置得更小以克服这个问题,但我没有找到任何关于如何使用BIRT API执行此操作的文档... 有this suggestion修改母版页,但我有太多报告要手工修改它们。

我该如何处理这个问题?甚至可以使用BIRT API吗?

2 个答案:

答案 0 :(得分:2)

我需要做的就是遍历所有句柄,测试哪一个是MasterPageHandle并使用这些键调用setProperty

  • MasterPageHandle.BOTTOM_MARGIN_PROP
  • MasterPageHandle.LEFT_MARGIN_PROP
  • MasterPageHandle.RIGHT_MARGIN_PROP
  • MasterPageHandle.TOP_MARGIN_PROP

和我需要的DimensionValue

代码示例

  @SuppressWarnings("unchecked")
  private void shrinkPageSizeForExport(IReportRunnable reportRunnable) {
    DesignElementHandle designHandle = reportRunnable.getDesignHandle();
    IElementDefn elementDefn = designHandle.getDefn();
    for (int i = 0; i < elementDefn.getSlotCount(); i++) {
      SlotHandle slotHandle = designHandle.getSlot(i);
      for (DesignElementHandle elementHandle: (List<DesignElementHandle>)slotHandle.getContents()) {
        if (!(elementHandle instanceof MasterPageHandle)) continue;

        MasterPageHandle mph = (MasterPageHandle)elementHandle;
        DimensionValue dv = new DimensionValue(0.1, "cm");
        setAllMarginsTo(mph, dv);
      }
    }
  }

  private void setAllMarginsTo(MasterPageHandle mph, DimensionValue dv) {
    try {
      mph.setProperty(MasterPageHandle.BOTTOM_MARGIN_PROP, dv);
      mph.setProperty(MasterPageHandle.LEFT_MARGIN_PROP, dv);
      mph.setProperty(MasterPageHandle.RIGHT_MARGIN_PROP, dv);
      mph.setProperty(MasterPageHandle.TOP_MARGIN_PROP, dv);
    } catch (SemanticException se) {
      throw new RuntimeException("Cannot set margins for report export!", se);
    }
  }

答案 1 :(得分:2)

替代建议:

在BIRT库中构建MasterPage,并在所有报告中使用它。然后,可以一次更新所使用的所有报告。如果您没有使用库MasterPages,则可以使用库母版页替换报告MasterPage,然后再尝试重新编码它们。

像DataSources和MasterPages这样的东西几乎总是作为库项目更好。