为什么字体扩展仅适用于 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),在 apache-poi 中嵌入字体
(碧玉报告使用的图书馆)可能是
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
字体。如果您自然将其部署在服务器上,则需要同时部署两者。
通过 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),在 apache-poi 中嵌入字体 (碧玉报告使用的图书馆)可能是 possibile 但是 AFIK(99% 确定)jasper-reports 还没有开发代码来尝试 使用它,因为库不直接支持它。
我现在该怎么办
您误解了字体映射界面
Specify replacement fonts to use ... when not available
这个界面不要放你的字体名称,你指定的字体名称,font-family 会在你的字体不可用时使用,你需要指定在未找到您的字体时应使用的其他标准默认字体。
另一个好的设计规则(没有详细记录)是使用“Family name”(当你配置字体系列时)确切的名称font(如果已安装),因此如果计算机安装了字体,它将被找到,因为您的名字将映射安装的名称。在您的情况下,您应该将“Custom-Font”替换为“Calibri”
为什么我的 html 不起作用?,如
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
字体。如果您自然将其部署在服务器上,则需要同时部署两者。