Apache FOP无法加载自定义Lato字体问题求助
针对你遇到的Font "Lato,normal,700" not found和Font "Lato,normal,400" not found警告,结合FOP 2.2和Web环境的特点,给你几个可行的排查和修复步骤:
修正字体文件的路径配置
你的fop.xconf里字体路径用的是相对路径,但FOP会基于fop配置文件所在的目录去查找字体文件,而你的字体文件在resource目录下,Web环境下直接用相对路径大概率找不到。可以改成类路径引用的方式:修改fop.xconf里的字体配置部分,给路径加上
classpath:前缀:<fonts> <font metrics-url="classpath:Lato-Regular.xml" kerning="yes" embed-url="classpath:Lato-Regular.ttf"> <font-triplet name="Lato" style="normal" weight="400"/> </font> <font metrics-url="classpath:Lato-Bold.xml" kerning="yes" embed-url="classpath:Lato-Bold.ttf"> <font-triplet name="Lato" style="normal" weight="700"/> </font> </fonts>这样FOP会从类路径(包括resource目录)里加载字体文件,适配Web环境的打包部署场景。
确保FOP配置文件的加载方式正确
你当前用new File("\\fop.xconf")加载配置文件,这种方式在Web环境下会因为工作目录变化而失效,应该改用类加载器加载配置:// 替换原来的fopConf加载方式 InputStream confStream = ClassLoader.getSystemResourceAsStream("fop.xconf"); FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI(), confStream);把fop.xconf也放到resource目录下,这样无论是本地运行还是Web部署,都能正确读取配置。
验证字体度量文件(XML)的正确性
确保你用FOP官方的ttfreader工具生成XML度量文件,而不是手动修改或用其他工具生成。生成命令如下(FOP 2.2的bin目录下有这个工具):ttfreader Lato-Regular.ttf Lato-Regular.xml ttfreader Lato-Bold.ttf Lato-Bold.xml生成的XML文件里应该包含正确的字体名称、权重等信息,和你在font-triplet里配置的一致。
检查XSL文件中的字体引用
确认你的XSL(foo.xsl)里引用字体的地方,font-family拼写完全正确,比如:<fo:block font-family="Lato" font-weight="400">普通文本</fo:block> <fo:block font-family="Lato" font-weight="700">加粗文本</fo:block>注意不要有多余的空格或大小写错误,FOP对字体名称的匹配是严格的。
Web环境下的额外注意事项
如果是Web应用,确保打包后的WAR/JAR文件中,字体文件(ttf、xml)和fop.xconf都正确包含在类路径下(比如WEB-INF/classes目录),没有被打包工具忽略。
我之前在Web项目中遇到过类似问题,通过调整路径为类路径引用和修正配置加载方式解决了,你可以按上面的步骤逐一排查。
内容的提问来源于stack exchange,提问作者Sategroup

