手动创建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
相关产品推荐
相关产品推荐

