使用PDFBox 2.X在所有页面上的特定位置覆盖所有页面上的PDF

时间:2018-03-17 16:13:11

标签: java pdf java-8 pdfbox

我正在尝试在PDF的所有页面的顶部叠加PDF,位于每个页面的左上角。 PDF将具有不同的大小。 PDF叠加层是一个恒定的大小,小于PDF的所有页面。

我似乎只能让PDFBox将叠加层放在PDF的中间。

我不希望将PDF叠加转换为位图(PDImageXObject)并将其插入到页面上。这是我正在玩的一些粗略的代码: -

public static void main(String[] args) throws Exception {
    String overlayPath = "C:\\OverlayPdf.pdf";
    String overlayOnMePath = "C:\\ToBeOverlayedOn.pdf";       
    PDDocument overlayOnMe = PDDocument.load(new File(overlayOnMePath)); //Document to write to.
    overlayPath = overlayPath + "Anno.pdf";

    HashMap<Integer, String> overlayGuide = new HashMap<>();
    for (int i = 0; i < overlayOnMe.getNumberOfPages(); i++) {
        overlayGuide.put(i + 1, overlayPath);
    }
    Overlay overlay = new Overlay();
    overlay.setInputPDF(overlayOnMe);
    overlay.setOverlayPosition(Overlay.Position.FOREGROUND);
    overlay.overlay(overlayGuide);

    overlayOnMe.save(new File(overlayOnMePath + "_OVERLAYED.pdf"));
    overlay.close();
}

我的直觉是它的仿射转变,但我也无法做到这一点。

1 个答案:

答案 0 :(得分:2)

我创建了一个新的issue并允许传递转换,这将是2.0.10或更高版本。这将通过扩展覆盖类在calculateAffineTransform中完成。要将标记放在左上角,新方法将如下所示:

protected AffineTransform calculateAffineTransform(PDPage page, PDRectangle overlayMediaBox)
{
    AffineTransform at = new AffineTransform();
    PDRectangle pageMediaBox = page.getMediaBox();
    at.translate(0, pageMediaBox.getHeight() - overlayMediaBox.getHeight());
    return at;
}

要在2.0.10发布之前使用它,请自行构建2.0分支或在此处获取快照: https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/2.0.10-SNAPSHOT/ 该更改是从21.3.2018或更晚的任何版本。