如何在 PDF 中设置填充 Alpha

How to set fill alpha in PDF

这是一个红框:

162 86 m 162 286 l 362 286 l 362 86 l h
1 0 0 rg f

如何添加部分透明度?

我已经阅读了 PDF 规范的透明度部分,但我似乎只能找到模型和公式,而不是如何实际将 alpha 添加到填充中。

正如 OP 指出的那样,PDF specification 中有一整节是关于 透明度 的。这是由于有多种应用透明度的方法。以下部分解释了最适合 OP 上下文的方法:

11.6.4.4 Constant Shape and Opacity

The current alpha constant parameter in the graphics state (see “Graphics State”) shall be two scalar values—one for strokes and one for all other painting operations—to be used for the constant shape (f_k) or constant opacity (q_k) component in the colour compositing formulas.

NOTE 1 This parameter is analogous to the current colour used when painting elementary objects.

The nonstroking alpha constant shall also be applied when painting a transparency group’s results onto its backdrop.

The stroking and nonstroking alpha constants shall be set, respectively, by the CA and ca entries in a graphics state parameter dictionary (see “Graphics State Parameter Dictionaries”). As described previously for the soft mask, the alpha source flag in the graphics state shall determine whether the alpha constants are interpreted as shape values (true) or opacity values (false).

因此,首先要在页面资源中定义一个合适的图形状态参数字典,例如:

/Resources<</ExtGState<<
  /GS1 <</ca 0.5>>
>>>>

现在您可以在您的内容流中使用这些命名的图形状态参数:

/GS1 gs
1 0 0 rg
162 86 m
162 286 l
362 286 l
362 86 l
h
f 

如果绘制在绿色格子上,结果如下所示:


顺便说一句,OP的原始内容流片段有错误

162 86 m 162 286 l 362 286 l 362 86 l h
1 0 0 rg f

这里的颜色设置操作介于路径定义(162 ... l h)和路径填充操作(f)之间。这是无效的,比较规范中的 图 9 – 图形对象,在路径构造(和可选的剪切路径运算符)之后,路径绘制操作必须立即进行。 (许多 PDF 查看器确实接受无效的操作顺序,但它仍然无效)。


即将进行的操作的 alpha 值不需要保持不变。相反,它可以例如由具有径向阴影的遮罩控制。

确实,如果您这样定义图形状态参数:

/Resources<</ExtGState<<
  /GS1 << /SMask<</Type/Mask/S/Luminosity/G 1 0 R >> >>
>> >>

对象 1 0 是这个 XObject:

1 0 obj
<<
  /Group<</CS/DeviceGray/S/Transparency>>
  /Type/XObject
  /Resources<</Shading<<
    /Sh1<<
      /Coords[262 186 10 262 186 190]
      /ColorSpace/DeviceRGB
      /ShadingType 3
      /Extend[true true]
      /Function <</Domain[0 1]/FunctionType 2/N 1/C1[0 0 0]/C0[1 1 1]>> 
    >> 
  >>>>
  /Subtype/Form
  /BBox[0 0 500 400]
  /Matrix [1 0 0 1 0 0]
  /Length 10
  /FormType 1
>>stream
  /Sh1 sh
endstream 

你得到上面绘制在绿色格子上的内容流片段: