使用pdfminer/pdfminer.six提取PDF指定页面文本报错,求正确方法
问题描述
尝试使用pdfminer.six提取PDF指定页面文本时,出现以下错误:
AttributeError: 'generator' object has no attribute 'seek'
错误来自代码行:parser = PDFParser(page_selected)
当前代码如下:
from io import StringIO from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.pdfparser import PDFParser import pdfminer.high_level as hl working_folder = "C:\\temp\\" output_string = StringIO() with open(working_folder + 'AU.pdf', 'rb') as in_file: page_selected = hl.extract_pages(in_file, page_numbers=[1]) # second page parser = PDFParser(page_selected) # error line doc = PDFDocument(parser) rsrcmgr = PDFResourceManager() device = TextConverter(rsrcmgr, output_string, laparams=LAParams()) interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.create_pages(doc): interpreter.process_page(page) print(output_string.getvalue())
错误原因
hl.extract_pages()返回的是生成器对象,而PDFParser需要传入的是支持seek等文件操作的字节流/文件对象,直接把生成器传给PDFParser就会触发上述错误。
正确解决方法
方法一:使用high_level模块的extract_text直接指定页码
这是最简便的方式,high_level模块已封装好文本提取逻辑,直接指定page_numbers参数即可:
import pdfminer.high_level as hl working_folder = "C:\\temp\\" # 提取第2页(page_numbers从0开始计数) text = hl.extract_text(working_folder + 'AU.pdf', page_numbers=[1]) print(text)
方法二:使用底层API处理指定页面
如果需要自定义处理逻辑(比如自定义布局参数),可以用底层API直接筛选指定页码的页面:
from io import StringIO from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage working_folder = "C:\\temp\\" output_string = StringIO() rsrcmgr = PDFResourceManager() device = TextConverter(rsrcmgr, output_string, laparams=LAParams()) interpreter = PDFPageInterpreter(rsrcmgr, device) with open(working_folder + 'AU.pdf', 'rb') as in_file: # 遍历页面,只处理指定页码(page_numbers从0开始) for page in PDFPage.get_pages(in_file, page_numbers=[1]): interpreter.process_page(page) print(output_string.getvalue()) device.close() output_string.close()
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

