Python: 书写阿拉伯字符与拉丁数字混合

Python: writing Arabic characters mixed with Latin Digits

我正在构建一个应用程序,它从 xml 文件中获取文本,然后将其显示在 PySide6 QWidgetTable 中,最后将其写入 python-docxtpl(docx 文件)。 在将数据写入 docx 文件之前,一切正常。 QtableWidget 单元格文本是根据需要的。 图片显示原始文本(在xml和QtableWidget中)和docx文件中的输出文本。

图片链接:

QtableWidget图片:

QtableWidget Picture

Docx 图片

Docx Table Picture

代码运行良好

方法读取xml并填充QtableWidget

def fill_teachers_tables(self):
    tree = ET.parse(self.teachers_xml)
    root = tree.getroot()
    teacher = self.teachers_dialog.list_widget.currentItem().text()
    hours = [hour.get('name') for hour in root.xpath('Teacher')[0][0]]
    hours_list = [hour.get('name') for hour in root.xpath(
        f'Teacher[@name="{teacher}"]/Day/Hour')]
    self.teachers_dialog.morning_table.setColumnCount(
        len(self.morning_days))
    self.teachers_dialog.morning_table.setRowCount(len(hours))
    self.teachers_dialog.morning_table.setHorizontalHeaderLabels(
        self.morning_days)
    self.teachers_dialog.morning_table.setVerticalHeaderLabels(hours)
    for i in range(len(self.morning_days)):
        for j in range(len(hours_list)):
            try:
                self.teachers_dialog.morning_table.setItem(
                    j, i, QTableWidgetItem(
                        root.xpath(
                            f'Teacher[@name="{teacher}"]/Day[@name="{self.morning_days[i]}"]/Hour[@name="{hours[j]}"]/Students')[0]
                        .get('name')))
            except IndexError:
                self.teachers_dialog.morning_table.setItem(
                    j, i, QTableWidgetItem(''))

写入docx模板的方法:

def export_single(self):
    teacher = self.teachers_dialog.list_widget.currentItem().text()
    tpl = DocxTemplate('./resources/template.docx')
    context = {
        'teacher': '',
        'days': [],
        'tbl_contents': [],
        'hours': 0,
    }
    context['teacher'] = teacher
    m_row_headers = [self.teachers_dialog.morning_table.verticalHeaderItem(
        i).text() for i in range(self.teachers_dialog.morning_table.rowCount())]
    m_col_headers = [self.teachers_dialog.morning_table.horizontalHeaderItem(i).text(
    ).split(' ')[0] for i in range(self.teachers_dialog.morning_table.columnCount())]
    for i in range(len(m_row_headers)):
        context['tbl_contents'].append({'hour': '', 'sets': []})
        for j in range(len(m_col_headers)):
            item = self.teachers_dialog.morning_table.item(i, j)
            if item:
                context['hours'] += 1
                context['tbl_contents'][i]['hour'] = f'{m_row_headers[i]}'
                context['tbl_contents'][i]['sets'].append(item.text())
            else:
                context['tbl_contents'][i]['hour'] = f'{m_row_headers[i]}'
                context['tbl_contents'][i]['sets'].append('')
    tpl.render(context)
    tpl.save('result.docx')

PS: 无法嵌入图片

我尝试同时使用 python-bidi 和 arabic-reshaper 但没有用。

我认为问题出在句点 (.) 和连字符 (-) 我遇到所有阿拉伯文文本都以句点 (.) 结尾,句点转到文本的开头。

我发现了问题。

问题出在 docxtpl 上。

您需要在模板文件中从右到左编辑所有段落字体样式。

也是:

    tpl = DocxTemplate('./resources/template.docx')
    for p in tpl.docx.paragraphs:
        p.style.font.rtl = True

    for table in tpl.docx.tables:
        for i in range(len(table.columns)):
            for j in range(len(table.rows)):
                for p in table.cell(j, i).paragraphs:
                    p.style.font.rtl = True

     # Then fill your context and render it to the template