Skip to content

3 handle current page total page on header footer #4

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.2.0-sa.1] - 2023-11-17
### Added

- document metadata handling (doc-title, doc-author, doc-language, doc-subject, doc-creator)

### Changed

- fj-doc version set to 3.2.0
- openpdf version 1.3.33
- fj-doc version set to 3.1.3

## [1.1.0-sa.1] - 2023-09-16

Expand Down
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
<parent>
<groupId>org.fugerit.java</groupId>
<artifactId>fj-doc</artifactId>
<version>3.2.0</version>
<version>3.1.3</version>
<relativePath></relativePath>
</parent>

<name>fj-doc-mod-openpdf</name>
<description>Fugerit DOC module for output in PDF, RTF and HTML using OpenPDF (Itext fork)</description>
<version>1.2.0-sa.1</version>
<version>1.2.0-SNAPSHOT</version>

<licenses>
<license>
Expand All @@ -25,7 +25,7 @@

<properties>
<fj-doc-version>${project.parent.version}</fj-doc-version>
<openpdf-version-version>1.3.33</openpdf-version-version>
<openpdf-version-version>1.3.30</openpdf-version-version>
<openrtf-version-version>1.2.1</openrtf-version-version>
</properties>

Expand Down
20 changes: 6 additions & 14 deletions src/main/java/org/fugerit/java/doc/mod/openpdf/PdfTypeHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.fugerit.java.doc.base.config.DocTypeHandler;
import org.fugerit.java.doc.base.config.DocTypeHandlerDefault;
import org.fugerit.java.doc.base.model.DocBase;
import org.fugerit.java.doc.mod.openpdf.events.PageNumbersEventHandler;
import org.fugerit.java.doc.mod.openpdf.helpers.OpenPpfDocHandler;

import com.lowagie.text.Document;
Expand All @@ -16,13 +17,14 @@

public class PdfTypeHandler extends DocTypeHandlerDefault {

/**
*
*/
private static final long serialVersionUID = 5459938865782356227L;

public static final DocTypeHandler HANDLER = new PdfTypeHandler();

/*
* OpenPDF examples : https://github.com/LibrePDF/OpenPDF/tree/master/pdf-toolbox/src/test/java/com/lowagie/examples
*/

public PdfTypeHandler() {
super( OpenPpfDocHandler.DOC_OUTPUT_PDF, OpenPpfDocHandler.MODULE );
}
Expand All @@ -42,17 +44,7 @@ public void handle(DocInput docInput, DocOutput docOutput) throws Exception {
PdfWriter pdfWriter = PdfWriter.getInstance( document, baos );
// create doc handler
OpenPpfDocHandler handler = new OpenPpfDocHandler( document, pdfWriter );
if ( "true".equalsIgnoreCase( docBase.getInfo().getProperty( "set-total-page" ) ) ) {
handler.handleDoc( docBase );
int totalPageCount = pdfWriter.getCurrentPageNumber()-1;
document = new Document( PageSize.A4, Integer.parseInt( margins[0] ),
Integer.parseInt( margins[1] ),
Integer.parseInt( margins[2] ),
Integer.parseInt( margins[3] ) );
baos = new ByteArrayOutputStream();
pdfWriter = PdfWriter.getInstance( document, baos );
handler = new OpenPpfDocHandler(document, pdfWriter, totalPageCount );
}
//pdfWriter.setPageEvent( new PageNumbersEventHandler( docBase ) );
handler.handleDoc( docBase );
baos.writeTo( outputStream );
baos.close();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package org.fugerit.java.doc.mod.openpdf.events;

import org.fugerit.java.core.function.SafeFunction;
import org.fugerit.java.doc.base.model.DocBase;
import org.fugerit.java.doc.base.model.DocElement;
import org.fugerit.java.doc.base.model.DocPara;
import org.fugerit.java.doc.base.model.DocPhrase;
import org.fugerit.java.doc.mod.openpdf.helpers.PageNumberHelper;

import com.lowagie.text.Document;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;

import lombok.Getter;

/**
* <p>
* Event Helper for ${currentPage} and ${pageCount} properties
* </p>
*
* <p>
* Adapted from :
* https://github.com/LibrePDF/OpenPDF/blob/master/pdf-toolbox/src/test/java/com/lowagie/examples/directcontent/pageevents/PageNumbersWatermark.java
* </p>
*
*/
public class PageNumbersEventHandler extends PdfPageEventHelper {

public PageNumbersEventHandler(DocBase docBase) {
super();
this.pageNumberHeader = PageNumberHelper.findPageNumberElement(docBase.getDocHeader());
this.pageNumberFooter = PageNumberHelper.findPageNumberElement(docBase.getDocFooter());
}

/** A template that will hold the total number of pages. */
private PdfTemplate tpl;

/** The font that will be used. */
private BaseFont helv;

private DocElement pageNumberHeader;

private DocElement pageNumberFooter;

@Override
public void onOpenDocument(PdfWriter writer, Document document) {
if (this.pageNumberFooter != null || this.pageNumberHeader != null) {
SafeFunction.apply(() -> {
// initialization of the template
tpl = writer.getDirectContent().createTemplate(100, 100);
tpl.setBoundingBox(new Rectangle(-20, -20, 100, 100));
// initialization of the font
helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false);
});
}
}

private void headerFooterHelper(PdfWriter writer, Document document, DocElement element, boolean header) {
if (element!= null) {
ElementData data = new ElementData( element );
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
String text = data.parseText( writer.getPageNumber() );
float textSize = helv.getWidthPoint(text, 12);
float textBase = document.bottom() - 20;
if ( header ) {
textBase = document.top() - 20;
}
float align = document.left();
float templateAlign = align + textSize;
if ( data.getAlign() == DocPara.ALIGN_RIGHT ) {
templateAlign = document.right();
align = templateAlign - textSize;
} else if ( data.getAlign() == DocPara.ALIGN_CENTER ) {
align = (document.right()-document.left()-textSize)/2;
templateAlign = align+textSize;
}
cb.beginText();
cb.setFontAndSize(helv, 12);
cb.setTextMatrix(align, textBase);
cb.showText(text);
cb.endText();
cb.addTemplate(tpl, templateAlign, textBase);
cb.restoreState();
cb.sanityCheck();
}
}

@Override
public void onStartPage(PdfWriter writer, Document document) {
this.headerFooterHelper(writer, document, this.pageNumberHeader, true);
}

@Override
public void onEndPage(PdfWriter writer, Document document) {
this.headerFooterHelper(writer, document, this.pageNumberFooter, false);
}

@Override
public void onCloseDocument(PdfWriter writer, Document document) {
if (this.pageNumberFooter != null || this.pageNumberHeader != null) {
tpl.beginText();
tpl.setFontAndSize(helv, 12);
tpl.setTextMatrix(0, 0);
tpl.showText(Integer.toString(writer.getPageNumber() - 1));
tpl.endText();
tpl.sanityCheck();
}
}

}

class ElementData {

@Getter private int align;

@Getter private String text;

public ElementData( DocElement element ) {
if ( element instanceof DocPhrase ) {
DocPhrase e = (DocPhrase)element;
this.align = DocPara.ALIGN_CENTER;
this.text = e.getText();
} else if ( element instanceof DocPara ) {
DocPara e = (DocPara)element;
this.align = e.getAlign();
this.text = e.getText();
}
}

public String parseText( int pageNumber ) {
return this.getText().replace( PageNumberHelper.CURRENT_PAGE , String.valueOf(pageNumber) ).replace( PageNumberHelper.PAGE_COUNT , "" );
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.function.Consumer;

import org.fugerit.java.core.cfg.ConfigRuntimeException;
import org.fugerit.java.core.lang.helpers.StringUtils;
Expand All @@ -28,6 +29,7 @@
import org.fugerit.java.doc.base.model.DocPhrase;
import org.fugerit.java.doc.base.model.DocStyle;
import org.fugerit.java.doc.base.model.DocTable;
import org.fugerit.java.doc.base.typehelper.generic.GenericConsts;
import org.fugerit.java.doc.base.xml.DocModelUtils;

import com.lowagie.text.Anchor;
Expand Down Expand Up @@ -345,12 +347,25 @@ private void handleFooter( DocBase docBase, PdfHelper pdfHelper, OpenPdfHelper d
}
}

private void applyIfNotEmpty( String value, Consumer<String> c ) {
if ( StringUtils.isNotEmpty( value ) ) {
c.accept(value);
}
}

/* (non-Javadoc)
* @see org.fugerit.java.doc.base.DocHandler#handleDoc(org.fugerit.java.doc.base.DocBase)
*/
public void handleDoc(DocBase docBase) throws DocumentException, IOException {
Properties info = docBase.getInfo();

// set document metadata
applyIfNotEmpty( docBase.getStableInfo().getProperty( GenericConsts.INFO_KEY_DOC_TITLE ) , s -> this.document.addTitle( s ) );
applyIfNotEmpty( docBase.getStableInfo().getProperty( GenericConsts.INFO_KEY_DOC_AUTHOR ) , s -> this.document.addAuthor( s ) );
applyIfNotEmpty( docBase.getStableInfo().getProperty( GenericConsts.INFO_KEY_DOC_SUBJECT ) , s -> this.document.addSubject( s ) );
applyIfNotEmpty( docBase.getStableInfo().getProperty( GenericConsts.INFO_KEY_DOC_CREATOR ) , s -> this.document.addCreator( s ) );
applyIfNotEmpty( docBase.getStableInfo().getProperty( GenericConsts.INFO_KEY_DOC_LANGUAGE ) , s -> this.document.setDocumentLanguage( s ) );

String defaultFontName = info.getProperty( DOC_DEFAULT_FONT_NAME, "helvetica" );
String defaultFontSize = info.getProperty( DOC_DEFAULT_FONT_SIZE, "10" );
String defaultFontStyle = info.getProperty( DOC_DEFAULT_FONT_STYLE, "normal" );
Expand Down Expand Up @@ -430,17 +445,9 @@ public static Element getElement( Document document, DocElement docElement, bool
return result;
}

private void handleHeaderFooterElement( DocElement docElement, float leading, OpenPdfHelper docHelper , Phrase phrase ) throws DocumentException, IOException {
if ( docElement instanceof DocPhrase ) {
DocPhrase docPhrase = (DocPhrase) docElement;
Chunk ck = createChunk( docPhrase, docHelper );
if( docPhrase.getLeading() != null && docPhrase.getLeading().floatValue() != leading ) {
leading = docPhrase.getLeading().floatValue();
phrase.setLeading( leading );
}
phrase.add( ck );
} else if ( docElement instanceof DocPara ) {
DocPara docPara = (DocPara) docElement;
private void handleHeaderFooterPara( DocElement docElement , Phrase phrase ) throws DocumentException {
DocPara docPara = (DocPara) docElement;
if ( !PageNumberHelper.isPageNumberContent( docPara.getText() ) ) {
if ( docPara.getLeading() != null ) {
phrase.setLeading( docPara.getLeading().floatValue() );
}
Expand All @@ -454,6 +461,22 @@ private void handleHeaderFooterElement( DocElement docElement, float leading, Op
}
Chunk ck = new Chunk( docPara.getText(), f );
phrase.add( ck );
}
}

private void handleHeaderFooterElement( DocElement docElement, float leading, OpenPdfHelper docHelper , Phrase phrase ) throws DocumentException, IOException {
if ( docElement instanceof DocPhrase ) {
DocPhrase docPhrase = (DocPhrase) docElement;
if ( !PageNumberHelper.isPageNumberContent( docPhrase.getText() ) ) {
Chunk ck = createChunk( docPhrase, docHelper );
if( docPhrase.getLeading() != null && docPhrase.getLeading().floatValue() != leading ) {
leading = docPhrase.getLeading().floatValue();
phrase.setLeading( leading );
}
phrase.add( ck );
}
} else if ( docElement instanceof DocPara ) {
this.handleHeaderFooterPara(docElement, phrase);
} else if ( docElement instanceof DocImage ) {
DocImage docImage = (DocImage)docElement;
Image img = createImage( docImage );
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.fugerit.java.doc.mod.openpdf.helpers;

import org.fugerit.java.doc.base.model.DocContainer;
import org.fugerit.java.doc.base.model.DocElement;
import org.fugerit.java.doc.base.model.DocPara;
import org.fugerit.java.doc.base.model.DocPhrase;

public class PageNumberHelper {

private PageNumberHelper() {}

public static final String CURRENT_PAGE = "${currentPage}";

public static final String PAGE_COUNT = "${pageCount}";

public static boolean isPageNumberContent( String text ) {
return text.contains( CURRENT_PAGE ) || text.contains( PAGE_COUNT );
}

public static DocElement findPageNumberElement( DocContainer c ) {
DocElement res = null;
for ( DocElement current : c.getElementList() ) {
if ( current instanceof DocPara ) {
DocPara element = (DocPara)current;
if ( isPageNumberContent( element.getText() ) ) {
res = element;
}
} else if ( current instanceof DocPhrase ) {
DocPhrase element = (DocPhrase)current;
if ( isPageNumberContent( element.getText() ) ) {
res = element;
}
}
}
return res;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@

public interface ParentElement {

public void add( Element element ) throws Exception;
public void add( Element element );

}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void onEndPage(PdfWriter writer, Document document) {
DocElement current = itElements.next();
if ( current instanceof DocPara ) {
DocPara para = (DocPara) current;
String text = OpenPpfDocHandler.createText( docHelper.getParams(), para.getText() );
String text = OpenPpfDocHandler.createText( docHelper.getParams(), para.getText() ).replace( PageNumberHelper.PAGE_COUNT , "" );
float textSize = baseFont.getWidthPoint(text, footerTextSize);
float textBase = document.bottom() - totalOffset;
int rowOffset = 10;
Expand All @@ -90,7 +90,6 @@ public void onEndPage(PdfWriter writer, Document document) {
cb.setTextMatrix(document.right() - textSize - adjust, textBase);
cb.showText(text);
}

totalOffset+= rowOffset;
} else {
throw new ConfigRuntimeException( "Element not allowed in footer (accepted only DocPara) : "+current );
Expand All @@ -110,6 +109,7 @@ public void onCloseDocument(PdfWriter writer, Document document) {
totalPages.setTextMatrix(0, 0);
totalPages.showText(String.valueOf( writer.getPageNumber() - 1) );
totalPages.endText();
totalPages.sanityCheck();
}

public void setPageNumberAlignment(int pageNumberAlignment) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public PhraseParent( Phrase phrase ) {
/* (non-Javadoc)
* @see org.fugerit.java.doc.mod.itext.ParentElement#add(com.lowagie.text.Element)
*/
public void add(Element element) throws Exception {
public void add(Element element) {
this.phrase.add( element );
}

Expand Down
Loading