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

Django中传入InMemoryUploadedFile给XPdf报路径类型错误如何解决

报错原因

XPdf仅支持传入本地文件系统路径作为入参,而Django通过request.FILES['pdf']获取的InMemoryUploadedFile是内存级的文件对象,没有对应磁盘路径,因此无法直接传入调用。

可行解决方案

方案1:写入临时文件(全场景兼容,推荐)

利用Python内置tempfile模块生成临时磁盘文件,用完自动清理无残留,适配所有大小的上传文件:

from pdftextract import XPdf
import tempfile
import os

input_pdf = request.FILES['pdf']
temp_pdf_path = None

try:
    # 创建后缀为pdf的临时文件,delete=False保证文件关闭后不会被立即删除
    with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as f:
        # 迭代写入上传文件内容,避免大文件占用过多内存
        for chunk in input_pdf.chunks():
            f.write(chunk)
        temp_pdf_path = f.name
    
    # 调用pdftextract提取文本
    pdf = XPdf(temp_pdf_path)
    txt = pdf.to_text()
    # 此处可添加txt后续处理逻辑
    print(txt)
finally:
    # 提取完成后删除临时文件,避免磁盘冗余
    if temp_pdf_path and os.path.exists(temp_pdf_path):
        os.unlink(temp_pdf_path)

方案2:直接取用大文件临时路径(仅适配大文件场景)

Django默认上传文件大小超过2.5M时,会自动将文件写入系统临时目录,此时文件对象会自带temporary_file_path属性可直接调用:

input_pdf = request.FILES['pdf']
if hasattr(input_pdf, 'temporary_file_path'):
    # 大文件直接取临时路径调用
    pdf = XPdf(input_pdf.temporary_file_path())
    txt = pdf.to_text()
else:
    # 小于阈值的内存文件仍需走方案1的临时写入逻辑
    pass

该方案仅对超过大小阈值的大文件有效,兼容性不如方案1。

内容的提问来源于stack exchange,提问作者user5626375

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:06:03