从iPad发送电子邮件时,PDF签名会轮换

时间:2013-08-26 20:36:30

标签: ios ipad pdf-generation itext acrobat

我正在ASP .net应用程序中使用iTextSharp生成PDF文档。

我的用户在iPad上打开PDF,添加签名[绘图],然后通过电子邮件发送签名文档。

签名在iPad上看起来正确,但一旦通过电子邮件发送,签名就会逆时针旋转90度。如果我改为在线保存到Acrobat,则不会出现问题。

Rotated Signatures

编辑:我无法分享原始pdf,因为它们包含法律和财务信息。我可以分享另一个我们使用的具有相同问题的测试pdf。它不是由itext生成的,但它似乎表明问题出在adobe iOS应用程序上,而不是创建它的应用程序。

The e-mailed PDF (with rotated drawing)

The uploaded PDF from Acrobat.com (working as intended)

其他信息:

Apple iPad 2 MC773LL / A平板电脑(16GB,Wifi + AT& T 3G,黑色)第二代 iOS版本:6.0.1(10A523) Adobe Reader 11.0.0版

2 个答案:

答案 0 :(得分:1)

简而言之

e-mailed PDF基于uploaded PDF。更改是原始文档(上载的PDF)包含两个注释,这些注释在已更改的文档(电子邮件的PDF)中已被展平,即改为存储在页面内容中。

不幸的是,执行该展平的软件仅仅附加了用于向页面内容显示注释外观的命令,而忽略了已经存在的页面内容中的变换矩阵已被改变(旋转)的事实。因此,在形状展平后,签名也会旋转。

因此,必须修复执行此形式展平的软件(简单地附加到内容而不考虑转换矩阵可能实际上已经改变是不行的!)。

作为短期解决方案,(如果不能轻易替换平整的软件),您可以考虑使用不使用旋转创建横向PDF的基础PDF。

如果使用iText(夏普)创建的文档(您在问题中提到),这可能意味着使用

new Document(new Rectangle(792, 612));
  

(参见iText(夏普)样本HelloWorldLandscape2.java / HelloWorldLandscape2.cs

而不是

new Document(PageSize.LETTER.Rotate()));
  

(参见iText(夏普)样本HelloWorldLandscape1.java / HelloWorldLandscape1.cs

iText in Action — 2nd Edition中所述,

  

当您想要操纵PDF时,内部存在微妙的差异[<]。

详细

在原始PDF中,页面词典通过注释引用签名

3 0 obj
<<
  /Type/Page
  /Parent 2 0 R
  /MediaBox[ 0 0 612 792]
  /Rotate 270
  /Contents 5 0 R
  /Resources<</Font<</F1 4 0 R>>/ProcSet[/PDF/Text]>>
  /Annots 11 0 R
>>
endobj 
11 0 obj
[ 12 0 R 15 0 R 16 0 R 19 0 R]
endobj 

对象12和16分别是引用对象14和18中的外观流的墨迹注释。

对象5中的内容流设置

0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 cm

如您所见,页面旋转( /旋转270 ),内容流向另一个方向旋转( 0 -1 1 0 0 0 cm )启用竖直打印。但是,注释外观流不受此反向旋转的影响,因此,它们本身就是这样做的。

在展平的页面中,它看起来像这样

3 0 obj
<<
  /Type/Page
  /Parent 2 0 R
  /MediaBox[ 0 0 612 792]
  /Rotate 270
  /Resources
  <<
    /Font<</F1 4 0 R>>
    /ProcSet[/PDF/Text]
    /XObject<</CprRpt2 14 0 R/CprRpt3 18 0 R>>
  >>
  /Annots 11 0 R
  /Contents[ 5 0 R 20 0 R]>>
endobj 
11 0 obj
[]
endobj 

对象20中的内容流包含

q 1 0 0 1 223.453 24.0703  cm /CprRpt2 Do Q 
q 1 0 0 1 410.246 59.9062  cm /CprRpt3 Do Q 

因此,删除了注释(对象11中的空数组),但Ink注释的外观流现在直接包含在内容流本身中( / CprRpt2执行 / CprRpt3 定义为引用资源中的对象14和18。

因此,这些外观流现在也受到来自对象5( 0 -1 1 0 0 0 cm )的旋转变换矩阵的影响,因为流20在内容流阵列中的流5之后 [5 0 R 20 0 R] 。不过,他们(见上文)也会反击页面轮换。因此,从本质上讲,它们的旋转现在可以抵消两次,然后以相反的方式旋转。

答案 1 :(得分:0)

Adob​​e Reader在2013年9月中旬发布了更新(11.0.1),修复了这个漏洞。我仍然喜欢mkl修复以避免轮换(为什么会增加复杂性?),但对于任何查看此内容的人来说,您都不必担心使用最新版本的Adobe Reader for iOS。