0

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

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

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

轮换签名

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

通过电子邮件发送的 PDF(带有旋转图)

从 Acrobat.com 上传的 PDF(按预期工作)

其他信息:

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

4

2 回答 2

1

简而言之

通过电子邮件发送的 PDF 以上传的 PDF为基础。变化是原始文档(上传的PDF)包含两个注释,在更改的文档(通过电子邮件发送的PDF)中已被展平,即存储在页面内容中。

不幸的是,执行该扁平化的软件只是将用于显示注释外观的命令附加到页面内容中,而忽略了转换矩阵已在现有页面内容中更改(旋转)的事实。因此,在表格展平之后,书帖也被旋转。

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

但是,作为一个短期解决方案(如果无法轻松替换进行展平的软件),您可能会考虑使用不使用旋转的基本 PDF 来创建横向 PDF。

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

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

(参见 iText(Sharp) 示例HelloWorldLandscape2.java / HelloWorldLandscape2.cs

代替

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

(参见 iText(Sharp) 示例HelloWorldLandscape1.java / HelloWorldLandscape1.cs

iText in Action — 第 2 版中所述,

当您想要操作 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

如您所见,页面被旋转(/Rotate 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 Do/CprRpt3 Do定义为引用资源中的对象 14 和 18 ) .

因此,这些外观流现在也受到来自对象 5 ( 0 -1 1 0 0 0 cm ) 的旋转变换矩阵的影响,因为流 20 在内容流数组[5 0 R 20 0 R]中位于流 5 之后。不过,它们也(见上文)本身抵消了页面旋转。因此,本质上,它们的旋转现在被抵消了两次,它们以另一种方式旋转。

于 2013-08-28T08:50:32.633 回答
0

Adobe Reader 于 2013 年 9 月中旬发布了更新 (11.0.1),修复了此缺陷。我仍然喜欢 mkl 的修复以避免旋转(为什么要增加复杂性?),但是对于查看此内容的任何人,您无需担心使用最新版本的 Adob​​e Reader for iOS。

于 2013-10-24T18:32:10.893 回答