JasperReports是否支持交替的天沟边缘?

AKW*_*KWF 5 jasper-reports

许多生成PDF的人都需要绑定它们.良好的绑定要求每个其他页面在其左侧和右侧支持备用边距大小.我知道JasperReports在其3.x系列中并不支持这一点.这是否支持4.x系列?

big*_*dog 4

您可以通过对 JRPdfExporter 进行子类化、覆盖方法 exportReportToStream 来完成 Dave 提到的 marginMirroring。不幸的是,您需要将此方法的源代码复制到您的覆盖中。在您的覆盖中,您将修改页面循环,如下所示:

for(int pageIndex = startPageIndex; pageIndex <= endPageIndex; pageIndex++)
{
    int margin = marginLeft;
    if (pageIndex % 2 == 1) margin = marginRight;

    parameters.put(JRExporterParameter.OFFSET_X, margin);
    setOffset();
    ...
Run Code Online (Sandbox Code Playgroud)

我的子类的构造函数接受边距:

public MirroringJRPdfExporter(int left, int right, int top, int bottom) {
    this.marginLeft = left;
    this.marginRight = right;
    this.marginTop = top;
    this.marginBottom = bottom;
}    
Run Code Online (Sandbox Code Playgroud)

我也吸收了顶部和底部,以防万一我需要镜像它以进行翻页。

另一个不幸的注意事项是,exportReportToStream 使用一个帮助程序 JRPdfExporterTagHelper,并调用 2 个受保护的方法:init 和 setPdfWriter,因此您的子类将无法编译,除非您也对帮助程序进行子类化并将这些方法公开给您的子类。我这样做了:

public class JRPdfExporterTagHelper extends
        net.sf.jasperreports.engine.export.JRPdfExporterTagHelper {

    protected JRPdfExporterTagHelper(JRPdfExporter exporter) {
        super(exporter);
    }

    public void setPdfWriter2(PdfWriter pdfWriter) {
        setPdfWriter(pdfWriter);
    }

    public void init2(PdfContentByte pdfContentByte) {
        init(pdfContentByte);
    }
} 
Run Code Online (Sandbox Code Playgroud)

然后,我这样称呼它:

MirroringJRPdfExporter exporter = new MirroringJRPdfExporter(72, 36, 44, 31);

exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
exporter.exportReport();
Run Code Online (Sandbox Code Playgroud)