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

Java 使用PDFBox 2.X在所有页面的特定位置覆盖所有页面上的PDF,java,pdf,java-8,pdfbox,Java,Pdf,Java 8,Pdfbox,我试图将PDF覆盖在PDF中所有页面的顶部,每个页面的左上方。不同尺寸的PDF。PDF覆盖是一个固定大小,比PDF的所有页面都小 我只能看到PDFBOX把PDF覆盖在PDF的中间。 我不希望将PDF覆盖转换为位图(PDImageXObject)并将其插入页面。下面是我正在玩的一些粗略代码:- public static void main(String[] args) throws Exception { String overlayPath = "C:\\OverlayPdf.pdf"

我试图将PDF覆盖在PDF中所有页面的顶部,每个页面的左上方。不同尺寸的PDF。PDF覆盖是一个固定大小,比PDF的所有页面都小

我只能看到PDFBOX把PDF覆盖在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();
}
publicstaticvoidmain(字符串[]args)引发异常{
字符串overlayPath=“C:\\OverlayPdf.pdf”;
String overlaymepath=“C:\\ToBeOverlayedOn.pdf”;
PDDocument overlionme=PDDocument.load(新文件(overlionmepath));//要写入的文档。
overlayPath=overlayPath+“Anno.pdf”;
HashMap overlayGuide=新HashMap();
for(int i=0;i
我的直觉是它是一个仿射变换,但我也不能让它工作。

我创建了一个新的,它允许通过一个变换,这将在2.0.10或更高版本中。这将通过扩展overlay类在
CalculateAffinetTransform
中完成。要将戳记放在左上角,新方法如下所示:

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

stampPath+“Anno.pdf”将意味着路径是“代码> C:\PDF2\NUBSTA.PDFANNO.PDF”。“我似乎只能得到PDFBOX把PDF框放在PDF的中间。”——是的,内部帮助方法>代码>覆盖。CurrestOffLayStase自动覆盖覆盖。不幸的是,它是一种
私有
方法,不允许在此进行微调。因此,您可以使用页面大小覆盖图,实际戳记在左上角(这在您的情况下很困难,因为将“戳记”的PDF具有不同的大小)或者您创建一个
Overlay
类的副本,并相应地更改
Overlay.createOverlayStream
。@tilmahausher虽然可以理解
Overlay.createOverlayStream
是私有的,但覆盖位置的计算(甚至整个仿射变换,以允许旋转等)应该委托给某个受保护的或公共的方法(可以重写)或某个覆盖位置策略对象(可以注入)。@mkl你说得对。今晚我会创造一个问题。创建。我假设正确的y变换是(dest的垂直大小-覆盖的垂直大小)。(y=0为底部)对不起,我花了一些时间才回到这个问题上。完美的解决方案。再次感谢所有人,尤其是蒂尔曼·豪瑟。对于发行相同邮票的人,我创建了与每页大小相匹配的邮票版本,然后使用上面的仿射变换将其放置在每页的左上角。真是太棒了!