<< back ### PD4ML: PDF Header/Footer Generation PD4ML provides 3 types of headers/footers. text-only html (PD4ML Pro) inline (PD4ML Pro) The first 2 options are available by PD4ML Java API calls (or as JSP custom tags mapped to PD4ML API): i.e. <pd4ml:footer> -> pd4ml.setPageFooter(); 1. Text only (in such form can be used only in JSP):
    <pd4ml:footer
        pageNumberTemplate="page $[page] of $[total]"
        titleAlignment="left"
        pageNumberAlignment="right"
        color="#008000"
        initialPageNumber="1"
        pagesToSkip="1"
        fontSize="14"
        areaHeight="18"/>
Java version:
    PD4PageMark footer = new PD4PageMark();
    footer.setPageNumberTemplate("page $[page] of $[total]");
    footer.setTitleAlignment(PD4PageMark.LEFT_ALIGN);
    footer.setPageNumberAlignment(PD4PageMark.RIGHT_ALIGN);
    footer.setColor(new Color(0x008000));
    footer.setInitialPageNumber(1);
    footer.setPagesToSkip(1);
    footer.setFontSize(14);
    footer.setAreaHeight(18);
    pd4ml.setPageFooter(footer);
2. HTML formatted footer (in such form can be used only in JSP)
    <pd4ml:footer areaHeight="-1">
    <font color="red"><i>page $[page] of $[total]</i></font>
    </pd4ml:footer>
Java version:
    PD4PageMark footer = new PD4PageMark();
    footer.setHtmlTemplate("<font color=\"red\"><i>page $[page] of $[total]</i></font>");
    footer.setAreaHeight(-1);
    pd4ml.setPageFooter(footer);
areaHeight="-1" means "autocompute" there 3. The third option, inline footer, allows to define footer body in HTML/PHP document:
    <pd4ml:page.footer>
    footer: $[page] of $[total]
    </pd4ml:page.footer>
The definition impacts all subsequent pages after the page, where the footer defined. A new appearance of the footer overrides previously defined one. In order to define the footer for the first page, you need to place the definition immediately after <body> tag or before <html>. Also you may explicitly define pages, where the footer needs to be applied:
    <pd4ml:page.footer scope="1">
    first page footer: $[page] of $[total]<br> <img src="img1.gif">
    </pd4ml:page.footer>
    <pd4ml:page.footer scope="2+">
    footer: $[page] of $[total]<br>
    <img src="img2.gif">
    </pd4ml:page.footer>
    <html>
    <head>
    ...
The above defines different footers for the first page and for the rest of the pages (the second and others). Also "scope" understands "even", "odd" and "skiplast" modifiers. Example: scope="2,5-10,even,skiplast" You may control header/footer appearance scope also if header/footer defined via API (the first two header/footer types). It can be achieved by an overriding relevant methods:
    PD4PageMark footer = new PD4PageMark() {
    	public String getHtmlTemplate(int pageNumber) {
    		if ( pageNumber % 2 == 0 ) {
    			return "<html><body>some left aligned stuff...";
    		} else {
    			return "<html><body>some right aligned stuff...";
    		}
    	}
    };
    pd4ml.setPageFooter(footer);
The above example defines page-specific HTML footer. Such type of footers is not supported by PD4ML Std. For the Std verison you may override: PD4PageMark.getPageNumberTemplate(int pageNr); PD4PageMark.getPageNumberAlignment(int pageNr); PD4PageMark.getTitleTemplate(int pageNr); etc Note: by the approach it will allocate header or footer space even if for particular pages the overridden methods return no header/footer data. PDF header/footer discussion is here