package com.brightgenerous.pdfbox.writer.appender; import java.awt.print.PrinterException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.pdfbox.Overlay; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageable; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; class CompositePageAppender extends PageAppender { private final List<PageAppender> delegs; public CompositePageAppender(List<PageAppender> delegs) { super(AppenderFlag.BOTH); this.delegs = (delegs == null) ? new ArrayList<PageAppender>() : delegs; } public CompositePageAppender(PageAppender... delegs) { this(Arrays.asList(delegs)); } public CompositePageAppender add(PageAppender deleg, PageAppender... delegs) { this.delegs.add(deleg); for (PageAppender d : delegs) { this.delegs.add(d); } return this; } public CompositePageAppender clear() { delegs.clear(); return this; } @Override public PDDocument append(int start, PDDocument document) throws IOException { PDPageable pageable; try { pageable = new PDPageable(document); } catch (IllegalArgumentException | PrinterException e) { throw new IOException(e); } int pages = pageable.getNumberOfPages(); if (0 < pages) { PDDocument overDoc = new PDDocument(); PDDocument underDoc = new PDDocument(); for (int i = 0; i < pages; i++) { int page = i + 1; PDPageContentStream overStream; { PDPage overPage = new PDPage(); overDoc.addPage(overPage); overStream = new PDPageContentStream(overDoc, overPage, true, true); } PDPageContentStream underStream; { PDPage underPage = new PDPage(); underDoc.addPage(underPage); underStream = new PDPageContentStream(underDoc, underPage, true, true); } PDRectangle rect; { PDPage pdPage = (PDPage) document.getDocumentCatalog().getAllPages().get(i); rect = pdPage.getMediaBox(); } for (PageAppender deleg : delegs) { deleg.appendUnderContent(start, pages, page, underStream, rect); deleg.appendOverContent(start, pages, page, overStream, rect); } underStream.close(); overStream.close(); } { Overlay overlay = new Overlay(); document = overlay.overlay(document, underDoc); } { Overlay overlay = new Overlay(); document = overlay.overlay(overDoc, document); } } return document; } @Override protected void appendContent(int start, int pages, int page, PDPageContentStream contentStream, PDRectangle rect) throws IOException { throw new UnsupportedOperationException(); } }