使用fitz.open()读取Zip压缩包内PDF文件失败的技术咨询
问题分析与解决建议
问题根源
你遇到的报错核心原因是:zipObj.namelist()返回的是压缩包内部的文件路径,这些文件并没有被解压到本地磁盘。不管用压缩包内的相对路径,还是拼接下载文件夹的绝对路径,系统都找不到对应的文件——因为文件只存在于Zip包的内存流中,没有实际写入本地文件系统。
解决方法
不需要将PDF文件解压到本地,直接从Zip包中读取文件的字节流,再用fitz加载这个字节流即可。具体步骤:
- 找到目标PDF在Zip包内的路径后,通过
zipObj.open()获取压缩包内的文件对象 - 读取该文件对象的字节内容
- 用
fitz.open("pdf", 字节内容)直接从内存加载PDF
修正后的代码
import zipfile as ZipFile import fitz import os # 原代码用到了os.path.join,需要导入 def getjobcode(self, filename): jobcode = None if '.zip' in filename: with ZipFile(filename, 'r') as zipObj: for document in zipObj.namelist(): if 'plans' in document.lower(): # 从压缩包中读取PDF的字节流 with zipObj.open(document) as pdf_file: pdf_bytes = pdf_file.read() # 直接从字节流加载PDF doc = fitz.open("pdf", pdf_bytes) page1 = doc.load_page(0) page1text = page1.get_text('text') # 增加异常处理,避免找不到"PROJECT NUMBER"时崩溃 if 'PROJECT NUMBER' in page1text: start_idx = page1text.index('PROJECT NUMBER') jobcode = page1text[start_idx:start_idx + 30][-12:] # 找到第一个符合条件的PDF就退出循环,按需调整 break return jobcode
额外说明
- 代码中增加了
jobcode的初始值和异常处理,避免因找不到目标文本导致程序崩溃 - 如果Zip包内有多个含"plans"的PDF,当前代码会处理第一个,若需要处理全部可去掉
break
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

