在jasper-report中生成PDF / A,包含许多陷阱,并且在某些版本的jasper-report中不受支持.这就是为什么我决定通过这个问答帖子,指出将带图表的简单报告导出为PDF / A所需的步骤和库版本
示例数据(usersRep.csv)
+----------------+--------+
| User | Rep |
+----------------+--------+
| Jon Skeet | 854503 |
| Darin Dimitrov | 652133 |
| BalusC | 639753 |
| Hans Passant | 616871 |
| Me | 5640 |
+----------------+--------+
示例jrxml(reputation.jrxml)
要导出为PDF的Java代码(信誉.pdf)
JasperReport report = JasperCompileManager.compileReport("reputation.jrxml");
JRCsvDataSource datasource = new JRCsvDataSource("usersRep.csv");
datasource.setFieldDelimiter(';');
datasource.setUseFirstRowAsHeader(true);
JasperPrint jasperPrint = JasperFillManager.fillReport(report, new HashMap(),datasource);
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("reputation.pdf"));
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
configuration.setMetadataAuthor("Me and only me");
exporter.setConfiguration(configuration);
exporter.exportReport();
这会将报告导出为pdf,生成PDF / A-1a需要做什么?
解决方法:
JasperReports Library 4.1.2.3或更高版本is needed(6.0.0中已停止支持,最后请参见NullPointerException).
这些步骤需要生成PDF / A,它们既可以通过java代码实现,也可以通过将jrxml属性设置为root标签(jasper-server support)来实现.我将展示两者,但只需要一种方法.
设置PDF / A一致性
java的
configuration.setPdfaConformance(PdfaConformanceEnum.PDFA_1A); // or PdfaConformanceEnum.PDFA_1B
JRXML
to avoid JRPdfaIccProfileNotFoundException: The ICC profile is not
available to the JVM
java的
configuration.setIccProfilePath("srgb.icc");
JRXML
如果你还有错误
com.lowagie.text.pdf.PdfXConformanceException: All the fonts must be embedded. This one isn't: Helvetica
在jrxml中包含一个默认样式,表示字体扩展中包含的fontName,例如
删除透明对象和图层(可选内容组),它们是not allowed
to avoid PdfXConformanceException: Transparency is not allowed
在示例中,图表元素必须是不透明的,并且为了避免标签上的透明度,您可以实现JRChartCustomizer
public class NoTransparencyCustomizer implements JRChartCustomizer{
@Override
public void customize(JFreeChart chart, JRChart jrchart) {
PiePlot plot = (PiePlot) chart.getPlot();
plot.setLabelShadowPaint(Color.GRAY);
}
}
设置标记和标记语言(PDF / A-1b不需要)
java的
configuration.setTagged(true);
configuration.setTagLanguage("en-us");
JRXML
结果
这是实现上述结果的结果,将fontName切换为DejaVu Sans并使用捆绑的jasperreports-fonts.jar作为font-extension.它已在pdf-tools成功验证PDF / A-1a和PDF / A-1b
对我来说没有一块蛋糕
停止支持
在jasper报告版本6.0.0中,始终抛出com.itextpdf.text.pdf.internal.PdfA1Checker.checkPdfObject中的NullPointerException.这已在6.0.4及以上解决,见Jasper report tracker.
标签:export-to-pdf,java,pdf-generation,jasper-reports,pdfa
来源: https://codeday.me/bug/20190925/1815976.html