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

手动生成PDF时添加二进制格式3×3黑白图像的技术求助

手动生成PDF时添加1位黑白图像的问题

我现在在手动编写PDF代码,基础操作没问题,但就是无法成功添加图像。我尝试用9位二进制串111000111表示3×3的黑白图像(中间一行为黑色),虽然这种方式无压缩、仅适用于简单图像,但我只想先实现内容显示。下面是参考建议修改后的新PDF代码,以及最初的旧代码,恳请帮忙找出问题并讲解相关知识。


修改后的新PDF代码

%PDF-1.7

1 0 obj
  << 

     /Pages 2 0 R
     /Type /Catalog  >>
endobj

2 0 obj
  << 

     /Type /Pages
     /Count 1
     /Kids [3 0 R]  >>
endobj

3 0 obj
  << 

    /Type /Page
    /Parent 2 0 R  
    /Contents [4 0 R]
    /MediaBox [500 500]

    /Resources 
    <<
      /XObject 
      <<
        /Im1 5 0 R
      >>
    >>
  >>
endobj


4 0 obj 
  <<

  >>
    stream
      q
        1 0 0 1 100 100 cm
        /Im1 Do
      Q
    endstream
endobj


5 0 obj 
  <<
    /Type /XObject
    /Subtype /Image
    /Height 3
    /Width 3
    /BitsPerComponent 1
    /Length 9
    /ColorSpace /DeviceGray
  >>
    stream111000111endstream
endobj


trailer
  << /Root 1 0 R
   /Size 7
  >>
%%EOF

最初的旧PDF代码

%PDF-1.7

1 0 obj
  << 

     /Pages 2 0 R
     /Type /Catalog  >>
endobj

2 0 obj
  << 

     /Type /Pages
     /Count 1
     /Kids [3 0 R]  >>
endobj

3 0 obj
  << 

    /Type /Page
    /Parent 2 0 R  
    /Contents [4 0 R]

    /Resources 
    <<
      /ProcSet [/PDF /ImageB]    
      /XObject 
      <<
        /Im1 5 0 R
      >>
    >>
  >>
endobj


4 0 obj 
  <<

  >>
    stream
      q
        1 0 0 1 0 0 cm
        /Im1 DO
      Q
    endstream
endobj


5 0 obj 
  <<
    /Type /XObject
    /Subtype /Image
    /Height 3
    /Width 3
    /BitsPerComponent 1
    /Length 9
    /ColorSpace /DeviceGray
  >>
    stream111000111endstream
endobj


trailer
  << /Root 1 0 R
   /Size 7
  >>
%%EOF

问题分析与解决

核心错误点

  1. 流标签格式错误:PDF要求stream和endstream必须单独占一行,且stream后需跟换行符,不能直接将图像内容拼接在stream后面。你的代码中stream111000111endstream连在一起,解析器无法识别流的起始与结束。
  2. 1位图像的字节对齐要求:当BitsPerComponent=1时,PDF要求每行像素位必须向上取整到8的倍数(按字节对齐)。3×3的图像每行3位,需补5位凑成1字节,3行共需3字节,而非9个字符的文本形式。直接写111000111是字符串,不是二进制字节数据。
  3. 操作符大小写错误:PDF操作符区分大小写,旧代码中的DO是错误的,正确写法为Do(新代码已修正)。

修正后的图像对象代码

将5号对象修改为以下内容即可正常显示:

5 0 obj 
  <<
    /Type /XObject
    /Subtype /Image
    /Height 3
    /Width 3
    /BitsPerComponent 1
    /Length 3  % 修正为3字节,对应3行对齐后的字节数
    /ColorSpace /DeviceGray
    /DecodeParms << /Columns 3 /Rows 3 >>  % 明确指定行列,帮助解析器识别
  >>
stream
\xE0\x00\xE0  % 二进制字节:第一行11100000,第二行00000000,第三行11100000
endstream
endobj

字节值解释:

  • 第一行像素111补5个0 → 11100000(十六进制0xE0)
  • 第二行像素000补5个0 → 00000000(十六进制0x00)
  • 第三行像素111补5个0 → 11100000(十六进制0xE0)

其他需修正的细节

  • MediaBox格式:新代码中/MediaBox [500 500]错误,正确格式为/MediaBox [0 0 500 500](四个值分别为左下角x、y坐标,右上角x、y坐标)。
  • ProcSet规范:旧代码中的/ProcSet [/PDF /ImageB]指定了页面支持的操作集,/ImageB对应黑白图像,建议新代码加回该配置,提升兼容性。
  • Size值准确性:trailer中的/Size 7错误,当前对象编号为1-5,应改为/Size 6(Size值为对象总数+1,因对象从0开始计数)。

1位PDF图像基础知识点

  • 黑白像素定义:BitsPerComponent=1代表每个像素用1位表示,默认Decode [0 1]对应0=黑色、1=白色,可通过修改Decode [1 0]反转颜色。
  • 字节对齐规则:无论每行实际像素位数量,必须凑成整字节,不足部分在每行末尾补0。
  • 流数据类型:图像流必须是二进制字节数据,不能用文本形式的二进制串替代,PDF解析器会将流内容当作二进制处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:49:56