pdfbox - 签署横向文件错误

时间:2015-12-01 03:52:58

标签: java pdf pdfbox

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

在纵向模式下,它适用于PDF文件。但是对于横向文件,我有一个问题

as of beta.17

Position of signatory I want to sign

看起来横向文件的坐标是错误的。

有谁知道该文件有什么问题?

以下是Result of the sign

的链接

以下是我用来签名的代码

pyzmq

正如我所说,这段代码适用于肖像PDF

感谢。

2 个答案:

答案 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中的测试方法testLandscapeOriginaltestLandscapeFixed

答案 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;
}