import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.Phrase; import com.lowagie.text.DocumentException; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfWriter; import java.io.FileOutputStream; import java.io.FileNotFoundException; public class Main { // Document Structure: // Document // DocumentHeaderTable // DocumentFooterTable // ReportTable // PageHeader // ReportPageHeader // PageFooter // ReportPageFooter // ReportData private static void test1( final Document document ) throws DocumentException { // Add document header table final PdfPTable reportHeader = new PdfPTable( 1 ); reportHeader.setWidthPercentage( 100f ); for ( int i = 0; i < 4; i++ ) reportHeader.addCell( new PdfPCell( new Phrase( "Document Header " + i ) ) ); document.add( reportHeader ); // Add report (page headers/footers added to the report itself) final PdfPTable reportTable = new PdfPTable( 1 ); reportTable.setWidthPercentage( 100f ); reportTable.addCell( new PdfPCell( new Phrase( "Page Header" ) ) ); reportTable.addCell( new PdfPCell( new Phrase( "Report Header" ) ) ); reportTable.addCell( new PdfPCell( new Phrase( "Report Footer" ) ) ); reportTable.addCell( new PdfPCell( new Phrase( "Page Footer" ) ) ); reportTable.setSkipFirstHeader( true ); reportTable.setSkipLastFooter( true ); reportTable.setHeaderRows( 4 ); reportTable.setFooterRows( 2 ); for ( int i = 0; i < 200; i++ ) reportTable.addCell( new PdfPCell( new Phrase( " Data " + i ) ) ); document.add( reportTable ); // Add document footer table final PdfPTable reportFooter = new PdfPTable( 1 ); reportFooter.setWidthPercentage( 100f ); for ( int i = 0; i < 4; i++ ) reportFooter.addCell( new PdfPCell( new Phrase( "Document Footer " + i ) ) ); document.add( reportFooter ); } // The report page header is also excluded for the first page in test1. We do not want that so try to use nested tables. // Document Structure: // Document // DocumentHeader // DocumentFooter // ReportLayoutTable // PageHeader // PageFooter // ReportTable // ReportPageHeader // ReportPageFooter // ReportData private static void test2( final Document document ) throws DocumentException { // Add document header table final PdfPTable reportHeader = new PdfPTable( 1 ); reportHeader.setWidthPercentage( 100f ); for ( int i = 0; i < 4; i++ ) reportHeader.addCell( new PdfPCell( new Phrase( "Document Header " + i ) ) ); document.add( reportHeader ); // --------------------------------------------------------- // Wrap report in new table that does the layout for the page headers/footers final PdfPTable layoutTable = new PdfPTable( 1 ); layoutTable.setWidthPercentage( 100f ); // Add page header/footer layoutTable.addCell( new PdfPCell( new Phrase( "Page Header " ) ) ); layoutTable.addCell( new PdfPCell( new Phrase( "Page Footer " ) ) ); // Add report table (with its own page footers/headers) final PdfPTable reportTable = new PdfPTable( 1 ); reportTable.setWidthPercentage( 100f ); reportTable.addCell( new PdfPCell( new Phrase( "Report Header" ) ) ); reportTable.addCell( new PdfPCell( new Phrase( "Report Footer" ) ) ); reportTable.setHeaderRows( 2 ); reportTable.setFooterRows( 1 ); for ( int i = 0; i < 200; i++ ) reportTable.addCell( new PdfPCell( new Phrase( " Data " + i ) ) ); layoutTable.addCell( reportTable ); layoutTable.setSkipFirstHeader( true ); layoutTable.setSkipLastFooter( true ); layoutTable.setHeaderRows( 2 ); layoutTable.setFooterRows( 1 ); document.add( layoutTable ); // --------------------------------------------------------- // Add document footer table final PdfPTable reportFooter = new PdfPTable( 1 ); reportFooter.setWidthPercentage( 100f ); for ( int i = 0; i < 4; i++ ) reportFooter.addCell( new PdfPCell( new Phrase( "Document Footer " + i ) ) ); document.add( reportFooter ); } // The report page header is also excluded for the first page in test1. We do not want that so try to use nested tables. // Document Structure: // Document // MainTable // DocumentHeader // DocumentFooter // ReportLayoutTable // PageHeader // PageFooter // ReportTable // ReportPageHeader // ReportPageFooter // ReportData private static void test3( final Document document ) throws DocumentException { // 1) Create report table (including page footers headers) // Wrap report in new table that does the layout for the page headers/footers final PdfPTable reportLayoutTable = new PdfPTable( 1 ); reportLayoutTable.setWidthPercentage( 100f ); // Add page header/footer reportLayoutTable.addCell( new PdfPCell( new Phrase( "Page Header " ) ) ); reportLayoutTable.addCell( new PdfPCell( new Phrase( "Page Footer " ) ) ); // Add report table (with its own page footers/headers) final PdfPTable reportTable = new PdfPTable( 1 ); reportTable.setWidthPercentage( 100f ); reportTable.addCell( new PdfPCell( new Phrase( "Report Header" ) ) ); reportTable.addCell( new PdfPCell( new Phrase( "Report Footer" ) ) ); reportTable.setHeaderRows( 2 ); reportTable.setFooterRows( 1 ); for ( int i = 0; i < 200; i++ ) reportTable.addCell( new PdfPCell( new Phrase( " Data " + i ) ) ); reportLayoutTable.addCell( reportTable ); reportLayoutTable.setSkipFirstHeader( true ); reportLayoutTable.setSkipLastFooter( true ); reportLayoutTable.setHeaderRows( 2 ); reportLayoutTable.setFooterRows( 1 ); // 2) Create document header table final PdfPTable documentHeader = new PdfPTable( 1 ); documentHeader.setWidthPercentage( 100f ); for ( int i = 0; i < 4; i++ ) documentHeader.addCell( new PdfPCell( new Phrase( "Document Header " + i ) ) ); // 3) Add document footer table final PdfPTable documentFooter = new PdfPTable( 1 ); documentFooter.setWidthPercentage( 100f ); for ( int i = 0; i < 4; i++ ) documentFooter.addCell( new PdfPCell( new Phrase( "Document Footer " + i ) ) ); // 4) Create main layout table including document header/report/document footer final PdfPTable documentLayoutTable = new PdfPTable( 1 ); documentLayoutTable.setWidthPercentage( 100f ); documentLayoutTable.addCell( documentHeader ); documentLayoutTable.addCell( reportLayoutTable ); documentLayoutTable.addCell( documentFooter ); document.add( documentLayoutTable ); } public static void main( final String args[] ) throws FileNotFoundException, DocumentException { final Document document = new Document( PageSize.A4 ); final PdfWriter writer = PdfWriter.getInstance( document, new FileOutputStream( args[0] ) ); document.open(); // test1( document ); // test2( document ); test3( document ); document.close(); } }