【问题标题】:From where does the jasperreports engine refer to the fonts from?jasperreports 引擎从哪里引用字体?
【发布时间】:2016-10-11 12:59:30
【问题描述】:

我有一个应用程序,我使用 jasper 报告库从在线生成报告。我使用除 Helvetica 以外的任何字体来生成 pdf 报告都是一个问题。我无法检测到字体的引用/加载位置。对于 Helvetica 或 Times-Roman,我没有任何明确的类。

以下是抛出的错误:

net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font : 
pdfFontName   : Times-Roman
pdfEncoding   : Identity-H
isPdfEmbedded : false
at net.sf.jasperreports.engine.export.JRPdfExporter.getFont(JRPdfExporter.java:2036) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.JRPdfExporter.getChunk(JRPdfExporter.java:1818) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.JRPdfExporter.getPhrase(JRPdfExporter.java:1787) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.SimplePdfTextRenderer.getPhrase(SimplePdfTextRenderer.java:89) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.SimplePdfTextRenderer.render(SimplePdfTextRenderer.java:99) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.JRPdfExporter.exportText(JRPdfExporter.java:2158) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:861) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:821) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:698) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:420) ~[jasperreports-5.5.0.jar:5.5.0]

但是对于同一份报告,如果我将 PDF 字体名称命名为 Helvetica,则一切正常。

谁能帮我理解这是如何工作的?另外,如果我想添加一些新字体,我在哪里可以添加它?

按照下面链接中提到的在jasper fonts jar中添加新字体的步骤

http://www.codesuggestions.com/java/jasper-reports/adding-custom-fonts-t...

之前的错误消失了。弹出一个新错误。

Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:121) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:88) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:103) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:61) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:81) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:276) ~[jasperreports-5.5.0.jar:5.5.0]
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:745) ~[jasperreports-5.5.0.jar:5.5.0]

jasperreports-5.5.0.jar 存在于应用程序的类路径中,仍然面临此错误。

【问题讨论】:

  • 要添加字体,您需要使用字体扩展,请参阅stackoverflow.com/questions/33940126/…
  • 感谢皮特的回复。我已经尝试了将字体的 .ttf 导出为 jar 并将其添加到类路径中的上述方法。但是,它不起作用,我仍然得到 Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser 错误。我应该为从 iReports 创建的 jar 提供一个特定的名称,或者任何名称都可以吗?
  • 你使用的是什么字体?确保它与 itext 库 stackoverflow.com/questions/35127956/… 兼容。 java.lang.NoClassDefFoundError,说你缺少一个库,但我需要更多的堆栈跟踪,因为在当前我看不到哪个
  • 我使用的是 arial 字体。在 iReports 中使用 arial 生成 pdf 报告不是问题。问题是当我将它添加到我的应用程序时。
  • 所以你在类路径中缺少字体扩展或其他库,哪个库?,我需要更多的堆栈跟踪来理解edit 问题并ping 我

标签: pdf fonts jasper-reports


【解决方案1】:

我的问题是我错误地理解了异常!因此遵循错误的解决方案。

我遵循的链接中提到的解决方案是为 FontName 属性而不是 PDFFontName 属性添加自定义字体。

Jasper 的 PDFExporter 引用来自 iText.jar 的字体。因此,更改课堂上的 getFont() 方法调用对我有帮助。

font = FontFactory.getFont(
                pdfFont.getPdfFontName(),
                pdfFont.getPdfEncoding(),
                pdfFont.isPdfEmbedded(),
                jrFont.getFontSize() * fontSizeScale,
                pdfFontStyle,
                forecolor
                );

我更改了这一行并为我的 font.ttf 提供了绝对路径。

font = FontFactory.getFont(
                "D\\fonts\\Arial.ttf",
                BaseFont.IDENTITY_H,
                BaseFont.EMBEDDED,
                jrFont.getFontSize() * fontSizeScale,
                pdfFontStyle,
                forecolor
                );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2023-04-06
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多