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

使用Apache PDFBOX生成PDF时印度卢比符号显示为问号求助

解决Apache PDFBox中印度卢比符号(₹)显示为问号的问题

我来帮你搞定这个卢比符号显示的问题!其实核心原因不是编码的问题——你尝试的ISO-8859-1和UTF-8组合没用,是因为PDFBox默认使用的字体(比如Helvetica)**不包含印度卢比符号(U+20B9)**这类Unicode特殊字符。要解决这个问题,关键是要使用支持该符号的字体,并正确配置PDFBox的字体加载方式。

具体解决方案步骤

  • 第一步:选择一个支持印度卢比符号的字体。比如系统自带的Arial Unicode MS、Noto Sans(开源免费),或者其他包含U+20B9字符的字体。
  • 第二步:使用PDFBox的PDType0Font加载这个字体(Type0字体是复合字体,专门用于处理Unicode多字节字符,替代不支持复杂字符的Type1字体)。
  • 第三步:在内容流中使用加载好的字体绘制包含卢比符号的文本。

完整代码示例

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import java.io.File;
import java.io.IOException;

public class TestClass {
    public static void main(String[] args) throws IOException {
        try (PDDocument doc = new PDDocument()) {
            PDPage page = new PDPage();
            doc.addPage(page);
            
            // 加载支持卢比符号的字体(这里以Arial Unicode MS为例,可替换为自身可用的字体路径)
            // Windows系统示例路径:C:/Windows/Fonts/ARIALUNI.TTF
            // Linux/Mac示例路径:/usr/share/fonts/NotoSans-Regular.ttf 或 ~/Library/Fonts/NotoSans-Regular.ttf
            File fontFile = new File("C:/Windows/Fonts/ARIALUNI.TTF");
            PDType0Font font = PDType0Font.load(doc, fontFile);
            
            try (PDPageContentStream cos = new PDPageContentStream(doc, page)) {
                cos.beginText();
                // 设置字体和字号
                cos.setFont(font, 12);
                // 设置文本起始位置
                cos.newLineAtOffset(50, 700);
                // 写入包含卢比符号的文本
                cos.showText("金额:₹1000");
                cos.endText();
            }
            
            // 保存生成的PDF
            doc.save("output.pdf");
        }
    }
}

额外注意事项

  • 如果项目需要跨平台运行,建议把字体文件打包到项目资源目录中(比如src/main/resources/fonts/),然后通过getClass().getResourceAsStream("/fonts/NotoSans-Regular.ttf")的方式加载,避免依赖系统字体路径。
  • 确保使用的PDFBox版本为2.0及以上,旧版本对Unicode字体的支持不够完善。
  • 不要使用PDType1Font加载字体,它仅支持有限的西方字符集,无法显示卢比这类特殊Unicode符号。

内容的提问来源于stack exchange,提问作者Vandana Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:32