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

pdfbox无法正确呈现修改后的pdf文件

归松
2023-03-14

我正在使用"pdfbox-app-2.0.0-RC2.jar"

我创建了一个类,它缩小了pdf内容,并在指定的坐标处创建了带有此内容的新pdf。

我的问题是,如果一个pdf文件被修改并添加了新内容,那么缩小后的文件中就会缺少这些内容。

以下是我的方法:

public static String scaleInputPdf(String sourceFileName, float xpos,
        float ypos, float imgCtrlWidth, float imgCtrlHeight,
        PDRectangle pageSize) throws IOException {

    String workdir = "/tmp";

    File tmpDir = new File(workdir);
    if(! tmpDir.exists()) {
        tmpDir.mkdir();
    }

    String destPath = workdir + "/Result.pdf";

    PDDocument sourceDoc = null;
    try {
        // load the source PDF
        sourceDoc = PDDocument.load(new File(sourceFileName));

        // create a new PDF and add a blank page
        PDDocument doc = new PDDocument();

        for (int sourcePageNo = 0; sourcePageNo < sourceDoc
                .getNumberOfPages(); sourcePageNo++) {

            PDPage page = new PDPage();
            page.setMediaBox(pageSize);

            doc.addPage(page);

            PDPage currentSourcePage = sourceDoc.getPage(sourcePageNo);

            PDPageContentStream contents = new PDPageContentStream(doc,
                    page, true, true, true);

            float scaleFactor = getScalingFactor(currentSourcePage,
                    imgCtrlWidth, imgCtrlHeight, pageSize);

            PDFormXObject form = null;

            // Create a Form XObject from the source document using
            // LayerUtility
            LayerUtility layerUtility = new LayerUtility(doc);
            form = layerUtility.importPageAsForm(sourceDoc,
                    sourcePageNo);

            // draw a scaled form
            contents.saveGraphicsState();

            Matrix scalingMatrix = Matrix.getScaleInstance(scaleFactor,
                    scaleFactor);
            contents.transform(scalingMatrix);

            Matrix translatingMatrix = Matrix.getTranslateInstance(
                    xpos,
                    getYPosition(currentSourcePage, pageSize, ypos,
                            scaleFactor));
            contents.transform(translatingMatrix);

            contents.drawForm(form);

            contents.restoreGraphicsState();
            contents.close();

        }
        doc.save(destPath);
        doc.close();

    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        if (sourceDoc != null) {
            sourceDoc.close();

        }
    }
    System.err.println("Done! /n file is at following location=" +destPath);
    return destPath;

}

private static float getScalingFactor(PDPage sourcePage,
        float imgCtrlWidth, float imgCtrlHeight, PDRectangle pageSize) {

    PDRectangle imageSize = sourcePage.getMediaBox();

    if (imageSize.getHeight() > 792) {

        if (pageSize.equals(PDRectangle.LETTER)) {
            imgCtrlWidth = 838.8f; // 932 * 0.90
            imgCtrlHeight = 1018f; // 1132 *0.90
        } else if (pageSize.equals(PDRectangle.A4)) {
            imgCtrlWidth = 819f; // 910 * 0.90
            imgCtrlHeight = 972f; // 1080 * 0.90
        }
    }

    float scaleX = imgCtrlWidth / imageSize.getWidth();

    float scaleY = imgCtrlHeight / imageSize.getHeight();

    float scaleFactor = ((scaleX < scaleY) ? scaleX : scaleY);

    if (imageSize.getHeight() > 792 && scaleFactor > 0.88) {
        scaleFactor = 0.88f;
    }

    return scaleFactor;
}

private static float getYPosition(PDPage sourcePage,
        PDRectangle finalDocPageSize, float yMarginPos, float scaleFactor) {

    float yPos = yMarginPos;

    float imgHeight = sourcePage.getMediaBox().getHeight();

    PDRectangle cropBox = sourcePage.getCropBox();

    if (imgHeight > 792) {

        if (cropBox.getLowerLeftY() != 0) {

            yPos = cropBox.getLowerLeftY() + 40;
        }

    } else {

        yPos = (finalDocPageSize.getHeight() - (imgHeight * scaleFactor + yMarginPos));
    }

    return yPos;
}
}

共有1个答案

海宁
2023-03-14

添加了以下代码,以便在新页面上显示带有调整大小值的注释:

列表anotn=currentSourcePage。getAnnotations();

            for(PDAnnotation an :anotn) {
                PDRectangle rec = an.getRectangle();

                PDRectangle currentSourcePageMBox = currentSourcePage.getMediaBox();

                boolean isLandscape = currentSourcePageMBox.getWidth() > currentSourcePageMBox.getHeight();

                if(isLandscape) {

                    rec.setLowerLeftY(((rec.getLowerLeftY()) * scaleFactor) + 180 + 2 * ypos);
                    rec.setUpperRightY(((rec.getUpperRightY()) * scaleFactor) + 180 + 2*ypos);
                }
                else {
                    rec.setLowerLeftY(((rec.getLowerLeftY()) * scaleFactor) +  ypos);
                    rec.setUpperRightY(((rec.getUpperRightY()) * scaleFactor) +  ypos);
                }

                rec.setLowerLeftX((rec.getLowerLeftX() + xpos) * scaleFactor);
                rec.setUpperRightX((rec.getUpperRightX() + xpos ) * scaleFactor);                   

                an.setRectangle(rec);
            }

            // get all annotations and set on the new page.
            page.setAnnotations(currentSourcePage.getAnnotations());
 类似资料:
  • 我正在尝试一个用户界面3.5,所有组件都工作正常,除了selectonemenu,它不能正确渲染。 它的文本字段在选择任何下拉字段时不显示。 我不能发布图片,因为我没有那么多的声誉 代码 屏幕拍摄 我怎样才能解决这个问题?

  • Localhost很好,但上传到服务器时不工作 %pdf-1.3 1 0 obj<>Endobj2 0 obj<>Endobj3 0 obj<>>/Mediabox[0.000 0.000 595.280 841.890]>>Endobj4 0 obj<>stream x 2 300 p@&b m-l l,br b 5 jr k drr f b k endstream endobj 8 0 obj

  • 问题内容: 我正在使用 JSF 2.1.8 实现Web应用程序,而 ui:include 标记存在问题。我有这个代码 该 navigationManagerSystem bean是JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容。如果我以这样的常量执行此操作,则包括这些工作,但是如果我将其放入变量中则不行,即使我已经看到变量在屏幕打印之前就保持了该值。我不知道它是否可以与包含/sy

  • 我使用docx4j创建pdf文件,使用docx格式可以正确呈现语言环境,但使用pdf#替换为语言环境字符串。 在我看到的文件中 当使用docx4j创建PDF时,它只能使用可用的字体。这些字体有两种来源: - - 请注意,Word会自动执行字体替换。当您在Word中打开现有文档并选择特定字体的文本时,如果您的计算机上没有安装该字体或该字体没有嵌入到文档中,则您在屏幕上看到的实际字体将不是功能区中报告

  • 问题内容: 由于某种原因,onPageFinished在WebView完成加载之前就触发了-我不知道为什么… 好的,看来这不是固定的。我认为加载页面时出现了竞争情况,但是无法获得可复制的行为。 我将网页的HTML内容存储在SQLite数据库中,以便离线查看。我使用以下命令将内容重新加载到WebView中: 似乎有时在加载WebView时,它会正确触发WebViewClient.onPageFini

  • 我正在使用OpenApi和Swagger构建一些文档,但由于js错误,我无法对其进行测试。 我想定义一个将接受特定值的参数,因此我在属性中添加了。我在请求中定义参数,如下所示 开发工具