{"id":16058,"date":"2020-12-27T07:50:08","date_gmt":"2020-12-27T06:50:08","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=16058"},"modified":"2020-12-27T07:50:33","modified_gmt":"2020-12-27T06:50:33","slug":"impfbeginn-in-deutschland-mal-was-anderes-wie-koennen-header-in-pdf-dokumente-mit-itext-7-1-autom-auf-jede-seite-erzeugt-werden","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=16058","title":{"rendered":"Impfbeginn in Deutschland &#8211; Mal was anderes: Wie k\u00f6nnen Header in PDF Dokumente mit iText 7.1 autom. auf jede Seite erzeugt werden?"},"content":{"rendered":"<p>Manchmal braucht man in automatisch generierten PDFs eine \u00dcberschrift auf jeder Seite.<br \/>\n<a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-scaled.jpg\" alt=\"Gesund oder Krank - Impfbeginn in Deutschland\" width=\"2560\" height=\"1919\" class=\"aligncenter size-full wp-image-16059\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-scaled.jpg 2560w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-300x225.jpg 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-1024x768.jpg 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-768x576.jpg 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-1536x1151.jpg 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/12\/Gesund-Spritze-2048x1535.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Wie geht das mit iText 7? <\/p>\n<p>Mit einen implementierten <strong>IEventHandler<\/strong>. Der dann nach jeder erzeugten Seite <strong>PdfDocumentEvent.START_PAGE<\/strong> einen Event generiert, der dann die \u00dcberschrift erzeugt. Dazu habe ich eine Klass <strong>HeaderHandler<\/strong> entwickelt. Es kann als Option auch entschieden werden ob auch auf der ersten Seite einen \u00dcberschrift erzeugt werden soll. Hier die Klasse:<br \/>\n<!--more--><\/p>\n<pre class=\"lang:java decode:true \" >\r\n\r\npackage de.wenzlaff.beispiel;\r\n\r\nimport java.io.IOException;\r\n\r\nimport org.apache.logging.log4j.LogManager;\r\nimport org.apache.logging.log4j.Logger;\r\n\r\nimport com.itextpdf.io.font.constants.StandardFonts;\r\nimport com.itextpdf.kernel.events.Event;\r\nimport com.itextpdf.kernel.events.IEventHandler;\r\nimport com.itextpdf.kernel.events.PdfDocumentEvent;\r\nimport com.itextpdf.kernel.font.PdfFont;\r\nimport com.itextpdf.kernel.font.PdfFontFactory;\r\nimport com.itextpdf.kernel.geom.Rectangle;\r\nimport com.itextpdf.kernel.pdf.PdfDocument;\r\nimport com.itextpdf.kernel.pdf.PdfPage;\r\nimport com.itextpdf.kernel.pdf.canvas.PdfCanvas;\r\n\r\n\/**\r\n * Ein \u00dcberschriften Handler mit Seitenzahl und optionale anzeige ob die\r\n * \u00dcberschrift auch auf der ersten Seite angezeigt werden soll oder nicht.\r\n * \r\n * @author Thomas Wenzlaff (www.wenzlaff.info)\r\n *\/\r\npublic class HeaderHandler implements IEventHandler {\r\n\r\n\tprivate static final Logger LOG = LogManager.getLogger(HeaderHandler.class);\r\n\r\n\tprivate PdfFont timesRomanFont;\r\n\r\n\t\/**\r\n\t * Flag das anzeigt ob der Headera auch auf der Ersten Seite angezeigt werden\r\n\t * soll.\r\n\t * \r\n\t * true = auch auf der erster Seite ein Header\r\n\t * \r\n\t * false = auf der ersten Seite kein Header\r\n\t *\/\r\n\tprivate boolean headerErsteSeite;\r\n\r\n\t\/**\r\n\t * Zb. \"Plan Seite %d\" wobei %d f\u00fcr die Nummer steht.\r\n\t *\/\r\n\tprivate String ueberschrift;\r\n\r\n\t\/**\r\n\t * Mit Header und auf der ersten Seite kein Header.\r\n\t * \r\n\t * Im Header String kann ein %d f\u00fcr die aktuelle Seitenzahl angegeben werden.\r\n\t * \r\n\t * @param ueberschrift\r\n\t * @throws IOException\r\n\t *\/\r\n\tpublic HeaderHandler(String ueberschrift) throws IOException {\r\n\t\tthis.ueberschrift = ueberschrift;\r\n\t\ttimesRomanFont = PdfFontFactory.createFont(StandardFonts.TIMES_ROMAN);\r\n\t}\r\n\r\n\tpublic HeaderHandler(String ueberschrift, boolean headerErsteSeite) throws IOException {\r\n\t\tthis(ueberschrift);\r\n\t\tthis.headerErsteSeite = headerErsteSeite;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void handleEvent(Event event) {\r\n\t\tPdfDocumentEvent docEvent = (PdfDocumentEvent) event;\r\n\t\tPdfDocument pdfDoc = docEvent.getDocument();\r\n\t\tPdfPage page = docEvent.getPage();\r\n\t\tRectangle pageSize = page.getPageSize();\r\n\t\tint pageNumber = pdfDoc.getPageNumber(page);\r\n\t\tLOG.debug(\"\u00dcberschrift auf Seite \" + pageNumber + \" erg\u00e4nzen\");\r\n\t\tif (!headerErsteSeite) {\r\n\t\t\tif (pageNumber == 1) {\r\n\t\t\t\treturn; \/\/ wenn auf der ersten Seite kein Header gew\u00fcnscht wird\r\n\t\t\t}\r\n\t\t}\r\n\t\tPdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);\r\n\r\n\t\tpdfCanvas.beginText().setFontAndSize(timesRomanFont, 9).moveText(pageSize.getWidth() \/ 2 - 30, pageSize.getTop() - 20)\r\n\t\t\t\t.showText(String.format(ueberschrift, pageNumber)).endText();\r\n\t\tpdfCanvas.release();\r\n\t}\r\n}<\/pre>\n<p>Der Handler wird dann wie folgt aufgerufen:<\/p>\n<pre class=\"lang:java decode:true \" >\r\n\r\npublic static void printPdfDokument(List&lt;Plan&gt; ganzerPlan, String dateiname) throws IOException {\r\n\r\n\t\tPdfDocument pdfDoc = new PdfDocument(new PdfWriter(dateiname));\r\n\r\n\t\tHeaderHandler headerHandler = new HeaderHandler(\"Plan Seite %d\", true);\r\n\t\tpdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);\r\n\r\n\t\ttry (Document doc = new Document(pdfDoc, PageSize.A4)) {\r\n...\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Manchmal braucht man in automatisch generierten PDFs eine \u00dcberschrift 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 \u00dcberschrift erzeugt. Dazu habe ich eine Klass HeaderHandler entwickelt. Es kann als Option auch entschieden werden ob auch auf der &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=16058\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eImpfbeginn in Deutschland &#8211; Mal was anderes: Wie k\u00f6nnen Header in PDF Dokumente mit iText 7.1 autom. auf jede Seite erzeugt werden?\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,5,79,7],"tags":[4172,4169,4168,2684,4170,2178,2309,4171],"class_list":["post-16058","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java","category-programmierung","category-tools","tag-header-in-pdf","tag-impfbeginn","tag-impfen","tag-itext","tag-itext-7","tag-java","tag-pdf","tag-pdf-ueberschriften"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/16058","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16058"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/16058\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16058"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}