在不同的PDF查看器中具有不同输出的PDF(带有阴影)

潘蒂尼

考虑以下PostScript文件

[1 0 0.5 0.866 150 550] concat
<< 
   /ShadingType 2 
   /Coords [ 0 0 100 100] 
   /BBox [ 0 0 100 100] 
   /ColorSpace [ /DeviceRGB ] 
   /Function 
      << 
         /FunctionType 0 
         /Domain [0 1] 
         /Range [0 1 0 1 0 1] 
         /BitsPerSample 8 
         /Size [2] 
         /DataSource <FFA0A0FFE0E0> 
      >>
   /Extend [false false] 
>> 
shfill

考虑到我们使用GhostScript(ps2pdf)或Adobe Distiller将该文件转换为PDF。

生成的PDF在不同的PDF查看器中呈现的方式不同:

  • 在Adobe Reader或Firefox(使用PDF.js)中,我们有一个平行四边形(不是矩形)。
  • 在SumatraPDF(使用MuPDF)和Chrome(使用PDFium)中,我们有一个矩形。

谁是对的?

mkl

我认为Adobe Acrobat是正确的,但规范的理解也可能不同。

您的PDF包含以下内容流:

/GS1 gs
q
1 0 .5 .866 150 550 cm
/Sh1 sh
Q

即,首先改变当前的变换矩阵,对其进行剪切和压缩,然后绘制阴影Sh1该阴影又定义为

<</BBox[0 0 100 100]/ColorSpace/DeviceRGB/Coords[0 0 100 100]/Function 15 0 R/ShadingType 2>>

即具有100×100方形边界框(被解释为临时的附加剪切路径),并沿其(0,0)到(100,100)对角线绘制轴向阴影,以匹配您的脚本定义。

阴影运算符sh指定为

操作数 操作员 描述
名称 SH (PDF 1.3)根据当前剪切路径,绘制着色词典描述的形状和颜色着色。图形状态中的当前颜色既未使用也未更改。效果与使用阴影图案作为当前颜色绘制路径的效果不同。name是当前资源字典的Shading子字典中的shading字典资源的名称(请参见7.8.3,“资源字典”)。着色词典中的所有坐标都相对于当前用户空间进行解释。(相反,当在2型图案中使用阴影字典时,坐标在图案空间中表示。)所有颜色都在由阴影字典的ColorSpace标识的颜色空间中解释。条目(请参见“表77-所有着色词典共有的条目”)。背景进入,如果存在的话,将被忽略。
此运算符应仅应用于有界或几何定义的阴影。如果将其应用于无边界阴影,则它会在整个剪切区域上绘制阴影的渐变填充,这可能很耗时。

(ISO 32000-2:2017,表76-阴影运算符)

特别是:着色词典中的所有坐标都相对于当前用户空间进行解释。

因此,正方形边界框/临时剪切路径被当前变换矩阵压缩并剪切为非矩形平行四边形,可以在Adobe Acrobat中查看:

屏幕截图

我在上面提到过,对规范的理解也可以不同:如果将BBox条目视为框的左下角和右上角两点的坐标,并将结果设为框之前应用了转换,在Chrome中可以看到一个压缩的细长矩形:

屏幕截图

但是,此处BBox被指定为由四个数字组成的数组,分别给出了阴影边界框的左,下,右和上坐标(同上,表77 —所有阴影字典共有的条目),而不是作为对角线的两个端点。因此,我赞成Adobe也实施的第一种解释。

我还没有ISO 32000-2:2020的副本,因此也许这已经以一种或另一种方式得到了阐明。


如果在填充指令期间将阴影用作当前颜色,则情况将有所不同。在这种情况下,规范会说:

模式的外观是根据其自己的内部坐标系描述的。每个模式都有一个模式矩阵,即一个转换矩阵,用于将模式的内部坐标系映射到模式的父内容流(将模式定义为资源的内容流)的默认坐标系模式矩阵与父内容流的模式矩阵的连接建立了模式坐标空间,在模式坐标空间中应解释模式中的所有图形对象。

(ISO 32000-2:2017,第8.7.2节-模式的一般属性)

在这种情况下,带有对角轴向阴影的方形边界框将不受当前变换矩阵的约束。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章