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

手动创建TextRenderInfo时获取空格异常,如何正确实现?

问题原因及解决方法

为什么返回乱码�?

TextRenderInfo.getText() 不是直接返回传入的 PdfString 内容,而是通过当前GraphicsState中的字体,将PdfString的字节数据转换为Unicode文本。你当前使用的GraphicsState里的字体,没有将空格对应的字节映射到正确的Unicode字符,导致解析失败,显示为乱码�。

正确创建TextRenderInfo返回空格的方法

有两种可靠的实现方式:

方式一:使用Unicode编码的PdfString

直接创建带有Unicode标记的PdfString,让TextRenderInfo跳过字体编码解析,直接识别Unicode字符:

// 用Unicode编码指定空格字符
final PdfString spacePdfString = new PdfString("\u0020", PdfObject.TEXT_UNICODE);
final TextRenderInfo spaceInfo = new TextRenderInfo(spacePdfString, newStringInfo.getGraphicsState(), newStringInfo.getTextMatrix(), new Stack<>());
System.out.println(spaceInfo.getText()); // 输出正常空格

方式二:确保GraphicsState的字体支持空格编码

如果必须使用普通PdfString,要保证GraphicsState中的字体能解析空格的字节编码(比如使用标准Helvetica字体):

// 创建支持空格编码的基础字体
BaseFont baseFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
PdfFont pdfFont = new PdfFont(baseFont, 12);

// 初始化包含该字体的GraphicsState
GraphicsState gs = new GraphicsState();
gs.setFont(pdfFont);

// 创建普通空格的PdfString并生成TextRenderInfo
PdfString spacePdfString = new PdfString(" ");
TextRenderInfo spaceInfo = new TextRenderInfo(spacePdfString, gs, new Matrix(), new Stack<>());
System.out.println(spaceInfo.getText()); // 输出正常空格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:10:10