如何在Apache FOP的fop.xconf中配置跨平台字体相对路径?
解决FOP配置中字体相对路径问题(旧版本兼容)
1. 直接指定类路径下的字体文件(推荐方案)
由于你的字体文件放在src/main/resources/fonts/下,打包后会进入项目的classpath,直接使用classpath协议指定单个字体是最可靠的方式,旧版本FOP也支持该协议。
修改后的fop.conf配置:
<?xml version="1.0" encoding="utf-8" ?> <fop> <renderers> <renderer mime="application/pdf"> <fonts> <font kerning="yes" embed-url="classpath:fonts/Arial.ttf" embedding-mode="subset"> <font-triplet name="Arial" style="normal" weight="400"/> </font> </fonts> </renderer> </renderers> </fop>
该配置在开发阶段和生产环境(打包成Jar后)都能正常加载字体,无需依赖系统路径或外部目录。
2. 目录方式配置(仅适合开发环境)
如果坚持使用<directory>配置,需要在初始化FOPFactory时设置正确的baseUri,让FOP以此为基准解析相对路径:
Java代码初始化:
// 将项目根目录设为baseUri FopFactory fopFactory = FopFactory.newInstance(new File(System.getProperty("user.dir")).toURI()); // 加载配置文件 fopFactory.setUserConfig(new File("fop.conf"));
对应fop.conf的目录配置:
<?xml version="1.0" encoding="utf-8" ?> <fop> <renderers> <renderer mime="application/pdf"> <fonts> <directory>src/main/resources/fonts/</directory> </fonts> </renderer> </renderers> </fop>
注意:这种方式仅在开发阶段有效,打包成Jar后src目录不存在,无法加载字体,因此不推荐用于生产环境。
3. 验证字体加载状态
开启FOP的字体调试日志,确认字体是否成功加载:
将org.apache.fop.fonts的日志级别设置为DEBUG,日志中会输出字体查找和加载的详细过程,可快速排查路径或配置错误。
内容的提问来源于stack exchange,提问作者midi
相关产品推荐
相关产品推荐

