使用自定义坐标在 pdf 上定位数字签名(使用充气城堡框架)

Positioning digital signatures on pdfs using custom coordinates (using bouncy castle framework)

以下是我用来将数字签名放置在标准的四个坐标上的代码,即左上角、右上角、左下角、右下角。但是,左上角无法正常工作。

 PdfReader reader = new PdfReader(src);//src being file path of pdf being signed
 Rectangle cropBox = reader.getCropBox(1);
 if(signaturePosition.equalsIgnoreCase("bottom-left"))
           appearance.setVisibleSignature(new Rectangle(cropBox.getLeft(), cropBox.getBottom(),
                  cropBox.getLeft(width), cropBox.getBottom(height)), 1,    "first");
           if(signaturePosition.equalsIgnoreCase("bottom-right"))
               appearance.setVisibleSignature(new Rectangle(cropBox.getRight(width), cropBox.getBottom(),
                       cropBox.getRight(), cropBox.getBottom(height)), 1,    "first");
           if(signaturePosition.equalsIgnoreCase("top-left"))
               appearance.setVisibleSignature(new Rectangle(72, 732, 144, 780), 1,    "first");
           if(signaturePosition.equalsIgnoreCase("top right"))
               appearance.setVisibleSignature(new Rectangle(cropBox.getRight(width), cropBox.getTop(height),
                     cropBox.getRight(), cropBox.getTop()), 1,    "first");

需要根据用户提供的坐标将签名放在 pdf 的任意位置。为了获得用户的坐标,我们使用了一个 pdf xpro 模板,上面有一个文本框(用户将上传模板并将文本框放在他需要签名的地方),使用那个文本框以其高度和宽度作为参考的坐标,我们将在 pdf 上定位签名。

我需要帮助来理解 appearance.setVisibleSignature() 方法如何在传递给它的 Rectangle 对象中工作,因为对于页面的每个象限(考虑页面作为原点)左上角、右上角、左下角和右下角的参数传递方式不同。

OP 在(同时删除的)评论中澄清:

I am asking for explanation of passing height width as parameter to getTop(),getLeft() etc functions. Its not being clear.

这些方法定义为:

// Returns the lower left y-coordinate, considering a given margin.
public float getBottom(final float margin) {
    return lly + margin;
}

// Returns the lower left x-coordinate, considering a given margin.
public float getLeft(final float margin) {
    return llx + margin;
}

// Returns the upper right x-coordinate, considering a given margin.
public float getRight(final float margin) {
    return urx - margin;
}

// Returns the upper right y-coordinate, considering a given margin.
public float getTop(final float margin) {
    return ury - margin;
}

(Rectangle.java)

即这些方法 return 最大或最小 xy 坐标向内移动给定的边距距离。在您上面复制的计算中,这些方法仅用作某些加法或减法的替代。

ideally rectangle is top left coordinate as first two coords and height and width as other 2 coords,

人们认为理想的 取决于具体情况。 我们这里是构造函数

/**
 * Constructs a <CODE>Rectangle</CODE> -object.
 *
 * @param llx   lower left x
 * @param lly   lower left y
 * @param urx   upper right x
 * @param ury   upper right y
 */
public Rectangle(final float llx, final float lly, final float urx, final float ury)

(ibidem)

所以,首先你有左下xy,然后是右上xy。也就是说,你左边x,底部y,右边x,顶部y

but its being done differently. Request insights into this.

如果你有左上坐标和宽高,这些坐标很容易计算。

顺便说一句,我希望您知道在 PDF 中,默认用户 space 坐标系的原点可以位于页面上或页面外的任何位置(选中裁剪框),并且(在数学中很常见) x 坐标向右增加,y 坐标向上增加。