Java 使用PDFBox 2.X在所有页面的特定位置覆盖所有页面上的PDF
我试图将PDF覆盖在PDF中所有页面的顶部,每个页面的左上方。不同尺寸的PDF。PDF覆盖是一个固定大小,比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"
我只能看到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为底部)对不起,我花了一些时间才回到这个问题上。完美的解决方案。再次感谢所有人,尤其是蒂尔曼·豪瑟。对于发行相同邮票的人,我创建了与每页大小相匹配的邮票版本,然后使用上面的仿射变换将其放置在每页的左上角。真是太棒了!