栏目导航
精选推荐

hp‑scan 扫描 2GB 以上文件静默失败 MAX_READSIZE 行字节限制解决

科技观察者
hp‑scan 扫描 2GB 以上文件静默失败 MAX_READSIZE 行字节限制解决

故障现象

使用HPLIP自带hp‑scan命令行扫描工具,设备为网络扫描仪HP Officejet Pro 8600,采用4800dpi彩色无压缩PNG输出。
当预估原始扫描数据大小接近或超过2GB时,扫描出现异常:

  1. 扫描仪硬件开始工作,随后提示扫描已取消
  2. 终端日志提示:错误: 未读取到数据。扫描线程退出时没有给出任何原因。
  3. 日志打印预估读取字节约3.1GB;
  4. 用户最初怀疑是int32整数带来2.14GB硬性文件上限。

复现命令:

hp‑scan --mode=color --compression=none --output=/home/user/hpscan001.png --resolution=4800 -g --size=a5 --device=hpaio:/net/Officejet_Pro_8600?ip=PRINTER_IP

结论:hp‑scan不存在全局硬性 2GB 总文件大小限制。 真实限制来自源码常量 MAX_READSIZE = 65536,为单行扫描行最大读取字节数限制,并非整体文件大小限制。 当高 DPI 下单行图像字节超过 65536 字节,就会触发读取异常,扫描直接中断取消,与总文件是否大于 2GB 只是表象巧合。

源码位置:scan/scanext/scanext.cscan/sane.py,常量 MAX_READSIZE 固定为 65536。 4800dpi 彩色模式,扫描宽度超过约 115 毫米,单行字节就会突破该阈值,扫描失败。 测试验证:同样总大小 3GB,但扫描宽度更窄的图像,扫描任务可以完整成功。

日志关键片段解读

警告: 从扫描仪读取的近似字节数: 3.1 GB
hp‑scan[395980]: 调试: expected_bytes = 3329310720
读取数据: [ ] 0%
错误: 未读取到数据。
关闭设备。
扫描线程退出时没有给出任何原因。

  • 预估总 3.1GB 只是结果现象;
  • 真正触发失败是单行扫描字节超出 MAX_READSIZE (65536),扫描线程直接异常退出;
  • 不是磁盘空间不足,不是文件系统 2GB 上限。

可行规避方案(不拼接多张图像前提下)

方案 1:降低扫描分辨率(最推荐,无需修改源码)

减小 DPI,降低单行原始字节,使之低于 65536 字节阈值。 例如 4800dpi 改为 2400dpi 或 1200dpi,兼顾画质同时规避单行读取限制。

hp‑scan --mode=color --compression=none --output=out.png --resolution=2400 --size=a5 --device=hpaio:/net/Officejet_Pro_8600?ip=PRINTER_IP

方案 2:缩小扫描实际宽度,使用‑‑box 限定扫描区域

使用--box参数限定扫描的实际宽度,把扫描宽度控制在 115mm 以内,即使 4800dpi 也可以扫描成功。

示例(参考成功复现案例)

hp‑scan --mode=color --compression=none --output=/home/unc/hpscan001.png --resolution=4800 -g --box=0,0,105,300 --device=hpaio:/net/Officejet_Pro_8600?ip=PRINTER_IP

方案 3:更换其他扫描前端,绕开 hp‑scan 的 MAX_READSIZE 限制

MAX_READSIZE属于 hp‑scan 工具自身限制,不是 SANE/hpaio 底层驱动限制。 改用其他调用 SANE 的扫描程序,不受该常量约束:

  1. simple‑scan图形扫描工具;
  2. xsane
  3. NAPS2(注意 NAPS2 Windows 版本同样存在 2GB 文件限制,Linux 版不受 hp‑scan 约束)。

注意:修改源码重新编译 HPLIP 可以调大 MAX_READSIZE,但升级 HPLIP 包会覆盖修改,普通用户不建议源码编译修改。

误区澄清

  1. ❌误区:hp‑scan 存在 int32 带来的 2GB 总文件硬性上限 ✅事实:总文件大小本身没有硬限制;失败是单行读取缓冲区 MAX_READSIZE=65536 限制;窄幅大高度的图像,总大小 3GB 也可以扫描成功。
  2. ❌误区:这是 SANE/hpaio 底层驱动限制 ✅事实:限制在 hp‑scan 上层工具代码,底层 hpaio 驱动没有此单行字节上限。
  3. ❌误区:更换更大硬盘、增加内存可以解决 ✅事实:磁盘、内存充足,只要单行字节超限依然扫描失败。

快速总结

  1. hp‑scan 扫描报错 “扫描已取消、未读取到数据”,表象看似 2GB 限制,根源是源码MAX_READSIZE=65536单行读取字节上限;
  2. 高 DPI + 较宽扫描区域最容易触发该 bug;
  3. 优先做法:降低分辨率,或者用--box参数缩小扫描宽度;
  4. 不想降低分辨率,直接换 simple‑scan / XSane 等其他 SANE 扫描前端,绕开 hp‑scan 工具限制;
  5. 不建议普通用户修改源码编译 HPLIP。