pdfbox – 签署横向文件错误

我使用pdfbox-1.8.8在PDF文件上执行签名function。

它在纵向模式下适用于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

谢谢。

有问题的页面具有非零的旋转值。 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,必须进行类似的校正。

(测试方法testLandscapeOriginaltestLandscapeFixed在SignLikeVanduc1102中 )

从版本2.0.5开始(将于2017年春季发布一段时间, 可用快照 ),可以使用adjustForRotation()调用调整旋转页面的签名字段。 在CreateVisibleSignature.java示例中 ,此行

 visibleSignDesigner.xAxis(x).yAxis(y).zoom(zoomPercent); 

必须改为:

 visibleSignDesigner.xAxis(x).yAxis(y).zoom(zoomPercent).adjustForRotation(); 

更改( 问题PDFBOX-3671 )部分基于@mkl的答案。 它不适用于1.8。*。