使用python-docx混合插入Markdown内容与图片时如何维持顺序?
问题描述
尝试创建混合插入Markdown转换内容与图片的Word文档时,Markdown元素出现在图片之后,不符合预期顺序。当前实现代码如下:
import os import pypandoc from docx import Document doc = Document() def add_md(txt): TMP_FILE = 'tmp.docx' if os.path.exists(TMP_FILE): os.remove(TMP_FILE) pypandoc.convert_text(txt, 'docx', 'md', outputfile=TMP_FILE) tmp_doc = Document(TMP_FILE) os.remove(TMP_FILE) for element in tmp_doc.element.body: doc.element.body.append(element) add_md('### first') add_md('### second') doc.add_picture('./family.jpg') doc.save('sample.docx')
期望顺序:
- first标题
- second标题
- 图片
实际顺序:
- 图片
- first标题
- second标题
希望继续使用doc.add_picture()等python-docx高级函数,同时保持Markdown内容插入方式,寻求两全的解决办法。
解决方案
问题根源在于直接操作doc.element.body.append()会绕过python-docx内部维护的文档结构,导致与add_picture()等API添加的内容顺序错乱。只需修改add_md函数,通过python-docx的官方API复制临时文档的内容到主文档,即可保证顺序一致:
import os import pypandoc from docx import Document doc = Document() def add_md(txt): TMP_FILE = 'tmp.docx' if os.path.exists(TMP_FILE): os.remove(TMP_FILE) # 转换Markdown为临时docx pypandoc.convert_text(txt, 'docx', 'md', outputfile=TMP_FILE) tmp_doc = Document(TMP_FILE) os.remove(TMP_FILE) # 复制临时文档的段落到主文档(保留样式) for para in tmp_doc.paragraphs: new_para = doc.add_paragraph(style=para.style) for run in para.runs: new_run = new_para.add_run(run.text) # 复制文本格式 new_run.bold = run.bold new_run.italic = run.italic new_run.underline = run.underline new_run.font.size = run.font.size new_run.font.name = run.font.name new_run.font.color.rgb = run.font.color.rgb # 如果需要支持表格,添加以下代码 for table in tmp_doc.tables: # 复制表格结构 new_table = doc.add_table(table.rows, table.columns, style=table.style) # 复制表格内容 for i, row in enumerate(table.rows): for j, cell in enumerate(row.cells): new_table.cell(i, j).text = cell.text # 按顺序添加内容 add_md('### first') add_md('### second') doc.add_picture('./family.jpg') doc.save('sample.docx')
原理说明
- 不再直接操作底层XML元素,而是通过python-docx的
add_paragraph()、add_run()等API将临时文档的内容(包括样式和格式)复制到主文档,保证文档内部结构同步。 add_picture()会自动添加到主文档的末尾,与之前通过API添加的Markdown转换内容顺序完全一致。
内容的提问来源于stack exchange,提问作者captnolimar
相关产品推荐
相关产品推荐

