Jasperreports NulPointerException生成PDF / A文件

时间:2014-12-10 14:41:43

标签: pdf jasper-reports itext pdfa

我使用此代码生成PDF,一切正常。

JasperReport jasperReport = (JasperReport) JRLoader.loadObject(new File(reportname));
JRDataSource ds = ... a datasource
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, d.getHashMap(), ds);
JasperExportManager.exportReportToPdfFile(jasperPrint, output_path + "p4.pdf");

当我尝试制作符合pdf标准的pdfa1b时,我获得了此异常

Exception in thread "main" java.lang.NullPointerException
    at com.itextpdf.text.pdf.internal.PdfA1Checker.checkPdfObject(PdfA1Checker.java:323)
    at com.itextpdf.text.pdf.internal.PdfAChecker.checkPdfAConformance(PdfAChecker.java:208)
    at com.itextpdf.text.pdf.internal.PdfAConformanceImp.checkPdfIsoConformance(PdfAConformanceImp.java:71)
    at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3426)
    at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3422)
    at com.itextpdf.text.pdf.PdfDictionary.toPdf(PdfDictionary.java:137)
    at com.itextpdf.text.pdf.PdfArray.toPdf(PdfArray.java:175)
    at com.itextpdf.text.pdf.PdfDictionary.toPdf(PdfDictionary.java:149)
    at com.itextpdf.text.pdf.PdfIndirectObject.writeTo(PdfIndirectObject.java:158)
    at com.itextpdf.text.pdf.PdfWriter$PdfBody.write(PdfWriter.java:420)
    at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:398)
    at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:334)
    at com.itextpdf.text.pdf.PdfWriter.addToBody(PdfWriter.java:829)
    at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1311)
    at com.itextpdf.text.pdf.PdfAWriter.close(PdfAWriter.java:336)
    at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:886)
    at com.itextpdf.text.Document.close(Document.java:416)
    at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:830)
    at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:519)
    at net.sf.jasperreports.engine.JasperExportManager.exportToPdfFile(JasperExportManager.java:157)
    at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:505)
    at ga.jr.run.RunMe.main(RunMe.java:45)

这是我的jasper文件的一部分

<property name="net.sf.jasperreports.export.pdf.tagged" value="true"/>
<property name="net.sf.jasperreports.export.pdfa.conformance" value="pdfa1b"/>
<property name="net.sf.jasperreports.export.pdfa.icc.profile.path" value="Z:\\Produzione\\Development\\TEMPLATE\\sRGB_v4_ICC_preference.icc"/>

如果我删除net.sf.jasperreports.export.pdfa.conformance(或将其设置为&#34; none&#34;),但该文件不是PDF / A

,也不例外

有什么不对? 感谢

编辑:我使用的是iText 5.5.3(使用itext 5.5.0的同样问题)和Jasperreports 6.0.0

编辑:使用AdobeRGB1998.icc和sRGB_v4_ICC_preference.icc,ISOnewspaper26v4_gr.icc和ISOnewspaper26v4.icc,eciRGB_v2.icc和ISOcoated_v2_300_eci.icc(在我的PDFCreator安装目录中找到)测试相同的异常

1 个答案:

答案 0 :(得分:2)

这是一个错误。我恢复到5.6.1版本,一切正常。

今天是2014年12月17日,我正在等待6.0.0以上的Jasperreports版本。

Bug记录在 http://community.jaspersoft.com/jasperreports-library/issues/3988

  

当我尝试使用6.0.0版本创建PDF / A文档时   JasperReports Library我总是得到一个NullPointerException   com.itextpdf.text.pdf.internal.PdfA1Checker.checkPdfObject,第行。   332。

     

完全相同的报告适用于5.6.1(使用iText 2.1.7js2)   以PDF / A格式导出。

     

如果我们看一下PdfA1Checker的来源,我们会看到(从...开始)   第327行:

     

PdfObject iccProfileStream =   dictionary.get(PdfName.DESTOUTPUTPROFILE); String inputColorSpace =   &#34;&#34 ;; if(iccProfileStream!= null){ICC_Profile icc_profile =   writer.getColorProfile(); //始终返回null tr​​y {inputColorSpace   = new String(icc_profile.getData(),16,4,&#34; US-ASCII&#34;); // NPE !!!访问icc_profile} catch(UnsupportedEncodingException e){throw   新的ExceptionConverter(e); }}

     

我做了一个调试会话,发现了writer.getColorProfile()   始终返回null。这似乎是这种情况,因为JRPdfExporter不初始化它。所以,我想,这个问题是一个副作用   升级到iText 5.5.0。 (我认为PdfWriter.setOutputIntents必须   被调用来正确设置icc_profile ...)

     

希望这有助于解决这个问题。

     

问候,迈克尔

     

v6.0.0 JRPdfExporter