#jasper-reports
#jasper-отчеты
Вопрос:
Многим пользователям, создающим PDF-файлы, необходимо их привязывать. Хорошая привязка требует, чтобы каждая вторая страница поддерживала альтернативный размер полей с левой и правой сторон. Я знаю, что JasperReports не поддерживал это в своей серии 3.x. Поддерживается ли это в серии 4.x?
Комментарии:
1. Вы имеете в виду JasperReports или iReport?
Ответ №1:
Вы можете выполнить зеркальное отображение полей, как упоминал Дэйв, создав подкласс 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, которые защищены, поэтому ваш подкласс не будет компилироваться, если вы также не создадите подкласс helper и не предоставите эти методы своему подклассу. Я сделал это:
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();
Ответ №2:
В 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);
Ответ №3:
Для работы с 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;
в цикле.