Mustang验证PDF时CIDSet条目错误的排查与解决方案
解决方案:JasperReports PDFA-3B验证报错及XMP元数据问题
一、针对CIDSet验证错误的简洁方案
方案1:升级JasperReports版本
该CIDSet生成错误是JasperReports特定版本的已知问题,6.22.0及以上版本已修复此bug。升级到最新稳定版后,无需手动移除CIDSet即可通过Mustang验证。
方案2:禁用字体子集化
在fontsfamily.xml中添加<pdfSubset>false</pdfSubset>配置,直接嵌入完整字体,避免子集化过程中CIDSet生成异常:
<?xml version="1.0" encoding="UTF-8"?> <fontFamilies> <fontFamily name="OpenSans"> <normal><![CDATA[fonts/OpenSans-Regular.ttf]]></normal> <bold><![CDATA[fonts/OpenSans-Bold.ttf]]></bold> <italic><![CDATA[fonts/OpenSans-Italic.ttf]]></italic> <boldItalic><![CDATA[fonts/OpenSans-BoldItalic.ttf]]></boldItalic> <pdfEmbedded><![CDATA[true]]></pdfEmbedded> <pdfSubset><![CDATA[false]]></pdfSubset> </fontFamily> </fontFamilies>
注意:此方法会增大PDF体积,但能彻底规避子集化相关的验证问题。
方案3:通过配置禁用CIDSet生成
在jasperreports.properties中添加以下配置,让PDF导出器跳过CIDSet的生成:
net.sf.jasperreports.export.pdf.font.cid.set.enabled=false
二、解决XMP元数据验证错误
Mustang针对ZUGFeRD合规性验证,需在PDF导出时补充完整的ZUGFeRD元数据。修改导出代码,添加ZUGFeRD专属配置:
generate(JasperReport report, Map<String,Object> data, OutputStream document) { [...] JasperPrint print = JasperFillManager.fillReport(report, data, new JREmptyDataSource()); JRPdfExporter exporter = new JRPdfExporter(); exporter.setExporterInput(new SimpleExporterInput(print)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(document)); SimplePdfExporterConfiguration exportConfig = new SimplePdfExporterConfiguration(); exportConfig.setPdfVersion(PdfVersionEnum.VERSION_1_7); exportConfig.setPdfaConformance(PdfaConformanceEnum.PDFA_3B); exportConfig.setIccProfilePath("AdobeRGB1998.icc"); exportConfig.setMetadataAuthor("Your Name"); exportConfig.setTagged(true); exportConfig.setTagLanguage("en-us"); exportConfig.setEmbedIccProfile(true); // 添加ZUGFeRD元数据配置 SimplePdfZugferdConfiguration zugferdConfig = new SimplePdfZugferdConfiguration(); zugferdConfig.setConformanceLevel(ZugferdConformanceLevelEnum.ZUGFeRD_2_1_BASIC); zugferdConfig.setDocumentType("INVOICE"); zugferdConfig.setDocumentFileName("invoice.pdf"); zugferdConfig.setVersion("2.1"); exporter.setConfiguration(zugferdConfig); exporter.setConfiguration(exportConfig); exporter.exportReport(); [...] }
需确保引入对应类:net.sf.jasperreports.export.SimplePdfZugferdConfiguration、net.sf.jasperreports.export.ZugferdConformanceLevelEnum。
内容的提问来源于stack exchange,提问作者OhJohnny
相关产品推荐
相关产品推荐

