Это хорошо известная проблема с использованием двунаправленного текста. Восклицательный знак, а также пробел не являются символами справа налево. Поэтому мы должны пометить их как таковые, если это необходимо. RIGHT-TO-LEFT MARK (RLM)
- это U+200F
. См. https://en.wikipedia.org/wiki/Bidirectional_text#Table_of_possible_BiDi_character_types.
У меня работает следующий код:
import java.io.FileOutputStream;
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 CreateWordRTLParagraph {
public static void main(String[] args) throws Exception {
XWPFDocument doc= new XWPFDocument();
XWPFParagraph paragraph = doc.createParagraph();
CTP ctp = paragraph.getCTP();
CTPPr ctppr;
if ((ctppr = ctp.getPPr()) == null) ctppr = ctp.addNewPPr();
ctppr.addNewBidi().setVal(STOnOff.ON);
XWPFRun run = paragraph.createRun();
run.setText("שלום עולם \u200F!\u200F");
FileOutputStream out = new FileOutputStream("WordDocument.docx");
doc.write(out);
out.close();
doc.close();
}
}
Обратите внимание на \u200F
знак после пробел и восклицательный знак.
Если текстовые строки исходят из файла, маркировка отдельных символов не будет лучшей практикой. Затем вся текстовая строка должна быть помечена как текст справа налево. Для этого мы можем встроить текстовые строки в U+202B RIGHT-TO-LEFT EMBEDDING (RLE)
, за которым следует U+202C POP DIRECTIONAL FORMATTING (PDF)
.
Пример:
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;
import java.util.List;
public class CreateWordRTLParagraphsFromFile {
public static void main(String[] args) throws Exception {
List<String> lines = Files.readAllLines(new File("HebrewTextFile.txt").toPath(), StandardCharsets.UTF_8);
XWPFDocument doc= new XWPFDocument();
for (String line : lines) {
XWPFParagraph paragraph = doc.createParagraph();
CTP ctp = paragraph.getCTP();
CTPPr ctppr = ctp.getPPr();
if (ctppr == null) ctppr = ctp.addNewPPr();
ctppr.addNewBidi().setVal(STOnOff.ON);
XWPFRun run = paragraph.createRun();
run.setText("\u202E" + line + "\u202C");
}
FileOutputStream out = new FileOutputStream("WordDocument.docx");
doc.write(out);
out.close();
doc.close();
}
}