You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:45:35