使用自定义坐标在 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;
}
即这些方法 return 最大或最小 x 或 y 坐标向内移动给定的边距距离。在您上面复制的计算中,这些方法仅用作某些加法或减法的替代。
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)
所以,首先你有左下x和y,然后是右上x 和 y。也就是说,你左边x,底部y,右边x,顶部y。
but its being done differently. Request insights into this.
如果你有左上坐标和宽高,这些坐标很容易计算。
顺便说一句,我希望您知道在 PDF 中,默认用户 space 坐标系的原点可以位于页面上或页面外的任何位置(选中裁剪框),并且(在数学中很常见) x 坐标向右增加,y 坐标向上增加。
以下是我用来将数字签名放置在标准的四个坐标上的代码,即左上角、右上角、左下角、右下角。但是,左上角无法正常工作。
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; }
即这些方法 return 最大或最小 x 或 y 坐标向内移动给定的边距距离。在您上面复制的计算中,这些方法仅用作某些加法或减法的替代。
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)
所以,首先你有左下x和y,然后是右上x 和 y。也就是说,你左边x,底部y,右边x,顶部y。
but its being done differently. Request insights into this.
如果你有左上坐标和宽高,这些坐标很容易计算。
顺便说一句,我希望您知道在 PDF 中,默认用户 space 坐标系的原点可以位于页面上或页面外的任何位置(选中裁剪框),并且(在数学中很常见) x 坐标向右增加,y 坐标向上增加。