简而言之
通过电子邮件发送的 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 之后。不过,它们也(见上文)本身抵消了页面旋转。因此,本质上,它们的旋转现在被抵消了两次,它们以另一种方式旋转。