为什么字体扩展仅适用于PDF而不适用于其他格式(HTML,XLS,DOC)?

时间:2017-09-27 12:44:45

标签: html fonts jasper-reports export-to-excel export-to-word

通过Jaspersoft Studio,我们使用以下设置将用于webapp的内置Windows Calibri字体变体导出到字体扩展JAR中:

Font Settings

导出的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中的输出分别如下:

Document output

我觉得我们必须遗漏一些明显的东西 - 或许我们缺少一些模糊的JRExporter配置?

1 个答案:

答案 0 :(得分:2)

一些背景

字体通常存在于文档之外(安装在pc上),并非所有文档类型都允许您在文档中嵌入(包含)字体。与您的文档类型相关,可以将字体嵌入到文档中。

  • PDF ,是的,您可以嵌入字体

  • HTML ,字体不能直接嵌入,但jasper-report会创建 包含@font-face和网址的css,因此如果支持broswer 它,字体将被下载

  • Office (xls,xlsx,doc,docx,ppt),在中嵌入字体 (jasper报告使用的库)可能是 possibile 但是AFIK(99%肯定)jasper-reports还没有开发代码来尝试和 使用它,因为库没有直接支持。

我现在应该做什么

您误解了字体映射界面

  

指定替换字体,以便在不可用时使用

在此界面中,您不应该在字体不可用时时输入您指定的字体名称,字体名称,字体系列,您需要指定其他标准默认字体如果找不到你的字体,应该使用它。

另一个好的设计规则(没有详细记录)是用作“姓氏”(当您配置字体系列时)字体的确切名称(如果安装),因此如果计算机安装了字体,它将被找到,因为你的名字将映射安装的名称。在您的情况下,您应该将“Custom-Font”替换为“Calibri”

为什么我的html不能正常工作?,如comment dada67所示,如果您想使用自定义字体,则不应使用字体映射作为html映射将重定向到映射的字体),然后使用

之类的代码搜索css
JasperReport 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字体。如果您自然地在服务器上部署它,则需要部署它们。