You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python的Tika库逐页读取PDF/DOCX文件?

用Tika逐页读取PDF/DOCX文件的方案

我使用以下代码可以读取完整文件内容,但无法实现逐页读取:

#!/usr/bin/env python
import tika
tika.initVM()
from tika import parser

parsed = parser.from_file('frank_diary.docx')
print(parsed["metadata"])
print(parsed["content"])

需要实现逐页读取PDF/DOCX文件,期望输出格式如下:

page_content_list = [
    {"page_number": 1, "content": "第一页内容"},
    {"page_number": 2, "content": "第二页内容"},
    {"page_number": 3, "content": "第三页内容"}
]

以下是针对两种文件类型的可行解决方案:

PDF文件逐页读取

通过让Tika返回XML格式内容,解析其中的分页元素来提取每页内容:

#!/usr/bin/env python
import tika
from tika import parser
import xml.etree.ElementTree as ET

tika.initVM()

# 解析PDF并获取XML格式内容
parsed = parser.from_file('test.pdf', xmlContent=True)
xml_content = parsed['content']

# 解析XML结构
root = ET.fromstring(xml_content)
namespaces = {'xhtml': 'http://www.w3.org/1999/xhtml'}

page_content_list = []
# 遍历所有标记为page的div元素
for idx, page in enumerate(root.findall('.//xhtml:div[@class="page"]'), start=1):
    # 提取页面内所有文本内容
    page_text = ' '.join([elem.text or '' for elem in page.iter()]).strip()
    page_content_list.append({
        "page_number": idx,
        "content": page_text
    })

print(page_content_list)

DOCX文件分页内容提取

DOCX的分页依赖文档中的手动分页标记,同样通过XML解析提取:

#!/usr/bin/env python
import tika
from tika import parser
import xml.etree.ElementTree as ET

tika.initVM()

# 解析DOCX并获取XML格式内容
parsed = parser.from_file('frank_diary.docx', xmlContent=True)
xml_content = parsed['content']

root = ET.fromstring(xml_content)
namespaces = {'xhtml': 'http://www.w3.org/1999/xhtml'}

page_content_list = []
current_page_content = []
page_num = 1

# 遍历节点,识别分页标记并分割内容
for elem in root.iter():
    # 匹配分页符标签
    if elem.tag == f'{{{namespaces["xhtml"]}}}br' and elem.attrib.get('class') == 'pagebreak':
        page_text = ' '.join(current_page_content).strip()
        if page_text:
            page_content_list.append({
                "page_number": page_num,
                "content": page_text
            })
            page_num += 1
            current_page_content = []
    elif elem.text:
        current_page_content.append(elem.text.strip())

# 处理最后一页剩余内容
if current_page_content:
    page_text = ' '.join(current_page_content).strip()
    page_content_list.append({
        "page_number": page_num,
        "content": page_text
    })

print(page_content_list)

注意事项

  • 确保使用最新版本的Tika-python,旧版本可能不支持XML输出中的分页标记。
  • DOCX的自动分页(未插入手动分页符的情况)无法通过此方法提取,因为这类分页是渲染时的动态行为,文档本身没有对应的标记。

内容的提问来源于stack exchange,提问作者dilip kukadiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:50:43