当前位置: 首页 > 知识库问答 >
问题:

pdfbox-标志横向文件错误

谷梁襦宗
2023-03-14

我正在使用PDFbox-1.8.8在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

多谢了。

共有1个答案

薛祯
2023-03-14

有问题的页面具有非零旋转值。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();
    }
}
 类似资料:
  • 我有一个eclipse java项目,在/src/main/java(包com.xxx.yyy)下。我还在/src/Test/java(包com.xxx.yyy)下有几个测试类。测试类(注释为@Service(value=“sampleclient”)公共类sampleclient{…}由位于/src/main/java下的一个包中的框架代码调用。 如果所有文件/包都位于/src/main/jav

  • 有什么想法如何添加一个超链接在一个网页上使用这个库? 我发现了这个问题:如何使用pdfbox在内容中设置超链接,但这不起作用。 我只想在pdf文件的第一页添加一个超链接。 我更喜欢在页面底部添加以URL为中心的超链接。但目前任何建议都有帮助

  • 主要内容:加载现有的PDF文档,第1步:加载现有的PDF文档,示例在前面的例子中,已经学习了如何创建一个新文档并向其中添加页面。 本章将教您如何加载系统中已经存在的PDF文档,并对其进行一些操作。 加载现有的PDF文档 类的方法用于加载现有的PDF文档。 按照以下步骤加载现有的PDF文档。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可以直接使用类名称调用它,如下所示。 第2步:执行

  • 我的应用程序使用intent拍照。如果我按肖像方向拍摄,我会得到图像。但当我旋转我的设备,并采取横向方向,我得到了错误。甚至错误消息指向(可能)错误的行。 打开相机: 关于活动结果: 给出解释的结果。然后我用其他代码再试一次<打开摄像机: 关于活动结果: 仍然有相同的结果<在寻找一些解决方案后,他们谈到了保存实例。然后我把这个(我使用片段) 仍未工作,其中一条错误消息指向 在onCreate(Bu

  • 我正在使用pdfbox-1.8.6库在Java中做项目(它是必须使用的)。我的问题是 如何检查输入的pdf文件是否具有纵向或横向? 如何检查/扫描PDF中的纵向或横向方向,如果两个页面的尺寸相同?例如,两者都是标准的A4尺寸。通过下面的图片你会更清楚。我的风景肖像问题,我只想检查它的内容是旋转或没有。那么我该如何处理上述问题?

  • 我在尝试将PDF(XFA)转换为字符串时出现以下错误。当我从切换到 这是日志 和 我阅读了迁移,并使用load而不是loadNonSeq,因为现在PDFBox在内部处理这个问题。 关于如何修复这些错误的任何建议。 编辑错误#1错误#2 编辑#2@tilmanhausher我检查了你的理论。我用Supreme打开了文件,删除了开头的多余空格并保存了下来。我犯了以下错误 为了验证你的理论,我在Subl