Android平台iText阿拉伯文排版多行倒置问题求助
解决iText处理多行阿拉伯文本时行序倒置问题
问题描述
使用以下iText的shapeArabicText方法处理多行阿拉伯文本时,出现文本行顺序从下到上排列的异常:
private fun shapeArabicText(text: String): String { val arabicShaping = ArabicShaping(ArabicShaping.LETTERS_SHAPE) var shapedText: String = arabicShaping.shape(text) val bid = Bidi(shapedText, Bidi.DIRECTION_RIGHT_TO_LEFT) if (bid.isMixed || bid.isRightToLeft) { bid.reorderingMode = 0 bid.isInverse = true shapedText = bid.writeReordered(Bidi.DO_MIRRORING.toInt()) } return shapedText }
输入文本:
هذا النص هو مثال لنص يمكن أن يستبدل في نفس المساحة، لقد تم توليد هذا النص من مولد النص العربى، حيث يمكنك أن تولد مثل هذا النص أو العديد من النصوص الأخرى إضافة إلى زيادة عدد الحروف التى يولدها التطبيق.
异常输出文本:
الأخرى إضافة إلى زیادة عدد الحروف التى یولدھا التطبیق.
حیث یمكنك أن تولد مثل ھذا النص أو العدید من النصوص
في نفس المساحة، لقد تم تولید ھذا النص من مولد النص العربى،
ھذا النص ھو مثال لنص یمكن أن یستبدل
问题原因
原代码将整个多行文本作为单一整体传入Bidi组件处理,Bidi的重排逻辑会反转整个文本块的顺序,包括行的排列顺序,最终导致行从上到下的顺序被倒置。
修复方案
需要逐行处理阿拉伯文本,对每一行单独执行塑形和双向重排,再保留原有的行顺序拼接结果:
private fun shapeArabicText(text: String): String { val arabicShaping = ArabicShaping(ArabicShaping.LETTERS_SHAPE) // 按换行分割文本为单独行,逐行处理后拼接 return text.lines().joinToString("\n") { line -> var shapedLine = arabicShaping.shape(line) val bid = Bidi(shapedLine, Bidi.DIRECTION_RIGHT_TO_LEFT) if (bid.isMixed || bid.isRightToLeft) { bid.reorderingMode = 0 bid.isInverse = true shapedLine = bid.writeReordered(Bidi.DO_MIRRORING.toInt()) } shapedLine } }
修复效果
修复后处理输入文本,输出行顺序将保持从上到下的正确排列,同时每行内部的阿拉伯文仍按右到左的规则正确显示。
内容的提问来源于stack exchange,提问作者gejivi2011
相关产品推荐
相关产品推荐

