Java Apache POI镜像阿拉伯语中的单词

Java Apache POI镜像阿拉伯语中的单词,java,apache-poi,arabic,arabic-support,Java,Apache Poi,Arabic,Arabic Support,我正在用java开发一个阿拉伯语OCR应用程序,它从图像中提取阿拉伯语文本,然后将文本保存到Microsoft Word文件中,为此我使用Apache POI库 我的问题是,当我提取一些文本时,单词的顺序很好,但当我将其保存在Word文件中时,单词的顺序有点混乱,看起来像是镜像的 例如: 但在将其保存为一个单词后: 下面是保存Word文件的代码: public class SavingStringAsWordDoc { File f=theGUI.toBeSavedWord;

我正在用java开发一个阿拉伯语OCR应用程序,它从图像中提取阿拉伯语文本,然后将文本保存到Microsoft Word文件中,为此我使用Apache POI库

我的问题是,当我提取一些文本时,单词的顺序很好,但当我将其保存在Word文件中时,单词的顺序有点混乱,看起来像是镜像的

例如:

但在将其保存为一个单词后:

下面是保存Word文件的代码:

public class SavingStringAsWordDoc {


    File f=theGUI.toBeSavedWord;

    public void saveAsWorddd (){
        String st=TesseractPerformer.toBeShown;

        try(FileOutputStream fout=new FileOutputStream(f);XWPFDocument docfile=new XWPFDocument()){

            XWPFParagraph paraTit=docfile.createParagraph();
            paraTit.setAlignment(ParagraphAlignment.LEFT);
            XWPFRun paraTitRun=paraTit.createRun();
            paraTitRun.setBold(true);
            paraTitRun.setFontSize(15);
            paraTit.setAlignment(ParagraphAlignment.RIGHT);
            docfile.createParagraph().createRun().setText(st);  //content to be written
            docfile.write(fout); //adding to output stream
        } catch(IOException e){
            System.out.println("IO ERROR:"+e);
        }
    }
我注意到一件事可能有助于理解这个问题: 如果我将混乱的文本复制到word文件中,然后通过选择(仅保留文本)粘贴选项将其粘贴,则会修复段落的顺序

这需要双向文本方向支持(bidi),并且在ApachePOI的
XWPF
中还没有按照默认值实现。但是底层对象
org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr
支持这一点。因此,我们必须从
XWPFParagraph
获取这个底层对象,然后将
Bidi
设置为on

例如:

import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;

public class CreateWord {

 public static void main(String[] args) throws Exception {

  String content = Files.readString(new File("ArabicTextFile.txt").toPath(), StandardCharsets.UTF_16);

  XWPFDocument document = new XWPFDocument();

  XWPFParagraph paragraph = document.createParagraph();

  // set bidirectional text support on
  CTP ctp = paragraph.getCTP();
  CTPPr ctppr = ctp.getPPr();
  if (ctppr == null) ctppr = ctp.addNewPPr();
  ctppr.addNewBidi().setVal(STOnOff.ON);

  XWPFRun run=paragraph.createRun(); 
  run.setBold(true);
  run.setFontSize(22);
  run.setText(content);

  FileOutputStream out = new FileOutputStream("CreateWord.docx");
  document.write(out);
  out.close();
  document.close();

 }
}
My
ArabicTextFile.txt
包含文本

采用UTF-16编码(Unicode)

结果出现
Word


我尝试了您的方法,但它给了我与以前相同的输出,您认为原因可能是什么?还有一件事我在word文件中注意到,如果我选择阿拉伯文本并右键单击,然后如果我转到粘贴选项,然后选择最右边的一个(仅文本),它删除文本上的格式,并将单词固定到正确的顺序,我想这可能有助于降低成本problem@moamennnn66当前位置我的答案包含一个完整的示例,该示例与我所说的完全相同。请同时展示一个完整的例子来说明问题。