当前位置: 首页 > 知识库问答 >
问题:

如何将报表导出到PDF/A-1A、PDF/A-1B?

微生恩
2023-03-14

在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 |
+----------------+--------+
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="reputation" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a88bd694-4f90-41fc-84d0-002b90b2d73e">
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="User" class="java.lang.String"/>
    <field name="Rep" class="java.lang.Long"/>
    <columnHeader>
        <band height="20" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="20" uuid="9e7b5f50-5795-4c95-a122-f14f2e3f9366"/>
                <box leftPadding="3" bottomPadding="0" rightPadding="3">
                    <pen lineWidth="0.25"/>
                    <topPen lineWidth="0.25"/>
                    <leftPen lineWidth="0.25"/>
                    <bottomPen lineWidth="0.5" lineStyle="Double"/>
                    <rightPen lineWidth="0.25"/>
                </box>
                <textElement verticalAlignment="Middle">
                    <font fontName="SansSerif" isBold="true"/>
                </textElement>
                <text><![CDATA[User]]></text>
            </staticText>
            <staticText>
                <reportElement x="100" y="0" width="100" height="20" uuid="4a6f0a2a-d9b5-4e74-a9e8-0f965336f2bf"/>
                <box leftPadding="3" bottomPadding="0" rightPadding="3">
                    <pen lineWidth="0.25"/>
                    <topPen lineWidth="0.25"/>
                    <leftPen lineWidth="0.25"/>
                    <bottomPen lineWidth="0.5" lineStyle="Double"/>
                    <rightPen lineWidth="0.25"/>
                </box>
                <textElement textAlignment="Right" verticalAlignment="Middle">
                    <font fontName="SansSerif" isBold="true"/>
                </textElement>
                <text><![CDATA[Reputation]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="20" uuid="8ff583b9-88dc-4726-85e1-16d79de78095"/>
                <box leftPadding="3" bottomPadding="0" rightPadding="3">
                    <pen lineWidth="0.25"/>
                    <topPen lineWidth="0.25"/>
                    <leftPen lineWidth="0.25"/>
                    <bottomPen lineWidth="0.25"/>
                    <rightPen lineWidth="0.25"/>
                </box>
                <textElement verticalAlignment="Middle">
                    <font fontName="SansSerif"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{User}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="20" uuid="ebd33b2f-7297-41c2-9dc7-78ff472890c4"/>
                <box leftPadding="3" bottomPadding="0" rightPadding="3">
                    <pen lineWidth="0.25"/>
                    <topPen lineWidth="0.25"/>
                    <leftPen lineWidth="0.25"/>
                    <bottomPen lineWidth="0.25"/>
                    <rightPen lineWidth="0.25"/>
                </box>
                <textElement textAlignment="Right" verticalAlignment="Middle">
                    <font fontName="SansSerif"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{Rep}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <pageFooter>
        <band height="140">
            <pieChart>
                <chart isShowLegend="false">
                    <reportElement x="225" y="-670" width="320" height="140" uuid="23bd26a6-04a4-406f-8a1a-5e1b260cb75d"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <pieDataset>
                    <keyExpression><![CDATA[$F{User}]]></keyExpression>
                    <valueExpression><![CDATA[$F{Rep}]]></valueExpression>
                </pieDataset>
                <piePlot>
                    <plot/>
                    <itemLabel/>
                </piePlot>
            </pieChart>
        </band>
    </pageFooter>
</jasperReport>
JasperReport report = JasperCompileManager.compileReport("reputation.jrxml");
JRCsvDataSource datasource = new JRCsvDataSource("usersRep.csv");
datasource.setFieldDelimiter(';');
datasource.setUseFirstRowAsHeader(true);

JasperPrint jasperPrint = JasperFillManager.fillReport(report, new HashMap<String, Object>(),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?

共有1个答案

奚瑾瑜
2023-03-14

需要JasperReports库4.1.2.3或更高版本(6.0.0中已停止支持,请参阅末尾的NullPointerException)。

这些步骤是生成PDF/a所需要的,它们可以通过java代码或将jrxmlproperty设置为根标记(jasper-server支持)来实现。我将展示这两种方法,但只有一种方法是必要的。

#设置PDF/A一致性

configuration.setPdfaConformance(PdfaConformanceEnum.PDFA_1A); // or PdfaConformanceEnum.PDFA_1B
<property name="net.sf.jasperreports.export.pdfa.conformance" value="pdfa1a" />

#设置ICC配置文件

避免jrpdfaiccprofileNotfoundexception:ICC配置文件对JVM不可用

Java

configuration.setIccProfilePath("srgb.icc");
<property name="net.sf.jasperreports.export.pdfa.icc.profile.path" value="srgb.icc" />
com.lowagie.text.pdf.PdfXConformanceException: All the fonts must be embedded. This one isn't: Helvetica

在jrxml中包含默认样式,指示包含在字体扩展中的fontname,例如

<style name="default" isDefault="true" fontName="DejaVu Sans"/>

#删除不允许的透明对象和层(可选内容组)

避免PDFXConformanceException:不允许透明

java prettyprint-override">public class NoTransparencyCustomizer implements JRChartCustomizer{
    @Override
    public void customize(JFreeChart chart, JRChart jrchart) {
        PiePlot plot = (PiePlot) chart.getPlot();
        plot.setLabelShadowPaint(Color.GRAY);       
    }
}
configuration.setTagged(true);
configuration.setTagLanguage("en-us");
<property name="net.sf.jasperreports.export.pdf.tagged" value="true" />
<property name="net.sf.jasperreports.export.pdf.tag.language" value="en-us"/>

#结果

这是实现上述操作的结果,将fontname切换到dejavu sans并使用捆绑的jasperreports-fonts.jar作为font-extension。已在PDF/A-1A和PDF/A-1B的pdf-tools上成功验证

对我来说没有一块蛋糕

Validating file "reputation.pdf" for conformance level pdfa-1a
dc:description/*[0] :: Missing language qualifier.
dc:title/*[0] :: Missing language qualifier.
The XMP property 'dc:title' is not synchronized with the document information entry 'Title'.
The XMP property 'dc:description' is not synchronized with the document information entry 'Subject'.
configuration.setMetadataTitle("Title");
configuration.setMetadataSubject("Subject");

在jasper report version 6.0.0中停止支持,始终抛出com.itextpdf.text.pdf.internal.pdfa1Checker.CheckpdfObject处的NullPointerException。在6.0.4及以上版本中已经解决了这一问题(参见Jasper报告跟踪器)。

 类似资料:
  • 在java swing(桌面)应用程序中,我需要将jasper报告导出为PDF文件。下面的代码输出jasper报告和pdf文件,但问题是pdf的大小为零,没有显示报告内容,甚至无法打开pdf,jasper版本为3.1.4,jasperreports-3.1.4。罐子

  • 目前我正在尝试将PDF转换为PDF/A。 然而,不知何故,我不知道我是否可以转换色彩空间,有没有办法这样做? 这是我的代码,然而: 色彩空间被添加但是在验证我得到: 对于每个页面/元素,它都经常出现。 我能做点什么来反对它吗?比如转换颜色空间?使用她的图书馆?

  • 问题描述 (Problem Description) 如何使用Java在PDF中创建表。 解决方案 (Solution) 以下是使用Java在PDF中创建表的程序。 import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Do

  • 我需要使用Apache FOP后端将docx文档导出到Ubuntu服务器上的PDF/1b。 该文档没有什么花哨的,它使用基本的窗口字体Calibri,Courier New,Times New Roman,Symbol,Wingdings。PDF/A-1b 配置文件需要嵌入所有字体,包括标准的 base-14 字体,所以我从 /usr/share/fonts/type1/urw-base35 中提

  • 我试图在jrxml中创建表格。表格中的列数可能会很大,当我试图以PDF格式导出报告时,由于列数很大,数据变得不可读。有什么方法可以让我们以更大的页面尺寸(如A3)导出报告,或者在A4尺寸上增加滚动功能。注意:报告只需要导出为pdf格式,而不是CSV或任何其他格式。 谢谢,任何帮助感谢。

  • 在上一章中,我们已经了解了如何将JavaScript添加到PDF文档中。 现在让我们学习如何将给定的PDF文档拆分成多个文档。 拆分PDF文档中的页面 您可以使用名为Splitter的类将给定的PDF文档拆分为多个PDF文档。 此类用于将给定的PDF文档拆分为多个其他文档。 以下是拆分现有PDF文档的步骤 第1步:加载现有PDF文档 使用PDDocument类的静态方法load()加载现有PDF文