The example given in the itext site is working very well.
Page events for headers and footers
However, I am creating pdf from list of html strings so I cannot determine when to set document.newPage()
If i don't write document.newPage()
, my PdfPgeEventHelper
class doesn't update variable on each end of page, instead it gets last updated value.
Main method to create pdf:
public static void createPdf(ArrayList<String> htmlStrings, FooterTable footerEvt, String destinationPath)
throws IOException, DocumentException {
Document document = new Document(PageSize.A4);
document.setMargins(68, 85, 75, 85);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(destinationPath));
if (footerEvt != null)
writer.setPageEvent(footerEvt);
document.open();
CSSResolver cssResolver = new StyleAttrCSSResolver();
CssFile cssFile = XMLWorkerHelper
.getCSS(new ByteArrayInputStream(readCSS("resources/content.min.css").getBytes()));
cssResolver.addCss(cssFile);
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/ARIAL.TTF");
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
XMLWorker worker = new XMLWorker(css, true);
XMLParser p = new XMLParser(worker);
int i = 0;
for (String htmlfile : htmlStrings) {
i++;
footerEvt.setTitleIndex("" + i);//or FooterTable.setTitleIndex("" + i);
ByteArrayInputStream stream = new ByteArrayInputStream(htmlfile.getBytes("UTF-8"));
p.parse(stream, Charset.forName("UTF-8"));
}
document.close();
}
FooterTable class which extends PdfPageEventHelper
public static void setTitleIndex(String _titleIndex) {
titleIndex = _titleIndex;
}
public void onEndPage(PdfWriter writer, Document document) {
pageNumber = writer.getPageNumber();
generateFooter().writeSelectedRows(0, -1, document.left(), document.bottom() - getTableHeight(footerTable) + 25,
writer.getDirectContent());
}
public PdfPTable generateFooter() {
try {
BaseFont baseFont = BaseFont.createFont("resources/Arial.ttf", BaseFont.IDENTITY_H, true);
footerTable = new PdfPTable(1);
footerTable.setTotalWidth(440);
footerTable.setLockedWidth(true);
Font pageNumberFont = new Font(baseFont, 9, Font.BOLD);
Paragraph pageNumberP = new Paragraph(titleIndex+"-"+ pageNumber, pageNumberFont);
PdfPCell pageNumberCell = new PdfPCell(pageNumberP);
pageNumberCell.setBorder(0);
pageNumberCell.setPaddingTop(20);
footerTable.addCell(pageNumberCell);
} catch (Exception e) {
e.printStackTrace();
}
return footerTable;
}
For example if there are 10 htmlstrings, in footer every titleIndex is written as 11. But pagenumbers are written correctly.
EXAMPLE OUTPUT:
and it continues like that 11-3, 11-4, 11-5 ...
As you can see the variable is not updating each time. It should be 1-1, 2-2, 3-3, 4-4 ...
NOTE: Using iText 5.5.11
`...`
`. – mkl Apr 26 '17 at 14:30