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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:27:43