Django 1.10.4中提取InMemoryUploadedFile类型PDF内容异常问题
解决Django上传PDF后读取内容乱码的问题
嗨,我来帮你搞定这个PDF读取的麻烦~
首先得搞清楚为什么会出现乱码:PDF本身是二进制格式的文件,不是纯文本文件,你直接用file_uploaded.file.read().decode('utf-8')去解析它的二进制内容,肯定会得到类似十六进制的乱码数据——毕竟UTF-8是用来解码文本的,对二进制文件完全不适用。
下面分两种情况给你解决方案:
一、只是想保存上传的PDF文件
如果你的需求只是把用户上传的PDF存到服务器,直接用Django自带的文件操作就行,比如:
if request.FILES: file_uploaded = request.FILES["file"] # 方式1:手动写入文件(分块处理大文件更高效) with open(f'/your/save/path/{file_uploaded.name}', 'wb') as f: for chunk in file_uploaded.chunks(): f.write(chunk) # 方式2:用Django的FileSystemStorage(更符合Django规范) from django.core.files.storage import FileSystemStorage fs = FileSystemStorage(location='/your/save/path') saved_filename = fs.save(file_uploaded.name, file_uploaded)
二、需要提取PDF里的文本内容
这时候得用专门的PDF解析库,推荐两个常用的:
1. 使用PyPDF2
先安装库:
pip install PyPDF2
然后在Django视图里这样写:
import PyPDF2 if request.FILES: file_uploaded = request.FILES["file"] # 直接把InMemoryUploadedFile传给PdfFileReader pdf_reader = PyPDF2.PdfFileReader(file_uploaded) extracted_text = "" # 遍历每一页提取文本 for page_num in range(pdf_reader.numPages): page = pdf_reader.getPage(page_num) extracted_text += page.extractText() print(extracted_text) # 这里就是PDF里的文本内容了
2. 使用pdfplumber(提取效果更精准)
如果PyPDF2对某些复杂PDF提取效果不好,可以试试pdfplumber:
先安装:
pip install pdfplumber
代码示例:
import pdfplumber if request.FILES: file_uploaded = request.FILES["file"] with pdfplumber.open(file_uploaded) as pdf: extracted_text = "" for page in pdf.pages: extracted_text += page.extract_text() print(extracted_text)
最后再提醒一句:永远不要直接对PDF的二进制内容做decode('utf-8')操作,它的二进制里包含了PDF的结构、字体、图片等各种非文本信息,必须用专门的解析工具才能拿到可读的文本哦~
内容的提问来源于stack exchange,提问作者Rudra
相关产品推荐
相关产品推荐

