Поддерживает ли JasperReports переменные поля желоба? - PullRequest
5 голосов
/ 21 апреля 2011

Многие люди, которые генерируют PDF-файлы, должны связывать их. Хорошее связывание требует, чтобы каждая другая страница поддерживала альтернативный размер полей слева и справа. Я знаю, что JasperReports не поддерживал это в своей серии 3.x. Поддерживается ли это в серии 4.x?

Ответы [ 3 ]

4 голосов
/ 28 июля 2011

Вы можете выполнить marginMirroring, как упомянуто Дейвом, подклассом JRPdfExporter, переопределив метод exportReportToStream. К сожалению, вам нужно будет скопировать исходный код этого метода в переопределение. В переопределении вы измените цикл страницы следующим образом:

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

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

Конструктор для моего подкласса принимает поля:

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

Я тоже взял верх и низ, на всякий случай мне нужно было отразить это для перелистывания страниц.

Еще одно прискорбное замечание: 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);
    }
} 

Затем я называю это так:

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

exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
exporter.exportReport();
1 голос
/ 12 сентября 2016

В JasperReports 6.x вы можете указать поля для четных и нечетных страниц отдельно в шаблоне отчета (jrxml), установив

<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"/>

Пример можно найти в файле примера JasperReports demo/samples/query/reports/QueryReport.jrxml. Я нашел это решение в проблеме .

То же самое можно установить с помощью класса JRPdfExporter при экспорте отчета в pdf на Java:

JRPdfExporter exporter = new JRPdfExporter();
SimplePdfReportConfiguration configuration = new SimplePdfReportConfiguration();
configuration.setOddPageOffsetX(10);
configuration.setEvenPageOffsetX(-10);
exporter.setConfiguration(configuration);
0 голосов
/ 11 декабря 2015

Для работы с jasper 5.6 помимо ответа на @bigspotteddog я сделал:

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

и:

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

в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...