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
相关产品推荐
相关产品推荐

