手动生成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
问题分析与解决
核心错误点
- 流标签格式错误:PDF要求
stream和endstream必须单独占一行,且stream后需跟换行符,不能直接将图像内容拼接在stream后面。你的代码中stream111000111endstream连在一起,解析器无法识别流的起始与结束。 - 1位图像的字节对齐要求:当
BitsPerComponent=1时,PDF要求每行像素位必须向上取整到8的倍数(按字节对齐)。3×3的图像每行3位,需补5位凑成1字节,3行共需3字节,而非9个字符的文本形式。直接写111000111是字符串,不是二进制字节数据。 - 操作符大小写错误: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
相关产品推荐
相关产品推荐

