我目前正在使用 pdfmake 生成 PDF,需要包含阿拉伯文本,这需要正确处理 RTL(从右到左)格式。但是,我遇到了文本显示的问题。
当我使用 pdfmake 生成 PDF 时,文本显示为:
通过我的研究,我发现了一个代码片段,通过颠倒词序部分解决了这个问题:
.split(' ').reverse().join(' ')
这在某种程度上有效,但在文本包含数字、括号或文本很长且跨多行的情况下会失败。在这种情况下,文本会变得混乱,从最后一行到第一行。
使用 .split(' ').reverse().join(' ') 反转单词,这部分有效,但引入了数字和多行文本的新问题。
我希望在 PDF 中正确显示阿拉伯文本,保留正确的 RTL 格式,包括正确处理数字、标点符号和多行文本。
我有同样的问题,尝试用这些自定义构建的函数来解决它,部分解决了小文本的问题,但当我在阿拉伯文本中包含括号、数字、英文字母时,它仍然存在相同的问题
function replacePositionForTableViewArabicWords(text, n) {
if (!text) return '';
// Split text into words while preserving punctuation
const words = text.match(/\S+/g) || [];
// Handle special characters
const specialChars = {
'(': ')',
')': '(',
'/': '/',
':': ':'
};
let output = '';
let line = '';
for (let i = words.length - 1; i >= 0; i--) {
const word = words[i];
const withSpecialChars = specialChars[word] ? specialChars[word] : word;
const isArabic = isArabicText(word);
if (isArabic) {
line = withSpecialChars + ' ' + line;
} else {
line = line + ' ' + withSpecialChars;
}
if (line.trim().split(' ').length >= n) {
output = line.trim() + '\n' + output;
line = '';
}
}
output = line.trim() + ' ' + output;
return output.trim();
}
function isArabicText(text) {
var arabic = /[\u0600-\u06FF]/;
return arabic.test(text);
}
export function replacePositionForTableViewArabicWordsWithParams(text, n, style) {
let reversedText = replacePositionForTableViewArabicWords(reverseString(text), n);
return {
text: reversedText,
style: style,
alignment: 'right',
direction: "rtl",
rtl: true
};
}
如果有人有答案请提供给我们