使用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
相关产品推荐
相关产品推荐

