使用 JaspersReport 加载字体时出现问题
Issue with loading font using JaspersReport
我在加载自己的字体时遇到问题。
我已经使用 iReports 和这个 tutorial.
导出了字体
这导致文件:
/resources/jasperreports_extension.properties
/resources/fonts/fontsfamily1480698239543.xml
/resources/fonts/Lato-Bold.ttf
/resources/fonts/Lato-BoldItalic.ttf
/resources/fonts/Lato-Italic.ttf
/resources/fonts/Lato-Regular.ttf
其中 jasperreports_extension.properties
:
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.Lato=fonts/fontsfamily1480698239543.xml
和fontsfamily1480698239543.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="Lato">
<normal><![CDATA[fonts/Lato-Regular.ttf]]></normal>
<bold><![CDATA[fonts/Lato-Bold.ttf]]></bold>
<italic><![CDATA[fonts/Lato-Italic.ttf]]></italic>
<boldItalic><![CDATA[fonts/Lato-BoldItalic.ttf]]></boldItalic>
<pdfEncoding><![CDATA[Cp1250]]></pdfEncoding>
<pdfEmbedded><![CDATA[true]]></pdfEmbedded>
</fontFamily>
</fontFamilies>
在我的 report.jrxml 中,我使用以下文本:
<staticText>
<reportElement style="Colored" x="119" y="93" width="161" height="15" uuid="724f085b-cb64-4d11-ac64-dc23e6f04553"/>
<textElement markup="none">
<font fontName="Lato" size="10" pdfEncoding="Cp1250" isPdfEmbedded="true"/>
</textElement>
<text><![CDATA[Whatever]]></text>
</staticText>
<staticText>
<reportElement x="198" y="200" width="154" height="24" uuid="95b310d8-19bf-4485-840f-f3f5076b225e"/>
<textElement markup="none">
<font size="14" isItalic="false" isUnderline="false" pdfFontName="Lato" pdfEncoding="Cp1250" isPdfEmbedded="true"/>
</textElement>
<text><![CDATA[Address:]]></text>
</staticText>
当我尝试生成文件时,出现以下错误:
net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font:
pdfFontName: Lato
pdfEncoding: Cp1250
isPdfEmbedded : true] with root cause
net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font:
pdfFontName: Lato
pdfEncoding: Cp1250
isPdfEmbedded : true
at net.sf.jasperreports.engine.export.JRPdfExporter.getFont(JRPdfExporter.java:2176) ~[jasperreports-6.1.0.jar:6.1.0]
我做错了什么?
更新
我已经根据 AlexK 和 dada67 的评论应用了更改,但这仍然没有更改 PDF 中生成的字体。但是,我可以在 iReports 应用程序中看到字体。我现在使用:
<staticText>
<reportElement x="198" y="200" width="154" height="24" uuid="95b310d8-19bf-4485-840f-f3f5076b225e"/>
<textElement markup="none">
<font size="14" fontName="Lato"/>
</textElement>
<text><![CDATA[Address:]]></text>
</staticText>
这不会引发任何错误。
以下是我在 java 中生成 pdf 的方式:
ClassLoader classLoader = getClass().getClassLoader();
JasperReport jasperReportSpec = JasperCompileManager.compileReport(classLoader.getResourceAsStream("reporting/Example.jrxml"));
JasperPrint jasperPrintSpec = JasperFillManager.fillReport(jasperReportSpec, parameters, new JREmptyDataSource());
files.put("generatedFile", JasperExportManager.exportReportToPdf(jasperPrintSpec));
当您使用字体扩展时,您应该只设置 fontName 属性。
从文本元素中删除 pdfFontName、pdfEncoding 和 isPdfEmbedded 属性,以便 PDF 导出器将使用字体扩展中定义的字体。
原来问题是我没有在我的类路径中加载字体。感谢@AlexD,我已经设法使用 maven 添加它。
我在加载自己的字体时遇到问题。
我已经使用 iReports 和这个 tutorial.
导出了字体这导致文件:
/resources/jasperreports_extension.properties
/resources/fonts/fontsfamily1480698239543.xml
/resources/fonts/Lato-Bold.ttf
/resources/fonts/Lato-BoldItalic.ttf
/resources/fonts/Lato-Italic.ttf
/resources/fonts/Lato-Regular.ttf
其中 jasperreports_extension.properties
:
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.Lato=fonts/fontsfamily1480698239543.xml
和fontsfamily1480698239543.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="Lato">
<normal><![CDATA[fonts/Lato-Regular.ttf]]></normal>
<bold><![CDATA[fonts/Lato-Bold.ttf]]></bold>
<italic><![CDATA[fonts/Lato-Italic.ttf]]></italic>
<boldItalic><![CDATA[fonts/Lato-BoldItalic.ttf]]></boldItalic>
<pdfEncoding><![CDATA[Cp1250]]></pdfEncoding>
<pdfEmbedded><![CDATA[true]]></pdfEmbedded>
</fontFamily>
</fontFamilies>
在我的 report.jrxml 中,我使用以下文本:
<staticText>
<reportElement style="Colored" x="119" y="93" width="161" height="15" uuid="724f085b-cb64-4d11-ac64-dc23e6f04553"/>
<textElement markup="none">
<font fontName="Lato" size="10" pdfEncoding="Cp1250" isPdfEmbedded="true"/>
</textElement>
<text><![CDATA[Whatever]]></text>
</staticText>
<staticText>
<reportElement x="198" y="200" width="154" height="24" uuid="95b310d8-19bf-4485-840f-f3f5076b225e"/>
<textElement markup="none">
<font size="14" isItalic="false" isUnderline="false" pdfFontName="Lato" pdfEncoding="Cp1250" isPdfEmbedded="true"/>
</textElement>
<text><![CDATA[Address:]]></text>
</staticText>
当我尝试生成文件时,出现以下错误:
net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font:
pdfFontName: Lato
pdfEncoding: Cp1250
isPdfEmbedded : true] with root cause
net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font:
pdfFontName: Lato
pdfEncoding: Cp1250
isPdfEmbedded : true
at net.sf.jasperreports.engine.export.JRPdfExporter.getFont(JRPdfExporter.java:2176) ~[jasperreports-6.1.0.jar:6.1.0]
我做错了什么?
更新
我已经根据 AlexK 和 dada67 的评论应用了更改,但这仍然没有更改 PDF 中生成的字体。但是,我可以在 iReports 应用程序中看到字体。我现在使用:
<staticText>
<reportElement x="198" y="200" width="154" height="24" uuid="95b310d8-19bf-4485-840f-f3f5076b225e"/>
<textElement markup="none">
<font size="14" fontName="Lato"/>
</textElement>
<text><![CDATA[Address:]]></text>
</staticText>
这不会引发任何错误。
以下是我在 java 中生成 pdf 的方式:
ClassLoader classLoader = getClass().getClassLoader();
JasperReport jasperReportSpec = JasperCompileManager.compileReport(classLoader.getResourceAsStream("reporting/Example.jrxml"));
JasperPrint jasperPrintSpec = JasperFillManager.fillReport(jasperReportSpec, parameters, new JREmptyDataSource());
files.put("generatedFile", JasperExportManager.exportReportToPdf(jasperPrintSpec));
当您使用字体扩展时,您应该只设置 fontName 属性。
从文本元素中删除 pdfFontName、pdfEncoding 和 isPdfEmbedded 属性,以便 PDF 导出器将使用字体扩展中定义的字体。
原来问题是我没有在我的类路径中加载字体。感谢@AlexD,我已经设法使用 maven 添加它。