【问题标题】:PDF Signature gets rotated when e-mailing from iPad从 iPad 发送电子邮件时 PDF 签名会旋转
【发布时间】:2013-08-29 10:36:42
【问题描述】:

我正在一个 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 版

【问题讨论】:

  • 请提供样本 pdf。另外请注意,虽然 iOS 已经内置了 pdf 功能,但此功能非常有限。这个,可能 iOS 组件无法识别旋转或类似效果。
  • @mkl:关于内置功能的要点很好,但这实际上是在 Adob​​e PDF 应用程序中加载的。我正在使用它的功能添加签名(绘图),然后展平并发送电子邮件。

标签: ios ipad pdf-generation itext acrobat


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    简而言之

    e-mailed PDF 基于uploaded 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 — 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
    

    如您所见,页面旋转(/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做定义来引用Resources中的对象14和18)。

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

    【讨论】:

    • 这是有道理的,而且似乎有效。为了避免对值进行硬编码,我刚刚使用前一个矩形的高度和宽度(反转)减去旋转创建了一个新的矩形。
    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2021-12-24
    • 2015-03-30
    • 2018-09-19
    相关资源
    最近更新 更多