2011-04-21 16 views
5

Muchas personas que generan archivos PDF deben vincularlos. Un buen enlace requiere que cada otra página soporte un tamaño de margen alternativo en sus lados izquierdo y derecho. Sé que JasperReports no fue compatible con esto en su serie 3.x. ¿Esto es compatible con la serie 4.x?¿JasperReports admite alternar los márgenes de canal aún?

+0

Qué quiere decir JasperReports o iReport? –

Respuesta

4

Puede realizar marginMirroring como menciona Dave, al subclasificar JRPdfExporter, anulando el método, exportReportToStream. Lamentablemente, deberá copiar la fuente de este método en su anulación. En su anulación, modificará el bucle de la página, así:

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

    parameters.put(JRExporterParameter.OFFSET_X, margin); 
    setOffset(); 
    ... 

El constructor de mi subclase toma en los márgenes:

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

Tomé en la parte superior e inferior también, por si acaso necesario para reflejar eso para página flipping.

Otra nota desafortunada, exportReportToStream utiliza un ayudante, JRPdfExporterTagHelper, y llama a 2 métodos, init y setPdfWriter, que están protegidos, por lo que su subclase no se compilará a menos que subclass el auxiliar y exponer esos métodos a su subclase. Hice esto:

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); 
    } 
} 

Entonces, yo lo llamo así:

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

exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); 
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output); 
exporter.exportReport(); 
0

Para trabajar con Jasper 5.6 además de la respuesta a @bigspotteddog que hice:

@Override 
protected PdfReportConfiguration getCurrentItemConfiguration() { 
    SimplePdfReportConfiguration config = new SimplePdfReportConfiguration(); 
    PdfReportConfiguration currentItemConfiguration = super.getCurrentItemConfiguration(); 
    config.setCollapseMissingBookmarkLevels(currentItemConfiguration.isCollapseMissingBookmarkLevels()); 
    config.setForceLineBreakPolicy(currentItemConfiguration.isForceLineBreakPolicy()); 
    config.setForceSvgShapes(currentItemConfiguration.isForceSvgShapes()); 
    config.setIgnoreHyperlink(currentItemConfiguration.isIgnoreHyperlink()); 
    config.setOverrideHints(currentItemConfiguration.isOverrideHints()); 
    config.setSizePageToContent(currentItemConfiguration.isSizePageToContent()); 
    config.setEndPageIndex(currentItemConfiguration.getEndPageIndex()); 
    config.setExporterFilter(currentItemConfiguration.getExporterFilter()); 
    config.setHyperlinkProducerFactory(currentItemConfiguration.getHyperlinkProducerFactory()); 
    config.setPageIndex(currentItemConfiguration.getPageIndex()); 
    config.setProgressMonitor(currentItemConfiguration.getProgressMonitor()); 
    config.setStartPageIndex(currentItemConfiguration.getStartPageIndex()); 

    config.setOffsetX(margin); 

    return config; 
} 

y:

margin = marginLeft; 
if (pageIndex % 2 == 1) margin = marginRight; 

en el circuito.

1

En JasperReports 6.x puede especificar los márgenes de las páginas pares e impares por separado en la plantilla de informe (jrxml) mediante el establecimiento de

<property name="net.sf.jasperreports.export.pdf.odd.page.offset.x" value="10"/> 
<property name="net.sf.jasperreports.export.pdf.even.page.offset.x" value="-10"/> 

Un ejemplo se puede encontrar en el archivo de ejemplo JasperReports demo/samples/query/reports/QueryReport.jrxml. Encontré esta solución en an issue.

Lo mismo se puede ajustar utilizando la clase JRPdfExporter al exportar el informe a PDF en Java:

JRPdfExporter exporter = new JRPdfExporter(); 
SimplePdfReportConfiguration configuration = new SimplePdfReportConfiguration(); 
configuration.setOddPageOffsetX(10); 
configuration.setEvenPageOffsetX(-10); 
exporter.setConfiguration(configuration); 
Cuestiones relacionadas