如何将报告导出为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报告跟踪器 。