JasperReports 无法导出 PDF 文件
JasperReports unable to export PDF files
我正在尝试编写简单的代码来将 JasperPrint 导出到 pdf 文件。准确地说,将字节写入 HTTP 响应。
我的简单代码如下所示:
public static void writePdfReport(final JasperPrint jp,
final HttpServletResponse response,
final String reportName) throws IOException, JRException {
response.setContentType("application/pdf");
response.setHeader("Content-disposition",
"inline; filename=" + (reportName == null ? jp.getName() : reportName).replace('"', '_') + ".pdf");
final OutputStream outStream = response.getOutputStream();
final byte[] pdfBytes = JasperExportManager.exportReportToPdf(jp);
response.setContentLength(pdfBytes.length);
final ByteArrayInputStream bais = new ByteArrayInputStream(pdfBytes);
IOUtils.copy(bais, outStream);
outStream.flush();
IOUtils.closeQuietly(outStream);
}
我的 Maven pom 文件:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.8.1</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.8.1</version>
</dependency>
<dependency>
<groupId>ar.com.fdvs</groupId>
<artifactId>DynamicJasper</artifactId>
<version>5.1.2</version>
</dependency>
问题是每当我调用 writePdfReport
函数时,我都会得到这个异常:
java.lang.NoClassDefFoundError: com/lowagie/text/pdf/FontMapper
at net.sf.jasperreports.engine.JasperExportManager.exportToPdf(JasperExportManager.java:214)
at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdf(JasperExportManager.java:544)
at com.kendaxa.fexcom.core.reports.ReportWriter.writePdfReport(ReportWriter.java:31)
at com.kendaxa.fexcom.core.reports.GenericTableReportSpec.Should generate simple table PDF report(GenericTableReportSpec.groovy:100)
Caused by: java.lang.ClassNotFoundException: com.lowagie.text.pdf.FontMapper
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 4 more
我做了研究,首先,问题似乎出在此处建议的 JasperReports 库中(4 岁):
但是,应用已接受的答案并没有帮助,即使使用最新版本我也会遇到同样的错误。
我还尝试了一种不同的方法来导出受此处启发的文件 Export JasperReport to PDF OutputStream?,但没有成功。
有人有导出 pdf 文件的最新工作解决方案吗?
谢谢大家的帮助。
com.lowagie.text.pdf.FontMapper class 确实存在于 2.1.7 版本的 com.lowagie.itext jar 中。
您是否使用这个确切的版本作为依赖项?在我的工作示例中,这是我使用的版本。
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
如果您已经这样做了,我会确保您的运行时环境只有这个 2.1.7 版本的 itext jar。部署的 jar 库中是否可能包含另一个版本的 itext?
我将一个工作示例推送到 https://github.com/cameronhurd/simple-jasper-report
我正在尝试编写简单的代码来将 JasperPrint 导出到 pdf 文件。准确地说,将字节写入 HTTP 响应。
我的简单代码如下所示:
public static void writePdfReport(final JasperPrint jp,
final HttpServletResponse response,
final String reportName) throws IOException, JRException {
response.setContentType("application/pdf");
response.setHeader("Content-disposition",
"inline; filename=" + (reportName == null ? jp.getName() : reportName).replace('"', '_') + ".pdf");
final OutputStream outStream = response.getOutputStream();
final byte[] pdfBytes = JasperExportManager.exportReportToPdf(jp);
response.setContentLength(pdfBytes.length);
final ByteArrayInputStream bais = new ByteArrayInputStream(pdfBytes);
IOUtils.copy(bais, outStream);
outStream.flush();
IOUtils.closeQuietly(outStream);
}
我的 Maven pom 文件:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.8.1</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.8.1</version>
</dependency>
<dependency>
<groupId>ar.com.fdvs</groupId>
<artifactId>DynamicJasper</artifactId>
<version>5.1.2</version>
</dependency>
问题是每当我调用 writePdfReport
函数时,我都会得到这个异常:
java.lang.NoClassDefFoundError: com/lowagie/text/pdf/FontMapper
at net.sf.jasperreports.engine.JasperExportManager.exportToPdf(JasperExportManager.java:214)
at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdf(JasperExportManager.java:544)
at com.kendaxa.fexcom.core.reports.ReportWriter.writePdfReport(ReportWriter.java:31)
at com.kendaxa.fexcom.core.reports.GenericTableReportSpec.Should generate simple table PDF report(GenericTableReportSpec.groovy:100)
Caused by: java.lang.ClassNotFoundException: com.lowagie.text.pdf.FontMapper
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 4 more
我做了研究,首先,问题似乎出在此处建议的 JasperReports 库中(4 岁):
但是,应用已接受的答案并没有帮助,即使使用最新版本我也会遇到同样的错误。
我还尝试了一种不同的方法来导出受此处启发的文件 Export JasperReport to PDF OutputStream?,但没有成功。
有人有导出 pdf 文件的最新工作解决方案吗? 谢谢大家的帮助。
com.lowagie.text.pdf.FontMapper class 确实存在于 2.1.7 版本的 com.lowagie.itext jar 中。
您是否使用这个确切的版本作为依赖项?在我的工作示例中,这是我使用的版本。
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
如果您已经这样做了,我会确保您的运行时环境只有这个 2.1.7 版本的 itext jar。部署的 jar 库中是否可能包含另一个版本的 itext?
我将一个工作示例推送到 https://github.com/cameronhurd/simple-jasper-report