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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:21