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

Why is font extension working only for PDF but not for other formats (HTML, XLS, DOC)?

通过 Jaspersoft Studio,我们使用以下设置将用于 Web 应用程序的内置 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 等其他格式时遇到了问题。网络浏览器或办公应用程序似乎无法识别 "Custom-Font" 并回退到它们的默认字体之一:XLS 报告默认为 DejaVu Sans,而 HTML 和 DOC 报告默认为 Times新罗马。 PDF、XLS、DOC、HTML格式输出分别如下:

我觉得我们一定遗漏了一些明显的东西 - 也许我们缺少一些晦涩的 JRExporter 配置?

一些背景

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

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

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

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

我现在该怎么办

您误解了字体映射界面

Specify replacement fonts to use ... when not available

这个界面不要放你的字体名称,你指定的字体名称,font-family 会在你的字体不可用时使用,你需要指定在未找到您的字体时应使用的其他标准默认字体。

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

为什么我的 html 不起作用?,如 by 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字体。如果您自然将其部署在服务器上,则需要同时部署两者。