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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:21:01