简而言之
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]。不过,它们也(见上文)本身抵消了页面旋转。因此,从本质上讲,它们的旋转现在被抵消了两次,并且它们以另一种方式旋转。