合并两个docx文件时出现问题
我正在尝试创建一个组合的docx文件,这个文件是两个docx文件的拼接。我有以下的Python代码:
from docx import Document
files = ['Doc2.docx', 'Doc3.docx']
def combine_word_documents(files):
combined_document = Document('empty.docx')
count, number_of_files = 0, len(files)
for file in files:
sub_doc = Document(file)
# Don't add a page break if you've
# reached the last file.
if count < number_of_files - 1:
sub_doc.add_page_break()
for element in sub_doc._document_part.body._element:
combined_document._document_part.body._element.append(element)
count += 1
combined_document.save('both_docx_files.docx')
combine_word_documents(files)
遇到的问题是:
- 生成的both_docx_files.docx文件中,两个docx文件重叠在一起,而不是分开在不同的页面上。
- 图片丢失了
任何帮助或建议都非常感谢。
我试过给出的Python代码。docx文件应该在新的docx文件中一个接一个地拼接在一起。
2 个回答
第一个问题跟分页有关;在之前的回复中已经提到过,这个问题在考虑第二个问题时就没那么重要了。
图片并不是直接存储在文档的XML内容里,而是单独存放在文档的媒体文件夹中,并在XML中进行引用。简单地添加XML元素并不会正确复制图片或它们的引用,这样在合并后的文档中就会缺少这些图片。
关于图片的处理比较复杂,因为你需要从源文档中提取图片,并在合并后的文档中放到正确的位置。要正确处理图片,你需要手动把源文档媒体文件夹里的图片文件复制到合并文档的媒体文件夹中,并修正文档XML中的引用。python-docx并没有提供直接的方法来做到这一点。这个过程可能需要直接操作底层的opc包部分,这样会比较技术性。
想要更好地理解,可以查看这个链接: 使用python-docx搜索和替换后丢失格式和图片
处理图片的可能解决方法: https://github.com/etfre/oodocx,可以看看这个库,可能对你有帮助。
from oodocx import Docx
doc1 = Docx('path_to_first_document.docx')
doc2 = Docx('path_to_second_document.docx')
doc1.merge(doc2, page_break=True)
doc1.save('path_to_concatenated_document.docx')
一个快速的解决办法是把文档转换成PDF格式,合并这些PDF,然后如果绝对必要的话,再转换回DOCX格式。现在有很多库和工具可以处理PDF,这样的任务可能会更简单一些。
你在第一个文件的开头添加了分页符,而不是在结尾:
if count < number_of_files - 1:
sub_doc.add_page_break()
for element in sub_doc._document_part.body._element:
combined_document._document_part.body._element.append(element)
count += 1
把测试和分页符移动到for
循环之后,像这样:
for element in sub_doc._document_part.body._element:
combined_document._document_part.body._element.append(element)
if count < number_of_files - 1:
sub_doc.add_page_break()
count += 1
关于第二个问题,你需要提供更多信息,因为目前不太清楚你的意思。
[编辑]
我安装了python-docx模块,并尝试重现你的问题。看起来这个包无法从一个文档复制图片到另一个文档,而且根据我从文档中了解到的,似乎没有明显的方法来识别一个元素是否是图片。
另外,当我使用提供的代码时,在包含_document_part.body
的那几行出现了异常。我通过把它替换成简单的_body
来修复了这个问题。所以也许我下载的版本(v1.1.0)和你使用的版本不同。
[/编辑]