通过Jaspersoft Studio,我们使用以下设置将用于webapp的内置Windows Calibri字体变体导出到字体扩展JAR中:
导出的jrfontextensions.jar中的目录结构如下:
--jrfontextensions
--jasperreports_extension.properties
--fonts
--fontsfamily1505796949749.xml
--Custom_Font
--calibri.ttf
--calibrib.ttf
--calibrii.ttf
--calibriz.ttf
jasperreports_extension.properties的内容:
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ireportfamily1505796949749=fonts/fontsfamily1505796949749.xml
fontsfamily1505796949749.xml的内容:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="Custom-Font">
<normal><![CDATA[fonts/Custom_Font/calibri.ttf]]></normal>
<bold><![CDATA[fonts/Custom_Font/calibrib.ttf]]></bold>
<italic><![CDATA[fonts/Custom_Font/calibrii.ttf]]></italic>
<boldItalic><![CDATA[fonts/Custom_Font/calibriz.ttf]]></boldItalic>
<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
<pdfEmbedded><![CDATA[true]]></pdfEmbedded>
<exportFonts>
<export key="html"><![CDATA[Custom-Font]]></export>
<export key="rtf"><![CDATA[Custom-Font]]></export>
<export key="xhtml"><![CDATA[Custom-Font]]></export>
</exportFonts>
</fontFamily>
</fontFamilies>
现在,当我们将此报告导出为PDF时,嵌入到PDF中的Calibri字体会像预期的那样正确显示自定义字体。
但是在尝试将报告导出为HTML,DOC和XLS等其他格式时遇到了问题。似乎Web浏览器或办公应用程序无法识别“自定义字体”并回退到其默认字体之一:XLS报告默认为DejaVu Sans,而HTML和DOC报告默认为Times New Roman。 PDF,XLS,DOC和HTML中的输出分别如下:
我觉得我们必须遗漏一些明显的东西 - 或许我们缺少一些模糊的JRExporter配置?
答案 0 :(得分:2)
字体通常存在于文档之外(安装在pc上),并非所有文档类型都允许您在文档中嵌入(包含)字体。与您的文档类型相关,可以将字体嵌入到文档中。
PDF ,是的,您可以嵌入字体
HTML ,字体不能直接嵌入,但jasper-report会创建
包含@font-face
和网址的css,因此如果支持broswer
它,字体将被下载
Office (xls,xlsx,doc,docx,ppt),在apache-poi中嵌入字体 (jasper报告使用的库)可能是 possibile 但是AFIK(99%肯定)jasper-reports还没有开发代码来尝试和 使用它,因为库没有直接支持。
您误解了字体映射界面
指定替换字体,以便在不可用时使用
在此界面中,您不应该在字体不可用时时输入您指定的字体名称,字体名称,字体系列,您需要指定其他标准默认字体如果找不到你的字体,应该使用它。
另一个好的设计规则(没有详细记录)是用作“姓氏”(当您配置字体系列时)字体的确切名称(如果安装),因此如果计算机安装了字体,它将被找到,因为你的名字将映射安装的名称。在您的情况下,您应该将“Custom-Font”替换为“Calibri”
为什么我的html不能正常工作?,如comment dada67所示,如果您想使用自定义字体,则不应使用字体映射作为html映射将重定向到映射的字体),然后使用
之类的代码搜索cssJasperReport report = JasperCompileManager.compileReport("jasper/FontExportTest.jrxml");
JasperPrint jasperPrint = JasperFillManager.fillReport(report, new HashMap<String, Object>(), new JREmptyDataSource());
HtmlExporter exporter = new HtmlExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleHtmlExporterOutput(new File("myHtml.html")));
SimpleHtmlExporterConfiguration configuration = new SimpleHtmlExporterConfiguration();
exporter.setConfiguration(configuration);
exporter.exportReport();
JasperReport将同时创建文件myHtml.html
以及名称为myHtml_htmlfiles
的文件夹,此文件夹中应包含css以及.ttf
字体。如果您自然地在服务器上部署它,则需要部署它们。