使用PDFBox实现仅指定页面叠加PDF模板的问题求助
问题原因
你调用了setAllPagesOverlayPDF(overlayDoc),这个方法会给所有未在映射表中指定的页面设置默认叠加模板,所以第3、4页也被应用了template.pdf。
解决方案
移除setAllPagesOverlayPDF调用,只保留映射表中第1、2页的叠加规则,这样未指定的页面会保持原内容不变。同时可以优化代码,直接使用已加载的PDDocument对象而非重复读取文件路径:
void overlayPDF(){ try { PDDocument overlayDoc = PDDocument.load(new File("D:\\template.pdf")); Overlay overlayObj = new Overlay(); PDDocument originalDoc = PDDocument.load(new File("D:\\Sample.pdf")); overlayObj.setOverlayPosition(Overlay.Position.BACKGROUND); overlayObj.setInputPDF(originalDoc); // 使用已加载的PDDocument对象构建映射表,避免重复读取文件 Map<Integer, PDDocument> ovmap = new HashMap<>(); ovmap.put(1, overlayDoc); ovmap.put(2, overlayDoc); overlayObj.overlay(ovmap); originalDoc.save("D:\\Sample.pdf"); overlayDoc.close(); originalDoc.close(); } catch(Exception e) { e.printStackTrace(); } }
Overlay方法工作机制说明
- 当调用
overlay(Map)时,映射表中的键是原PDF的页码(1-based),值是要叠加的PDF文档或文件路径。 - 只有映射表中明确指定的页码会被叠加对应的模板。
- 如果调用了
setAllPagesOverlayPDF,所有未在映射表中的页码会自动使用这个默认模板;如果不调用该方法,未指定的页码将保留原内容。
内容的提问来源于stack exchange,提问作者Janvi Kadu
相关产品推荐
相关产品推荐

