4

通过 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)时遇到了问题。Web 浏览器或办公应用程序似乎无法识别“自定义字体”并回退到它们的默认字体之一:XLS 报告默认为 DejaVu Sans,而 HTML 和 DOC 报告默认为 Times New Roman。PDF、XLS、DOC 和 HTML 格式的输出分别如下:

文件输出

我觉得我们必须在这里遗漏一些明显的东西——也许我们缺少一些模糊的 JRExporter 配置?

4

1 回答 1

3

一些背景

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

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

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

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

我现在该怎么办

你误解了字体映射界面

指定要使用的替换字体...当不可用时

在这个界面中你不应该输入你的字体名称,你指定的字体名称,font-family 当你的字体不可用时,你需要指定其他标准的默认字体,如果你的字体没有找到应该使用.

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

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

于 2017-09-28T07:27:05.970 回答