python-docx:遍历段落,表格和图像,同时保持顺序

时间:2018-10-16 14:57:19

标签: python docx

这是我第一次在这里发帖,我想编写一个以docx作为输入并选择某些段落(包括表格和图像)以相同顺序复制到另一个模板文档(而不是末尾)的脚本。我遇到的问题是,当我开始遍历元素时,我的代码无法检测图像,因此,我无法确定图像相对于文本和表格的位置,也不是图像。 简而言之,我得到了doc1: 文本 图片 文本 表 文字

最后我得到的是: 文本 [图像丢失] 文本 表 文字

到目前为止,我得到的是:

-我可以遍历各段和表格:

def iter_block_items(parent):
"""
Generate a reference to each paragraph and table child within *parent*,
in document order. Each returned value is an instance of either Table or
Paragraph. *parent* would most commonly be a reference to a main
Document object, but also works for a _Cell object, which itself can
contain paragraphs and tables.
"""
if isinstance(parent, _Document):
    parent_elm = parent.element.body
    # print(parent_elm.xml)
elif isinstance(parent, _Cell):
    parent_elm = parent._tc
else:
    raise ValueError("something's not right")

for child in parent_elm.iterchildren():
    if isinstance(child, CT_P):
        yield Paragraph(child, parent)
    elif isinstance(child, CT_Tbl):
        yield Table(child, parent)

我可以获得文档图像的有序列表:

pictures = []
for pic in dwo.inline_shapes:
    if pic.type == WD_INLINE_SHAPE.PICTURE:
        pictures.append(pic)

我可以在段落的末尾插入特定的图像:

def insert_picture(index, paragraph):
    inline = pictures[index]._inline
    rId = inline.xpath('./a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/@r:embed')[0]
    image_part = dwo.part.related_parts[rId]
    image_bytes = image_part.blob
    image_stream = BytesIO(image_bytes)
    paragraph.add_run().add_picture(image_stream, Inches(6.5))
    return

我像这样使用函数iter_block_items():

start_copy = False
for block in iter_block_items(document):
    if isinstance(block, Paragraph):
        if block.text == "TEXT FROM WHERE WE STOP COPYING":
            break

    if start_copy:
        if isinstance(block, Paragraph):
            last_paragraph = insert_paragraph_after(last_paragraph,block.text)

        elif isinstance(block, Table):
            paragraphs_with_table.append(last_paragraph)
            tables_to_apppend.append(block._tbl)

    if isinstance(block, Paragraph):
        if block.text == ""TEXT FROM WHERE WE START COPYING":
            start_copy = True

2 个答案:

答案 0 :(得分:0)

我找到了一种方法,原来我想要排序的图像已经作为inline.shape存在于段落中。我使用了以下方法:link提取图像,然后使用

的修改版本插入它们
def insert_picture(index, paragraph): 

我将使用rId代替索引。

答案 1 :(得分:0)

您可以在以下链接中找到与之完全相同的有效实现方式:

Extracting paras, tables and images in document order