PyPDF2提取含非拉丁字符PDF文本时UnicodeEncodeError问题求助
解决PDF提取非拉丁字符时的UnicodeEncodeError问题
问题根源
你代码里的错误出在这行:
stxt = utxt.encode('latin-1', 'ignore')
latin-1编码只能处理ASCII范围内的字符,遇到俄文(比如\u0445是俄文字母х)、中文这类非拉丁字符时,自然会触发编码失败的错误。而且这行代码完全多余——你最终是要写入utf-8编码的TXT文件,直接操作Unicode字符串即可,不需要转成latin-1编码的字节。
另外原代码还有两个小问题:
- 只提取了每个PDF的第一页,没处理所有页面
- 写入文件的逻辑在循环外,最终只能保存最后一个PDF第一页的内容
修改后的完整代码
import glob import PyPDF2 # 获取目录下所有PDF文件 pdfs = glob.glob("/private/Documents/*.pdf") # 以追加模式打开TXT文件,确保所有PDF内容都能写入 with open('quotes.txt', 'a', encoding='utf-8') as f: for pdf in pdfs: with open(pdf, 'rb') as pdfFileObj: pdfReader = PyPDF2.PdfFileReader(pdfFileObj, strict=False) print(f"处理文件: {pdf},总页数: {pdfReader.numPages}") # 遍历当前PDF的所有页面 for page_num in range(pdfReader.numPages): pageObj = pdfReader.getPage(page_num) text = pageObj.extractText() # 直接写入utf-8文件,无需额外编码操作 if text: # 跳过空页面 f.write(text + '\n--- 分割线(PDF页面分隔)---\n') print(f"{pdf} 处理完成")
关键修改点
- 移除了多余的
latin-1编码转换步骤,直接使用PyPDF2提取的Unicode字符串写入utf-8文件 - 将TXT文件的打开操作放到循环外,用
a(追加)模式,避免重复打开文件 - 遍历每个PDF的所有页面,而不是只提取第一页
- 添加了页面分割线,方便区分不同PDF、不同页面的内容
- 跳过空页面,避免写入无效内容
内容的提问来源于stack exchange,提问作者Babiqowski
相关产品推荐
相关产品推荐

