Manchmal braucht man in automatisch generierten PDFs eine Überschrift auf jeder Seite.
Wie geht das mit iText 7?
Mit einen implementierten IEventHandler. Der dann nach jeder erzeugten Seite PdfDocumentEvent.START_PAGE einen Event generiert, der dann die Überschrift erzeugt. Dazu habe ich eine Klass HeaderHandler entwickelt. Es kann als Option auch entschieden werden ob auch auf der ersten Seite einen Überschrift erzeugt werden soll. Hier die Klasse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
package de.wenzlaff.beispiel; import java.io.IOException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.itextpdf.io.font.constants.StandardFonts; import com.itextpdf.kernel.events.Event; import com.itextpdf.kernel.events.IEventHandler; import com.itextpdf.kernel.events.PdfDocumentEvent; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; /** * Ein Überschriften Handler mit Seitenzahl und optionale anzeige ob die * Überschrift auch auf der ersten Seite angezeigt werden soll oder nicht. * * @author Thomas Wenzlaff (www.wenzlaff.info) */ public class HeaderHandler implements IEventHandler { private static final Logger LOG = LogManager.getLogger(HeaderHandler.class); private PdfFont timesRomanFont; /** * Flag das anzeigt ob der Headera auch auf der Ersten Seite angezeigt werden * soll. * * true = auch auf der erster Seite ein Header * * false = auf der ersten Seite kein Header */ private boolean headerErsteSeite; /** * Zb. "Plan Seite %d" wobei %d für die Nummer steht. */ private String ueberschrift; /** * Mit Header und auf der ersten Seite kein Header. * * Im Header String kann ein %d für die aktuelle Seitenzahl angegeben werden. * * @param ueberschrift * @throws IOException */ public HeaderHandler(String ueberschrift) throws IOException { this.ueberschrift = ueberschrift; timesRomanFont = PdfFontFactory.createFont(StandardFonts.TIMES_ROMAN); } public HeaderHandler(String ueberschrift, boolean headerErsteSeite) throws IOException { this(ueberschrift); this.headerErsteSeite = headerErsteSeite; } @Override public void handleEvent(Event event) { PdfDocumentEvent docEvent = (PdfDocumentEvent) event; PdfDocument pdfDoc = docEvent.getDocument(); PdfPage page = docEvent.getPage(); Rectangle pageSize = page.getPageSize(); int pageNumber = pdfDoc.getPageNumber(page); LOG.debug("Überschrift auf Seite " + pageNumber + " ergänzen"); if (!headerErsteSeite) { if (pageNumber == 1) { return; // wenn auf der ersten Seite kein Header gewünscht wird } } PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc); pdfCanvas.beginText().setFontAndSize(timesRomanFont, 9).moveText(pageSize.getWidth() / 2 - 30, pageSize.getTop() - 20) .showText(String.format(ueberschrift, pageNumber)).endText(); pdfCanvas.release(); } } |
Der Handler wird dann wie folgt aufgerufen:
1 2 3 4 5 6 7 8 9 |
public static void printPdfDokument(List<Plan> ganzerPlan, String dateiname) throws IOException { PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dateiname)); HeaderHandler headerHandler = new HeaderHandler("Plan Seite %d", true); pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, headerHandler); try (Document doc = new Document(pdfDoc, PageSize.A4)) { ... |