package com.brightgenerous.pdfbox.writer.appender;
import java.awt.print.PrinterException;
import java.io.IOException;
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;
import com.brightgenerous.pdfbox.writer.IPagesAppender;
public abstract class PagesAppender implements IPagesAppender {
private final AppenderFlag flag;
public PagesAppender(AppenderFlag flag) {
if (flag == null) {
throw new IllegalArgumentException("The flag must not be null.");
}
this.flag = flag;
}
@Override
public PDDocument append(int end, 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();
}
appendUnderContent(end, start, pages, page, underStream, rect);
appendOverContent(end, 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;
}
protected void appendUnderContent(int end, int start, int pages, int page,
PDPageContentStream contentStream, PDRectangle rect) throws IOException {
AppenderFlag flag = getFlag();
if (flag.equals(AppenderFlag.UNDER) || flag.equals(AppenderFlag.BOTH)) {
appendContent(end, start, pages, page, contentStream, rect);
}
}
protected void appendOverContent(int end, int start, int pages, int page,
PDPageContentStream contentStream, PDRectangle rect) throws IOException {
AppenderFlag flag = getFlag();
if (flag.equals(AppenderFlag.OVER) || flag.equals(AppenderFlag.BOTH)) {
appendContent(end, start, pages, page, contentStream, rect);
}
}
protected abstract void appendContent(int end, int start, int pages, int page,
PDPageContentStream contentStream, PDRectangle rect) throws IOException;
protected AppenderFlag getFlag() {
return flag;
}
}