如何将报告导出为PDF / A-1a,PDF / A-1b?
在jasper-report中生成PDF / A,包含许多陷阱,并且在某些版本的jasper-report中不受支持。 这就是为什么我决定通过这个Q uestion- A nswerpost,指出将带图表的简单报告导出为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或更高版本(6.0.0中已停止支持,最后请参见NullPointerException
)。
这些步骤需要生成PDF / A,它们既可以通过java代码实现,也可以通过将jrxml property
设置为root标签(jasper-server support)来实现。 我将展示两者,但只需要一种方法 。
设置PDF / A一致性
java的
configuration.setPdfaConformance(PdfaConformanceEnum.PDFA_1A); // or PdfaConformanceEnum.PDFA_1B
JRXML
设置ICC配置文件
避免
JRPdfaIccProfileNotFoundException: The ICC profile is not available to the JVM
java的
configuration.setIccProfilePath("srgb.icc");
JRXML
使用font-extensions嵌入报表中使用的所有字体
如果你还有错误
com.lowagie.text.pdf.PdfXConformanceException: All the fonts must be embedded. This one isn't: Helvetica
在jrxml中包含一个默认样式 ,指示字体扩展中包含的fontName
,例如
删除不允许使用的透明对象和图层(可选内容组)
避免
PdfXConformanceException: Transparency is not allowed
例如,图表元素必须是Opaque
并且为了避免标签上的透明度,您可以实现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 / A-1a和PDF / A-1b的pdf工具上成功validation
对我来说没有一块蛋糕
停止支持在jasper报告版本6.0.0中,始终抛出NullPointerException at com.itextpdf.text.pdf.internal.PdfA1Checker.checkPdfObject
中的NullPointerException at com.itextpdf.text.pdf.internal.PdfA1Checker.checkPdfObject
。 这已在6.0.4及以上版本中解决,请参阅Jasper报告跟踪器 。