【问题标题】:Delete padding of Rectangle in iText PDF signature删除 iText PDF 签名中 Rectangle 的填充
【发布时间】:2018-04-16 16:05:38
【问题描述】:

我有一个小应用程序可以使用 iText 在 JAVA 中为 PDF 添加签名。 这是代码片段:

PdfReader           reader  = new PdfReader(pdfBytes);
FileOutputStream    fos     = new FileOutputStream(new File("/home/john/signedPdf.pdf"));
PdfStamper          stamper = PdfStamper.createSignature(
                            reader, 
                            fos, 
                            '\0', 
                            new File("/home/john/"), 
                            true
    );
PdfSignatureAppearance signatureAppearance = stamper.getSignatureAppearance();
signatureAppearance.setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION);
Rectangle rectangle = new Rectangle(
                36,
                748 - 20 * (next - 1) ,
                144,
                780 - 20 * (next - 1)
    );
rectangle.normalize();
signatureAppearance.setVisibleSignature(
        rectangle, 
        1, contact);

PDF 的签名很好,但矩形中的可见符号有一个填充,一个矩形超过了第二个,第二个超过了第三个,等等。 这是示例图像: 存在一种删除此填充并避免一个矩形覆盖另一个矩形的方法。 提前致谢

【问题讨论】:

  • 你使用哪个RenderingMode?在RenderingMode.DESCRIPTION 的情况下,所有四个边上的填充都相同,为 2pt,但考虑到屏幕截图中的框架线,您的情况似乎并非如此。话虽如此,矩形是否重叠取决于您如何选择矩形坐标。不幸的是,您也没有为此显示相关代码,setVisibleSignature 调用...
  • @mkl 我更新了代码。我添加了 RenderingMode.DESCRIPTION 并且矩形重叠仍然存在。
  • 已经为next的相邻值创建了签名?喜欢 1 和 2?
  • 我不太明白你的问题(我的英语不是很好)。 next 是一个 Integer 来控制符号的顺序。如果没有签名下一个是0,并且矩形写在这个位置,如果有一个1符号(存在一个矩形)我写下一个矩形,依此类推。
  • 您在代码中使用了变量next。您的代码是否创建了两个重叠的签名,并且下一个具有连续值?例如。是否为next == 1 创建了最上面的签名,为next == 2 创建了较低的签名?

标签: java pdf itext sign


【解决方案1】:

您使用这样创建的矩形作为您的签名

Rectangle rectangle = new Rectangle(
                36,
                748 - 20 * (next - 1) ,
                144,
                780 - 20 * (next - 1)
    );

其中(如 cmets 中所述)整数 next 可以具有连续的签名值,例如1 和 2。

但这意味着您实际上要求重叠签名矩形!例如。对于你得到的值 1 和 2:

  • next == 1 - 矩形顶部y:780;矩形底部y:748
  • next == 2 - 矩形顶部 y: 760;矩形底部y:728

所以这些矩形在 760 和 748 之间重叠 y。

如果您不希望矩形重叠,则 y 步长因子(当前为 20)必须至少与顶部和底部之间的差值一样大 y 坐标起始值(当前为 780 - 748 = 32)。

例如您可以使用 32 的步长因子

Rectangle rectangle = new Rectangle(
                36,
                748 - 32 * (next - 1) ,
                144,
                780 - 32 * (next - 1)
    );

或高度为 20 的矩形

Rectangle rectangle = new Rectangle(
                36,
                760 - 20 * (next - 1) ,
                144,
                780 - 20 * (next - 1)
    );

而不是您当前的矩形尺寸和位置。

【讨论】:

  • 谢谢!这样可行。但是在文本和矩形的上边缘之间有一个填充。有没有可能消除它?
  • @JoseJavierHernándezBenítez 我明天上班时去看看。
  • 啊,原因是矩形的前 30% 明确留空,当我查看代码时,我记得我之前写过关于该问题的答案,cf. this answer here.
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多