Apache POI保存阿拉伯语文本时出现镜像反转问题求助
问题分析与解决方案
这个问题很典型——阿拉伯语是RTL(从右到左)语言,你当前的代码只设置了段落的右对齐,但没有明确标记段落为RTL文本方向,导致Word渲染时把RTL文本当成LTR(从左到右)处理,出现镜像反转的情况。而粘贴纯文本时Word会自动识别文本的语言方向,所以能恢复正常。
修复步骤:
- 为段落设置RTL文本方向:除了设置右对齐,还要调用段落的
setBidirectional(true)方法,告诉Word这是从右到左的文本。 - 使用支持阿拉伯语的字体:确保你设置的字体能正确渲染阿拉伯文字符,避免出现乱码或排版异常。
- 统一段落属性设置:你的代码里先把标题段落设为LEFT对齐又改成RIGHT,建议统一设置逻辑。
修改后的代码示例:
public class SavingStringAsWordDoc { File f = theGUI.toBeSavedWord; public void saveAsWorddd (){ String st = TesseractPerformer.toBeShown; try(FileOutputStream fout = new FileOutputStream(f); XWPFDocument docfile = new XWPFDocument()){ // 标题段落设置(RTL方向+右对齐) XWPFParagraph paraTit = docfile.createParagraph(); paraTit.setAlignment(ParagraphAlignment.RIGHT); paraTit.setBidirectional(true); // 关键:标记为RTL文本 XWPFRun paraTitRun = paraTit.createRun(); paraTitRun.setBold(true); paraTitRun.setFontSize(15); paraTitRun.setFontFamily("Arial Unicode MS"); // 选用支持阿拉伯语的字体 // 内容段落设置 XWPFParagraph contentPara = docfile.createParagraph(); contentPara.setAlignment(ParagraphAlignment.RIGHT); contentPara.setBidirectional(true); // 同样标记RTL属性 XWPFRun contentRun = contentPara.createRun(); contentRun.setText(st); contentRun.setFontFamily("Arial Unicode MS"); docfile.write(fout); } catch(IOException e){ System.out.println("IO ERROR:"+e); } } }
额外排查点:
- 确认Tesseract提取的文本
toBeShown没有混入LTR控制字符(比如\u200E左到右标记),可以打印文本的Unicode编码进行排查。 - 如果还是有异常,可以尝试在文本开头添加RTL强制标记字符
\u200F,让Word明确识别文本方向:contentRun.setText("\u200F" + st);
内容的提问来源于stack exchange,提问作者Ebdulmomen1
相关产品推荐
相关产品推荐

