Apache POI 镜像阿拉伯语单词
Apache POI Mirroring Words in Arabic Language
我正在 java 中开发阿拉伯语 OCR 应用程序,它提取图像中的阿拉伯语文本,然后将文本保存到 Microsoft Word 文件中,为此我使用 Apache-POI 库。
我的问题是,当我提取一些文本时,单词的顺序很好,但是当我将它保存在 Word 文件中时,单词的顺序有点乱,看起来像镜像
例如:
但是在将其保存为 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),默认情况下尚未在 Apache Poi 的 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();
}
}
我的 ArabicTextFile.txt
包含文本
这是阿拉伯语的文字,但阿拉伯语的文字
采用 UTF-16 编码 (Unicode)。
结果Word
:
我正在 java 中开发阿拉伯语 OCR 应用程序,它提取图像中的阿拉伯语文本,然后将文本保存到 Microsoft Word 文件中,为此我使用 Apache-POI 库。
我的问题是,当我提取一些文本时,单词的顺序很好,但是当我将它保存在 Word 文件中时,单词的顺序有点乱,看起来像镜像
例如:
但是在将其保存为 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),默认情况下尚未在 Apache Poi 的 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();
}
}
我的 ArabicTextFile.txt
包含文本
这是阿拉伯语的文字,但阿拉伯语的文字
采用 UTF-16 编码 (Unicode)。
结果Word
: