pdfbox-符号横向文件错误 [英] pdfbox - sign landscape file error
问题描述
我正在使用 pdfbox-1.8.8 对PDF文件进行签名.
它与纵向模式下的PDF文件一起使用时效果很好.但是对于风景文件,我有一个问题
看来风景文件的坐标是错误的.
有人知道文件出了什么问题吗?
这是 pdf文件 >
这是我以前签名的代码
public void signDetached(String inputFilePath, String outputFilePath, String signatureImagePath, Sign signProperties) {
OutputStream outputStream = null;
InputStream inputStream = null;
PDDocument document = null;
InputStream signImageStream = null;
try {
setTsaClient(null);
document = PDDocument.load(inputFilePath);
// create signature dictionary
PDSignature signature = new PDSignature();
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("VANDUC1102");
signature.setLocation(null);
String displayName = "Hello World, Document signed by VANDUC1102";
String reason = reasonText+ " " + displayName;
signature.setReason(reason);
// the signing date, needed for valid signature
signature.setSignDate(Calendar.getInstance());
int signatureInPage = signProperties.getPageNumber() + 1;
signImageStream = new FileInputStream(new File(signatureImagePath));
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(inputFilePath, signImageStream, signatureInPage);
float xAxis = convertPixel2Point(signProperties.getX()) ;
float yAxis = convertPixel2Point(signProperties.getY());
float signImageHeight = convertPixel2Point(signImageHeight);
float signImageWidth = convertPixel2Point(signImageWidth);
visibleSig.xAxis(xAxis)
.yAxis(yAxis)
.zoom(0)
.signatureFieldName("Signature")
.height(signImageHeight)
.width(signImageWidth);
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName(eiUser.getName())
.signerLocation(null)
.signatureReason(reason)
.preferredSize(0)
.page(signProperties.getPageNumber())
.visualSignEnabled(true)
.setPdVisibleSignature(visibleSig)
.buildSignature();
// register signature dictionary and sign interface
SignatureOptions signatureOptions = new SignatureOptions();
signatureOptions.setVisualSignature(signatureProperties);
signatureOptions.setPage(signatureInPage);
document.addSignature(signature, this, signatureOptions);
File outputFile = new File(outputFilePath);
outputStream = new FileOutputStream(outputFile);
inputStream = new FileInputStream(inputFilePath);
IOUtils.copyStream(inputStream, outputStream);
document.saveIncremental(inputStream, outputStream);
outputStream.flush();
} catch (COSVisitorException | SignatureException | IOException ex) {
log.error("signDetached ", ex);
} finally {
IOUtils.closeStream(outputStream);
IOUtils.closeStream(inputStream);
IOUtils.closeStream(signImageStream);
IOUtils.closeStream(document);
}
}
private float convertPixel2Point(float pixel){
return pixel * (float) 72/96;
}
正如我所说的那样,此代码与纵向PDF一起很好地工作
谢谢.
有问题的页面的 Rotate 值非零. 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,必须进行类似的修正.
(testLandscapeFixed
/sign/SignLikeVanduc1102.java"rel =" nofollow> SignLikeVanduc1102 )
I am using pdfbox-1.8.8 to do the signing function on PDF file.
It works well with PDF file in portrait mode. But with landscape file, I have an issue
It looks like the coordinate is wrong for the landscape file.
Does anyone know what is wrong with the file ?
Here is the link of pdf file
Here is the code I used to sign
public void signDetached(String inputFilePath, String outputFilePath, String signatureImagePath, Sign signProperties) {
OutputStream outputStream = null;
InputStream inputStream = null;
PDDocument document = null;
InputStream signImageStream = null;
try {
setTsaClient(null);
document = PDDocument.load(inputFilePath);
// create signature dictionary
PDSignature signature = new PDSignature();
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
signature.setName("VANDUC1102");
signature.setLocation(null);
String displayName = "Hello World, Document signed by VANDUC1102";
String reason = reasonText+ " " + displayName;
signature.setReason(reason);
// the signing date, needed for valid signature
signature.setSignDate(Calendar.getInstance());
int signatureInPage = signProperties.getPageNumber() + 1;
signImageStream = new FileInputStream(new File(signatureImagePath));
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(inputFilePath, signImageStream, signatureInPage);
float xAxis = convertPixel2Point(signProperties.getX()) ;
float yAxis = convertPixel2Point(signProperties.getY());
float signImageHeight = convertPixel2Point(signImageHeight);
float signImageWidth = convertPixel2Point(signImageWidth);
visibleSig.xAxis(xAxis)
.yAxis(yAxis)
.zoom(0)
.signatureFieldName("Signature")
.height(signImageHeight)
.width(signImageWidth);
PDVisibleSigProperties signatureProperties = new PDVisibleSigProperties();
signatureProperties.signerName(eiUser.getName())
.signerLocation(null)
.signatureReason(reason)
.preferredSize(0)
.page(signProperties.getPageNumber())
.visualSignEnabled(true)
.setPdVisibleSignature(visibleSig)
.buildSignature();
// register signature dictionary and sign interface
SignatureOptions signatureOptions = new SignatureOptions();
signatureOptions.setVisualSignature(signatureProperties);
signatureOptions.setPage(signatureInPage);
document.addSignature(signature, this, signatureOptions);
File outputFile = new File(outputFilePath);
outputStream = new FileOutputStream(outputFile);
inputStream = new FileInputStream(inputFilePath);
IOUtils.copyStream(inputStream, outputStream);
document.saveIncremental(inputStream, outputStream);
outputStream.flush();
} catch (COSVisitorException | SignatureException | IOException ex) {
log.error("signDetached ", ex);
} finally {
IOUtils.closeStream(outputStream);
IOUtils.closeStream(inputStream);
IOUtils.closeStream(signImageStream);
IOUtils.closeStream(document);
}
}
private float convertPixel2Point(float pixel){
return pixel * (float) 72/96;
}
As I said this code work well with portrait PDF
Thanks.
The page in question has a non-zero Rotate value. The PDFBox visual signing classes completely ignore this value, so one has to give it the coordinates and dimensions as if the page was not rotated.
This can be done by adding the following switch
statement:
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);
and the following method:
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();
}
}
For Rotate values of 180 and 270, analogous corrections have to be made.
(Test methods testLandscapeOriginal
and testLandscapeFixed
in SignLikeVanduc1102)
这篇关于pdfbox-符号横向文件错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!