iText 7.1.0 展平签名字段,外观拉伸

Jha*_*ack 4 itext pdfbox itext7

我有一个 PDF ( https://github.com/giacgbj/stackOverflow/blob/master/xxx.pdf ),以某种方式由第三方进行数字签名,其签名具有外观

原来的

当我使用以下代码(iText 7.1.0)拼合PDF(https://github.com/giacgbj/stackOverflow/blob/master/xxxFlattened.pdf )时

try (PdfWriter output = new PdfWriter("output.pdf");
            PdfDocument input = new PdfDocument(new PdfReader("input.pdf"), output)) {
   PdfAcroForm.getAcroForm(input, true).flattenFields();
}
Run Code Online (Sandbox Code Playgroud)

签名的外观被拉伸成这样:

拉伸的

使用 PDFBox 或 GhostScript 等命令行参数或转换 (imagemagick) 或 pdf2ps/ps2pdf 可以拼合相同的 PDF。

这种行为的原因是什么?

mkl*_*mkl 5

问题是签名注释具有以下Rect值:

[35.0 115.0 215.0 155.0]
Run Code Online (Sandbox Code Playgroud)

这是一个左下角为(35,115)、左上角为(215,155)的矩形,即宽180、高40的矩形。

不过,它的外观具有以下BBox值:

[100.0 50.0 0.0 0.0]
Run Code Online (Sandbox Code Playgroud)

这是一个宽 100 个单位、高 50 个单位的矩形。(严格来说,这并不完全有效:通常在 PDF 中,矩形被写为一个由四个数字组成的数组,给出一对对角对角的坐标。但是,对于BBox值,顺序是固定的:一个由四个数字组成的数组,给出分别为左、下、右和上坐标。但如果使用正确的顺序,这里讨论的问题也会出现。)

根据 PDF 规范,外观将被拉伸以匹配注释矩形。

不过,在展平期间,使用以下变换矩阵将以前的签名外观添加到页面中:

1 0 0 1 35 115
Run Code Online (Sandbox Code Playgroud)

它正确地将其左下角定位在 (35,115),但使用单位矩阵映射矩形;因此,它没有被错误地拉​​伸到 180x40 的尺寸,而是保持为 100x50,这是您观察到的拉伸(实际上是缺失的拉伸!)。

简而言之,您似乎在 iText 中发现了一个错误,缺少转换......