我正在ASP .net应用程序中使用iTextSharp生成PDF文档。
我的用户在iPad上打开PDF,添加签名[绘图],然后通过电子邮件发送签名文档。
签名在iPad上看起来正确,但一旦通过电子邮件发送,签名就会逆时针旋转90度。如果我改为在线保存到Acrobat,则不会出现问题。
编辑:我无法分享原始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版
答案 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)
Adobe Reader在2013年9月中旬发布了更新(11.0.1),修复了这个漏洞。我仍然喜欢mkl修复以避免轮换(为什么会增加复杂性?),但对于任何查看此内容的人来说,您都不必担心使用最新版本的Adobe Reader for iOS。