使用python从MS word docx文件中逐页提取文本

Alf*_*isy 5 python document text-extraction extract python-3.x

我有一个 MS docx 文件,我需要从中逐页提取文本。我尝试过使用 python-docx 但它可以提取整个文本,但不能按页提取。我还将 docx 转换为 pdf,然后尝试文本提取。问题是,转换后 docx 的页面结构发生了变化。例如,在转换时,字体大小发生了变化,docx中一页的文本内容占用了pdf中一页以上的内容。

我正在寻找一个稳定的解决方案,可以从 docx 中提取分页文本(不转换为 pdf 对我的整个解决方案来说会更好)。有人可以帮我解决这个问题吗?

Ger*_*erd 6

在我看来,docx 格式(因此也是 python docx 库)仅支持段落和部分。

\n\n
\n

Microsoft Word 不支持硬页的概念。相反,当导出的文档在 Word 中打开时,Word 会根据页面大小再次重新分页。(来源

\n
\n\n

所以实际上分页并不是存储在docx文件中,而是由渲染引擎执行:

\n\n
\n

DOCX 文件不包含有关分页的信息。除非您计算每行需要多少空间才能确定页数,否则\xe2\x80\x99 无法找到文档中的\n 页数。(来源

\n
\n\n

此页面有更多背景信息,如果必须保留分页,建议使用 PDF。

\n


Alf*_*isy 0

我发现Tika库在读取文件时有一个xmlContent解析。我用它来捕获xml格式并使用正则表达式来捕获它。下面写下对我有用的 python 代码。

raw_xml = parser.from_file(file, xmlContent=True)
body = raw_xml['content'].split('<body>')[1].split('</body>')[0]
body_without_tag = body.replace("<p>", "").replace("</p>", "").replace("<div>", "").replace("</div>","").replace("<p />","")
text_pages = body_without_tag.split("""<div class="page">""")[1:]
num_pages = len(text_pages)
if num_pages==int(raw_xml['metadata']['xmpTPg:NPages']) : #check if it worked correctly
     return text_pages
Run Code Online (Sandbox Code Playgroud)