我正在使用 pdfbox-1.8.8 在PDF文件上执行签名功能。
在纵向模式下,它适用于PDF文件。但是对于横向文件,我有一个问题
看起来横向文件的坐标是错误的。
有谁知道该文件有什么问题?
的链接以下是我用来签名的代码
pyzmq
正如我所说,这段代码适用于肖像PDF
感谢。
答案 0 :(得分:3)
相关网页的值为旋转非零。 PDFBox可视签名类完全忽略此值,因此必须为其提供坐标和尺寸,就像页面未旋转一样。
这可以通过添加以下switch
语句来完成:
float xAxis = convertPixel2Point(/*signProperties.getX()*/x) ;
float yAxis = convertPixel2Point(/*signProperties.getY()*/y);
float signImageHeight = convertPixel2Point(/*signImageHeight*/324);
float signImageWidth = convertPixel2Point(/*signImageWidth*/309);
int rotation = getPageRotation(inputFilePath, page) % 360;
switch (rotation)
{
case 0:
// all ok;
break;
case 90:
visibleSig.affineTransformParams(new byte[] {0, 1, -2, 0, 100, 0})
.formaterRectangleParams(new byte[]{0, 0, 100, 100});
float temp = yAxis;
yAxis = visibleSig.getPageHeight() - xAxis - signImageWidth;
xAxis = temp;
temp = signImageHeight;
signImageHeight = signImageWidth;
signImageWidth = temp;
break;
case 180:
// Implement in a similar fashion
case 270:
// Implement in a similar fashion
}
visibleSig.xAxis(xAxis)
.yAxis(yAxis)
.zoom(0)
.signatureFieldName("Signature")
.height(signImageHeight)
.width(signImageWidth);
和以下方法:
private int getPageRotation(String documentPath, int page) throws IOException
{
try (PDDocument document = PDDocument.load(documentPath))
{
List<?> pages = document.getDocumentCatalog().getAllPages();
PDPage pageObject =(PDPage) pages.get(page);
return pageObject.getRotation();
}
}
对于旋转值180和270,必须进行类似的修正。
(SignLikeVanduc1102中的测试方法testLandscapeOriginal
和testLandscapeFixed
)
答案 1 :(得分:2)
从版本2.0.5开始,通过adjustForRotation()
调用可以调整旋转页面的签名字段。在CreateVisibleSignature.java example,这一行
visibleSignDesigner.xAxis(x).yAxis(y).zoom(zoomPercent);
必须更改为:
visibleSignDesigner.xAxis(x).yAxis(y).zoom(zoomPercent).adjustForRotation();
更改(issue PDFBOX-3671)部分基于@mkl的回答。它不适用于1.8。*。
更新24.10.2018:
所有2.0。*版本高达2.0.12都存在adjustForRotation()
硬编码为200 x 100图像大小的问题。这已在2.0.13中修复。或者,使用正确的实现方式派生您自己的PDVisibleSignDesigner
并扩展adjustForRotation()
:
public PDVisibleSignDesigner adjustForRotation()
{
switch (rotation)
{
case 90:
float temp = yAxis;
yAxis = pageHeight - xAxis - imageWidth;
xAxis = temp;
affineTransform = new AffineTransform(
0, imageHeight / imageWidth, -imageWidth / imageHeight, 0, imageWidth, 0);
temp = imageHeight;
imageHeight = imageWidth;
imageWidth = temp;
break;
case 180:
float newX = pageWidth - xAxis - imageWidth;
float newY = pageHeight - yAxis - imageHeight;
xAxis = newX;
yAxis = newY;
affineTransform = new AffineTransform(-1, 0, 0, -1, imageWidth, imageHeight);
break;
case 270:
temp = xAxis;
xAxis = pageWidth - yAxis - imageHeight;
yAxis = temp;
affineTransform = new AffineTransform(
0, -imageHeight / imageWidth, imageWidth / imageHeight, 0, 0, imageHeight);
temp = imageHeight;
imageHeight = imageWidth;
imageWidth = temp;
break;
case 0:
default:
break;
}
return this;
}