如何在 PDF 文件的双色调图像上使用颜色蒙版?

How to use a color Mask on a bitonal image in a PDF file?

我正在尝试创建一个包含单色 1 位图像的 PDF 文件,但将图像配置为在包含白色像素的地方透明(以便图像下方的内容可见)。图片使用DeviceGray颜色space,BitsPerComponent为1.

我将 Mask 条目与一个数组一起使用,该数组指定应屏蔽的颜色范围。我的 PDF 规范副本将此称为“颜色键掩码”。由于图像是双色调的,因此此颜色范围仅为 [1 1](白色)。

但是,我根本无法让它工作。图像下的内容永远不会显示。我试过调整范围值、更改图像过滤器、调整周围的图形状态——都无济于事。

唯一有效的方法是将图像颜色 space 从 DeviceGray 更改为 DeviceRGB 并相应地调整 Mask 范围,但这会增加这些图像在 PDF 文件中的大小,我做不到。

在双色调 DeviceGray 图像上使用色键遮罩的正确方法是什么?

这是我认为应该有效但无效的图像:

6 0 obj
<<
/Length 8800
/Type /XObject
/Subtype /Image
/Filter /ASCIIHexDecode
/BitsPerComponent 1
/Width 350
/Height 100
/ColorSpace /DeviceGray
/Mask [1 1]
>>
stream
FFFF<snip>FFFC
endstream
endobj

编辑: 添加完整示例 PDF 文件以获得完整上下文。该文件包含一个带有文本“XYZ”的图像,以及在 XYZ 图像下运行的一行,该行被图像隐藏但在文本下应该可见:

%PDF-1.4
%צה
1 0 obj
<<
/Type /Catalog
/Version /1.4
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type /Pages
/Kids [3 0 R]
/Count 1
>>
endobj
3 0 obj
<<
/Type /Page
/MediaBox [0.0 0.0 612.0 792.0]
/Parent 2 0 R
/Contents 4 0 R
/Resources 5 0 R
>>
endobj
4 0 obj
<<
/Length 53
>>
stream
0 396 m
612 396 l
S
q
90 0 0 80 261 356 cm
/Im1 Do
Q

endstream
endobj
5 0 obj
<<
/XObject <<
/Im1 6 0 R
>>
>>
endobj
6 0 obj
<<
/Length 1920
/Type /XObject
/Subtype /Image
/Filter /ASCIIHexDecode
/BitsPerComponent 1
/Width 90
/Height 80
/ColorSpace /DeviceGray
/Mask [1 1]
>>
stream
FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FE0FFF8307FFF8380000FFC0FF07FF0783FFF0780000FFC0FF87FE0FC3FFF0F80000FFC0FF83FE0FC1FFE0F80000FFC0FFC1FC1FE0FFC1FFFFE0FFC0FFE0F83FF0FFC3FFFFC1FFC0FFF0F87FF07F83FFFF83FFC0FFF0707FF83F07FFFF07FFC0FFF820FFFC3F0FFFFF07FFC0FFFC21FFFC1E0FFFFE0FFFC0FFFC01FFFE1C1FFFFC1FFFC0FFFE03FFFF0C3FFFF83FFFC0FFFF07FFFF003FFFF07FFFC0FFFF07FFFF807FFFF07FFFC0FFFE03FFFFC0FFFFE0FFFFC0FFFC01FFFFC0FFFFC1FFFFC0FFFC21FFFFE1FFFF83FFFFC0FFF820FFFFE1FFFF83FFFFC0FFF0707FFFE1FFFF07FFFFC0FFF0F87FFFE1FFFE0FFFFFC0FFE0F83FFFE1FFFC1FFFFFC0FFC1FC1FFFE1FFFC1FFFFFC0FFC3FE1FFFE1FFF83FFFFFC0FF83FE0FFFE1FFF07FFFFFC0FF07FF07FFE1FFE0FFFFFFC0FE0FFF83FFE1FFE000007FC0FE1FFFC3FFE1FFE000007FC0FC1FFFC1FFE1FFE000007FC0F83FFFE0FFE1FFE000007FC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFFFFFFFC0
endstream
endobj
xref
0 7
0000000000 65535 f
0000000015 00000 n
0000000078 00000 n
0000000135 00000 n
0000000247 00000 n
0000000352 00000 n
0000000399 00000 n
trailer
<<
/Root 1 0 R
/ID [<DF10D2517650DA8AC34FF5D6B9B046EA> <DF10D2517650DA8AC34FF5D6B9B046EA>]
/Size 7
>>
startxref
2505
%%EOF

编辑 2: 感谢 这确实有效,我深入研究了 reader 的一面。原来是SumatraPDF有bug,我用的旧版AcrobatReader也有bug

更新 Acrobat Reader 后,简化的示例可以使用,但涉及 Forms 的更复杂的示例仍然无法使用 -- 看来这可能是 PDF 规范中未被广泛使用的领域或者像其他人一样经过实战考验,即使在 Acrobat Reader 中也是如此。由于兼容性问题,我可能暂时不会使用 DeviceGray + bitonal + Mask 组合,而是使用效率较低的 SMask 选项。

所有示例(简单的和复杂的)在 iOS、Chrome 和 Firefox 查看器中都能正常工作,所以我只是碰巧选择了两个最差的 reader 选项来测试这个。

在没有看到整个文件的情况下,我无法说出为什么没有应用遮罩。

但下面的文件显示 /Mask 应用于 /DeviceGray 双色图像:

4 0 obj
<<
  /Type /Page
  /Resources <</XObject <</XO0 6 0 R>>>>
  /Contents [5 0 R ]
  /MediaBox [0  0  612  792  ]
  /Parent 3 0 R
>>
endobj
5 0 obj
<<
  /Length 103 
>>
stream
  /DeviceRGB cs
  0 1 0 sc
  50 650 m 250 650 l 250 750 l 50 750 l h f
  q 200 0 0 100 50 650 cm /XO0 Do Q
endstream
endobj
6 0 obj
<<
  /Subtype /Image
  /Width 16 
  /Height 8 
  /BitsPerComponent 1 
  /ColorSpace /DeviceGray
  /Mask [1  1]
  /Length 16 
>>
stream
UUUUUUUUUUUUUUUU
endstream
endobj

这是结果(绘制在绿色矩形上方的图像,U=01010101,白色 (1) 是透明的):

对于 SumatraPDF,该错误存在于 MuPDF 引擎中,并且由于上述问题已在当前 Pre-Release 中修复。

SumatraPDF Pre-Release 构建版本 3.4.14261+ 2022-Feb-04 或更高版本可从 https://www.sumatrapdfreader.org/prerelease