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

使用PyMuPDF/Fitz插入图片报错:object is not a stream

解决PyMuPDF插入图片时“object is not a stream”错误的方法

我之前也碰到过类似的问题,给你几个实用的排查和解决方向:

1. 检查并修复目标PDF文件结构

有时候原PDF文件可能存在损坏或者异常的页面对象结构,尤其是你操作的第2页(doc[1])。可以先尝试重新保存PDF来修复潜在的结构问题:

import fitz
doc = fitz.open("NewPDF.pdf")
doc.save("temp_fixed.pdf")  # 重新保存生成修复后的文件
doc.close()

# 用修复后的文件重新尝试插入图片
doc = fitz.open("temp_fixed.pdf")
page = doc[1]
rect = fitz.Rect(0,0,880,1080)
page.insert_image(rect, filename="Image01.jpg")
doc.save("final.pdf")
doc.close()

2. 验证图片文件有效性

确保Image01.jpg是完整且有效的JPG文件——可以用系统自带的图片浏览器打开确认,或者换一张已知正常的图片进行测试,排除图片损坏导致的流读取问题。

3. 升级Python和PyMuPDF版本

你当前使用的Python2.7已经停止维护,旧版本的PyMuPDF对其支持可能存在遗留bug。建议升级到Python3.x版本,然后安装最新版的PyMuPDF(现在包名为pymupdf):

pip install pymupdf  # Python3环境下执行

新版本的库修复了大量旧版本的兼容性和功能问题,大概率能解决这类流相关的错误。

4. 改用字节流方式插入图片

如果直接使用filename参数报错,可以尝试先将图片读取为字节流,再通过stream参数插入:

import fitz
doc = fitz.open("NewPDF.pdf")
page = doc[1]
rect = fitz.Rect(0,0,880,1080)

# 读取图片为字节流
with open("Image01.jpg", "rb") as img_file:
    img_stream = img_file.read()

page.insert_image(rect, stream=img_stream)
doc.save("NewPDF_with_image.pdf")
doc.close()

5. 检查PDF编辑权限

部分PDF可能被加密或设置了编辑限制,你可以先检查页面是否可写:

import fitz
doc = fitz.open("NewPDF.pdf")
page = doc[1]
print(page.is_writable)  # 输出True表示可编辑,False则需要解密

如果页面不可写,若PDF有密码,打开时需传入密码:doc = fitz.open("NewPDF.pdf", password="your_pdf_password");若没有密码但有编辑限制,可尝试用doc.save("unlocked.pdf", garbage=4)来移除限制(操作需符合版权要求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:25:09