使用PyMuPDF写入临时PDF文件时遭遇Permission denied错误
解决PyMuPDF保存临时PDF时的"Permission denied"错误
问题场景
使用PyMuPDF(fitz)修改PDF后,通过NamedTemporaryFile创建临时文件并保存时,触发"Permission denied"错误,报错提示无法删除临时文件。
错误原因
Windows系统中,NamedTemporaryFile在with块内会保持文件打开状态,而PyMuPDF的doc.save()方法在保存非增量PDF时,会尝试删除已存在的目标文件(即当前临时文件)。由于文件正被NamedTemporaryFile的句柄占用,系统拒绝删除操作,导致权限错误。
解决方案
方案1:退出with块后再保存
让NamedTemporaryFile的with块执行完毕,自动关闭文件句柄,再调用doc.save():
from tempfile import NamedTemporaryFile import fitz doc = fitz.open("test.pdf") temp_pdf_path = None with NamedTemporaryFile(suffix=".pdf", delete=False) as temp_file: temp_pdf_path = temp_file.name # 临时文件已关闭,执行保存 doc.save(temp_pdf_path) doc.close()
方案2:在with块内手动关闭文件句柄
显式关闭临时文件的句柄,释放文件占用:
from tempfile import NamedTemporaryFile import fitz doc = fitz.open("test.pdf") with NamedTemporaryFile(suffix=".pdf", delete=False) as temp_file: temp_pdf_path = temp_file.name temp_file.close() # 手动释放文件句柄 doc.save(temp_pdf_path) doc.close()
方案3:手动生成临时文件名
绕过NamedTemporaryFile的文件创建逻辑,直接生成临时路径,避免文件被提前打开:
import os import tempfile import fitz doc = fitz.open("test.pdf") # 生成唯一临时文件名,不提前创建文件 temp_pdf_path = os.path.join(tempfile.gettempdir(), f"{next(tempfile._get_candidate_names())}.pdf") doc.save(temp_pdf_path) doc.close()
内容的提问来源于stack exchange,提问作者Mazze
相关产品推荐
相关产品推荐

