在Clojure中使用OpenPDF加载字体时遇到异常问题
解决OpenPDF在Clojure中创建字体的问题
问题核心
你的代码中,io/resource返回的URL转字符串后,格式(如Jar内资源的jar:file:协议路径)不符合BaseFont的加载预期,导致BaseFont创建失败,但异常未被显式捕获,因此出现"无异常信息但字体无效"的现象。
修复方案
直接通过输入流加载字体资源,添加异常捕获排查问题,同时提供降级方案:
(ns invoice.download.pdf (:require [clojure.java.io :as io]) (:import [com.lowagie.text Font Paragraph] [com.lowagie.text.pdf BaseFont])) (defn- add-invoice [document] (try (with-open [font-stream (io/input-stream (io/resource "fonts/Helvetica.ttf"))] (let [base-font (BaseFont/createFont "Helvetica.ttf" BaseFont/IDENTITY_H BaseFont/NOT_EMBEDDED font-stream) font (Font. base-font 12)] (.add document (Paragraph. "Invoice" font)))) (catch Exception e (println "字体创建失败:" (.getMessage e)) ;; 降级使用默认字体保证文档生成 (.add document (Paragraph. "Invoice" (Font. Font/HELVETICA 12))))))
关键说明
- 用
io/input-stream直接读取资源流,BaseFont支持通过流加载字体,避免路径解析错误 with-open确保资源流被正确关闭,防止内存泄漏- 新增异常捕获,打印具体错误信息(比如字体文件缺失、格式不兼容等)
- 提供默认Helvetica字体作为降级方案,保证文档能正常生成
额外检查点
- 确认
resources/fonts/Helvetica.ttf文件存在,路径与代码中一致 - 打包Jar时,确保构建工具(Leiningen/Boot)将resources目录下的字体文件包含进Jar包
内容的提问来源于stack exchange,提问作者Lars Melander
相关产品推荐
相关产品推荐

