许多生成PDF的人都需要绑定它们.良好的绑定要求每个其他页面在其左侧和右侧支持备用边距大小.我知道JasperReports在其3.x系列中并不支持这一点.这是否支持4.x系列?
您可以通过对 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)
归档时间: |
|
查看次数: |
830 次 |
最近记录: |