Python提取PDF文本遇空白页报错求助(PyPDF2/PDFMiner.six)
PDF转文本程序问题解决
问题背景
使用Python 3开发PDF转文本工具,测试PyPDF2和PDFMiner.six两个库时,处理含空白页的PDF文件出现报错,以下是相关代码及错误信息:
PyPDF2 代码
import PyPDF2 def extract_txt_pdf(pdf_file:str) ->[str]: # open the file and read it as bit with open(pdf_file, 'rb') as pdf: reader = PyPDF2.PdfReader(pdf,strict = False) pdf_text= [] for page in reader.pages: content = page.extract_text() pdf_text.append(content) return pdf_text
PDFMiner.six 代码
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage from io import StringIO def convert_pdf_to_txt(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = open(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos=set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): interpreter.process_page(page) text = retstr.getvalue() fp.close() device.close() retstr.close() return text
PDFMiner.six 报错信息
print(t) File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2032.0_x64__qbz5n2kfra8p0\Lib\encodings\cp1252.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_table)[0] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnicodeEncodeError: 'charmap' codec can't encode character '\u25b6' in position 0: character maps to <undefined>
解决方案
1. 修复PyPDF2代码问题
原代码中for page in reader.pages循环在with语句块外部,导致文件已关闭后再读取页面内容,容易触发错误(尤其是空白页场景)。需将循环移入with块内:
import PyPDF2 def extract_txt_pdf(pdf_file: str) -> list[str]: # 打开文件并读取 with open(pdf_file, 'rb') as pdf: reader = PyPDF2.PdfReader(pdf, strict=False) pdf_text = [] # 将循环移入with块内,确保文件句柄有效 for page in reader.pages: content = page.extract_text() # 空白页会返回None,可选择过滤或保留为空字符串 pdf_text.append(content if content else "") return pdf_text
2. 解决PDFMiner.six的编码错误及代码缩进问题
- 缩进错误修复:原代码中
fp.close()、device.close()等语句在函数外部,会导致未定义变量错误,需将这些语句移入convert_pdf_to_txt函数内部。 - 编码错误解决:报错是因为Windows控制台默认编码为cp1252,无法识别
\u25b6(黑色右箭头)这类Unicode字符,有两种解决方式:
方式一:打印时指定UTF-8编码
# 调用函数后打印文本时 text = convert_pdf_to_txt("your_pdf_file.pdf") print(text, encoding='utf-8')
方式二:将文本写入UTF-8编码的文件
# 修改convert_pdf_to_txt函数,直接写入文件(或调用后写入) def convert_pdf_to_txt(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = open(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) password = "" maxpages = 0 caching = True pagenos=set() for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True): interpreter.process_page(page) text = retstr.getvalue() # 关闭资源的语句移入函数内 fp.close() device.close() retstr.close() # 将文本写入UTF-8编码的文件 with open('output.txt', 'w', encoding='utf-8') as f: f.write(text) return text
内容的提问来源于stack exchange,提问作者Sana'a Al-ahdal
相关产品推荐
相关产品推荐

