如何使用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
相关产品推荐
相关产品推荐

