Jasper Reports 6.17.0导出PDF时报表设置Arial字体却生成Helvetica字体的原因咨询
各位好,我最近在使用Jasper Reports 6.17.0开发Java报表导出功能时遇到了一个困惑的字体问题,想和大家探讨下原因:
我在报表设计里明确设置了Arial字体,但导出的PDF文件里却显示用的是Helvetica字体。我已经知道修复方案——把Arial字体添加到Jasper Studio中导出字体扩展,再放到项目类路径里,相关文档和讨论里都有说明,但我始终搞不懂为什么必须这么做:
- 我觉得Arial根本不是什么自定义字体,它是系统里很常见的字体,而字体扩展机制的作用应该是为自定义字体提供跨平台兼容性保障,但我完全不需要100%跨平台,只需要在当前环境正常使用Arial就好。
先和大家梳理下我对PDF字体的理解,PDF里的字体分两种:
- 嵌入字体:包含字符绘制的全部细节,不依赖系统环境
- 非嵌入字体:只记录字体名称,依赖阅读器所在的系统去查找对应字体
我的Arial字体在Jasper Studio里能正常选中,本地操作系统也已经安装了,但为什么Jasper Reports还是不认,非要我把它放到类路径里?我猜测是不是Jasper默认会强制嵌入所有报表里使用的字体?
基于这个猜测,我想到两个可能的解决方向,但不确定是否可行:
- 能不能让Jasper导出PDF时使用非嵌入字体,只写入Arial的字体名称?我认为PDF阅读器应该可以调用系统里已安装的Arial来渲染
- 如果Jasper确实需要嵌入字体,那会不会是我的Java环境无法访问到系统里安装的Arial字体?
另外还有一个奇怪的点:我从来没有把Helvetica字体添加到类路径里,但导出的PDF里却出现了它。我检查过jasperreport.jar里并没有包含Helvetica的ttf文件,完全不知道Jasper是从哪里获取的这个字体。后来我查了PDF 1.5的规范,里面提到:
• PDF prescribes a set of 14 standard fonts that can be used without prior definition. These include four faces each of three Latin text typefaces (Courier, Helvetica*, and Times*), as well as two symbolic fonts (Symbol and ITC Zapf Dingbats® ). These fonts, or suitable substitute fonts with the same metrics, are required to be available in all PDF viewer applications.
• A PDF file can refer by name to fonts that are not embedded in the PDF file. In this case, a viewer application will use those fonts if they are available in the viewer’s environment. This approach suffers from the uncertainties noted above.
看起来Helvetica是PDF的标准字体之一,是不是Jasper并没有真的嵌入它,只是在PDF里写了这个标准字体的名称?
最后回到核心问题:为什么我在报表里设置的是Arial字体,导出PDF后却变成了Helvetica? 希望有懂Jasper字体机制的朋友能帮忙解惑。
备注:内容来源于stack exchange,提问作者Mariusz

