Reporting examples

This is a code example of iText PDF, discover more.

8th November 2015
admin-marketing

Switch code for this example

FillTemplate1.java
  1. package sandbox.xmlworker.reporting;
  2.  
  3. import com.itextpdf.text.Document;
  4. import com.itextpdf.text.DocumentException;
  5. import com.itextpdf.text.Element;
  6. import com.itextpdf.text.pdf.PdfWriter;
  7. import com.itextpdf.tool.xml.ElementList;
  8. import com.itextpdf.tool.xml.html.Tags;
  9. import sandbox.WrapToTest;
  10.  
  11. import java.io.File;
  12. import java.io.FileOutputStream;
  13. import java.io.IOException;
  14.  
  15. @WrapToTest
  16. public class FillTemplate1 {
  17.  
  18.     public static final String DEST = "results/xmlworker/report1.pdf";
  19.     public static final String PDF =  "resources/pdfs/stationery.pdf";
  20.     public static final String HTML = "resources/xml/movies.html";
  21.     public static final String CSS = "resources/xml/style1.css";
  22.    
  23.     public void createPdf(String result) throws IOException, DocumentException {
  24.         FillTemplateHelper template = new FillTemplateHelper(PDF);
  25.         template.setSender("Bruno Lowagie\nAdolf Baeyensstraat 121\n9040 Sint-Amandsberg\nBELGIUM");
  26.         template.setReceiver("iText Software Corp.\nCambridge Innovation Center\n1 Broadway, 14th Floor\nCambridge, MA 02142 USA");
  27.         // step 1
  28.         Document document = new Document(template.getPageSize(),
  29.             template.getmLeft(), template.getmRight(), template.getmTop(), template.getmBottom());
  30.         // step 2
  31.         PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(result));
  32.         writer.setPageEvent(template);
  33.         // step 3
  34.         document.open();
  35.         // step 4
  36.         ElementList elements = FillTemplateHelper.parseHtml(HTML, CSS, Tags.getHtmlTagProcessorFactory());
  37.         for (Element e : elements) {
  38.             document.add(e);
  39.         }
  40.         // step 5
  41.         document.close();
  42.     }
  43.    
  44.     public static void main(String[] args) throws IOException, DocumentException {
  45.         File file = new File(DEST);
  46.         file.getParentFile().mkdirs();
  47.         new FillTemplate1().createPdf(DEST);
  48.     }
  49. }
FillTemplate2.java
  1. package sandbox.xmlworker.reporting;
  2.  
  3. import com.itextpdf.text.Document;
  4. import com.itextpdf.text.DocumentException;
  5. import com.itextpdf.text.Element;
  6. import com.itextpdf.text.pdf.ColumnText;
  7. import com.itextpdf.text.pdf.PdfPTable;
  8. import com.itextpdf.text.pdf.PdfWriter;
  9. import com.itextpdf.tool.xml.ElementList;
  10. import com.itextpdf.tool.xml.html.Tags;
  11. import sandbox.WrapToTest;
  12.  
  13. import java.io.File;
  14. import java.io.FileOutputStream;
  15. import java.io.IOException;
  16.  
  17. @WrapToTest
  18. public class FillTemplate2 {
  19.  
  20.     public static final String DEST = "results/xmlworker/report2.pdf";
  21.     public static final String PDF = "resources/pdfs/stationery.pdf";
  22.     public static final String HTML = "resources/xml/movies.html";
  23.     public static final String CSS = "resources/xml/style2.css";
  24.    
  25.     public void createPdf(String result) throws IOException, DocumentException {
  26.         FillTemplateHelper template = new FillTemplateHelper(PDF);
  27.         template.setSender("Bruno Lowagie\nAdolf Baeyensstraat 121\n9040 Sint-Amandsberg\nBELGIUM");
  28.         template.setReceiver("iText Software Corp.\nCambridge Innovation Center\n1 Broadway, 14th Floor\nCambridge, MA 02142 USA");
  29.         // step 1
  30.         Document document = new Document(template.getPageSize());
  31.         // step 2
  32.         PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(result));
  33.         writer.setPageEvent(template);
  34.         // step 3
  35.         document.open();
  36.         // step 4
  37.         ColumnText ct = new ColumnText(writer.getDirectContent());
  38.         ct.setSimpleColumn(template.getBody());
  39.     ElementList elements = FillTemplateHelper.parseHtml(HTML, CSS, Tags.getHtmlTagProcessorFactory());
  40.         int status;
  41.         float yLine;
  42.         int rowsDrawn;
  43.         for (Element e : elements) {
  44.             if (!ColumnText.isAllowedElement(e))
  45.                 continue;
  46.             if (e instanceof PdfPTable)
  47.                 ((PdfPTable)e).setHeaderRows(1);
  48.             yLine = ct.getYLine();
  49.             ct.addElement(e);
  50.             status = ct.go(true);
  51.             // the content fits:
  52.             if (!ColumnText.hasMoreText(status)) {
  53.                  // return to the original position
  54.                 ct.setYLine(yLine);
  55.                 // add the element FOR REAL
  56.                 ct.addElement(e);
  57.                 ct.go();
  58.             }
  59.             else {
  60.                 rowsDrawn = ct.getRowsDrawn();
  61.                 ct.setText(null);
  62.                 ct.addElement(e);
  63.                 ct.setSimpleColumn(template.getBody());
  64.                 status = ct.go(true);
  65.                 if (ColumnText.hasMoreText(status) && rowsDrawn > 2) {
  66.                     ct.setYLine(yLine);
  67.                     ct.setText(null);
  68.                     ct.addElement(e);
  69.                     ct.go();
  70.                 }
  71.                 else {
  72.                     ct.setText(null);
  73.                     ct.addElement(e);
  74.                 }
  75.                 document.newPage();
  76.                 ct.setSimpleColumn(template.getBody());
  77.                 status = ct.go();
  78.                 while (ColumnText.hasMoreText(status)) {
  79.                     document.newPage();
  80.                     ct.setSimpleColumn(template.getBody());
  81.                     status = ct.go();
  82.                 }
  83.             }
  84.         }
  85.         // step 5
  86.         document.close();
  87.     }
  88.    
  89.     public static void main(String[] args) throws IOException, DocumentException {
  90.         File file = new File(DEST);
  91.         file.getParentFile().mkdirs();
  92.         new FillTemplate2().createPdf(DEST);
  93.     }
  94. }
FillTemplate3.java
  1. package sandbox.xmlworker.reporting;
  2.  
  3. import com.itextpdf.text.Document;
  4. import com.itextpdf.text.DocumentException;
  5. import com.itextpdf.text.Element;
  6. import com.itextpdf.text.pdf.ColumnText;
  7. import com.itextpdf.text.pdf.PdfPTable;
  8. import com.itextpdf.text.pdf.PdfWriter;
  9. import com.itextpdf.tool.xml.ElementList;
  10. import com.itextpdf.tool.xml.html.Tags;
  11. import sandbox.WrapToTest;
  12.  
  13. import java.io.File;
  14. import java.io.FileOutputStream;
  15. import java.io.IOException;
  16.  
  17. @WrapToTest
  18. public class FillTemplate3 {
  19.  
  20.     public static final String DEST = "results/xmlworker/report3.pdf";
  21.     public static final String PDF = "resources/pdfs/stationery_landscape.pdf";
  22.     public static final String HTML = "resources/xml/movies.html";
  23.     public static final String CSS = "resources/xml/style3.css";
  24.    
  25.     public void createPdf(String result) throws IOException, DocumentException {
  26.         FillTemplateHelper template = new FillTemplateHelper(PDF);
  27.         template.setSender("Bruno Lowagie\nAdolf Baeyensstraat 121\n9040 Sint-Amandsberg\nBELGIUM");
  28.         template.setReceiver("iText Software Corp.\nCambridge Innovation Center\n1 Broadway, 14th Floor\nCambridge, MA 02142 USA");
  29.         // step 1
  30.         Document document = new Document(template.getPageSize());
  31.         // step 2
  32.         PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(result));
  33.         writer.setPageEvent(template);
  34.         // step 3
  35.         document.open();
  36.         // step 4
  37.         ColumnText ct = new ColumnText(writer.getDirectContent());
  38.         ct.setSimpleColumn(template.getBody());
  39.     ElementList elements = FillTemplateHelper.parseHtml(HTML, CSS, Tags.getHtmlTagProcessorFactory());
  40.         int status;
  41.         float yLine;
  42.         int rowsDrawn;
  43.         for (Element e : elements) {
  44.             if (!ColumnText.isAllowedElement(e))
  45.                 continue;
  46.             if (e instanceof PdfPTable)
  47.                 ((PdfPTable)e).setHeaderRows(1);
  48.             yLine = ct.getYLine();
  49.             ct.addElement(e);
  50.             status = ct.go(true);
  51.             // the content fits:
  52.             if (!ColumnText.hasMoreText(status)) {
  53.                  // return to the original position
  54.                 ct.setYLine(yLine);
  55.                 // add the element FOR REAL
  56.                 ct.addElement(e);
  57.                 ct.go();
  58.             }
  59.             else {
  60.                 rowsDrawn = ct.getRowsDrawn();
  61.                 ct.setText(null);
  62.                 ct.addElement(e);
  63.                 ct.setSimpleColumn(template.getBody());
  64.                 status = ct.go(true);
  65.                 if (ColumnText.hasMoreText(status) && rowsDrawn > 2) {
  66.                     ct.setYLine(yLine);
  67.                     ct.setText(null);
  68.                     ct.addElement(e);
  69.                     ct.go();
  70.                 }
  71.                 else {
  72.                     ct.setText(null);
  73.                     ct.addElement(e);
  74.                 }
  75.                 document.newPage();
  76.                 ct.setSimpleColumn(template.getBody());
  77.                 status = ct.go();
  78.                 while (ColumnText.hasMoreText(status)) {
  79.                     document.newPage();
  80.                     ct.setSimpleColumn(template.getBody());
  81.                     status = ct.go();
  82.                 }
  83.             }
  84.         }
  85.         // step 5
  86.         document.close();
  87.     }
  88.    
  89.     public static void main(String[] args) throws IOException, DocumentException {
  90.         File file = new File(DEST);
  91.         file.getParentFile().mkdirs();
  92.         new FillTemplate3().createPdf(DEST);
  93.     }
  94. }
FillTemplate4.java
  1. package sandbox.xmlworker.reporting;
  2.  
  3. import com.itextpdf.text.Document;
  4. import com.itextpdf.text.DocumentException;
  5. import com.itextpdf.text.Element;
  6. import com.itextpdf.text.pdf.ColumnText;
  7. import com.itextpdf.text.pdf.PdfWriter;
  8. import com.itextpdf.tool.xml.ElementList;
  9. import com.itextpdf.tool.xml.Tag;
  10. import com.itextpdf.tool.xml.WorkerContext;
  11. import com.itextpdf.tool.xml.html.DefaultTagProcessorFactory;
  12. import com.itextpdf.tool.xml.html.Div;
  13. import com.itextpdf.tool.xml.html.TagProcessorFactory;
  14. import com.itextpdf.tool.xml.html.table.Table;
  15. import com.itextpdf.tool.xml.html.table.TableData;
  16. import com.itextpdf.tool.xml.html.table.TableRow;
  17. import com.itextpdf.tool.xml.html.table.TableRowElement;
  18. import sandbox.WrapToTest;
  19.  
  20. import java.io.File;
  21. import java.io.FileOutputStream;
  22. import java.io.IOException;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25.  
  26. @WrapToTest
  27. public class FillTemplate4 {
  28.    
  29.     public static final String DEST = "results/xmlworker/report4.pdf";
  30.     public static final String PDF = "resources/pdfs/stationery.pdf";
  31.     public static final String XML = "resources/xml/movies.xml";
  32.     public static final String CSS = "resources/xml/style4.css";
  33.    
  34.    
  35.     public void createPdf(String result) throws IOException, DocumentException {
  36.         FillTemplateHelper template = new FillTemplateHelper(PDF);
  37.         template.setSender("Bruno Lowagie\nAdolf Baeyensstraat 121\n9040 Sint-Amandsberg\nBELGIUM");
  38.         template.setReceiver("iText Software Corp.\nCambridge Innovation Center\n1 Broadway, 14th Floor\nCambridge, MA 02142 USA");
  39.         // step 1
  40.         Document document = new Document(template.getPageSize());
  41.         // step 2
  42.         PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(result));
  43.         writer.setPageEvent(template);
  44.         // step 3
  45.         document.open();
  46.         // step 4
  47.         ColumnText ct = new ColumnText(writer.getDirectContent());
  48.         ct.setSimpleColumn(template.getBody());
  49.     ElementList elements = FillTemplateHelper.parseHtml(XML, CSS, getTagProcessorFactory());
  50.         int status;
  51.         float yLine;
  52.         for (Element e : elements) {
  53.             if (!ColumnText.isAllowedElement(e))
  54.                 continue;
  55.             yLine = ct.getYLine();
  56.             ct.addElement(e);
  57.             status = ct.go(true);
  58.             if (ColumnText.hasMoreText(status) && yLine < 140) {
  59.                 document.newPage();
  60.                 ct.setSimpleColumn(template.getBody());
  61.             }
  62.             else {
  63.                 ct.setYLine(yLine);
  64.             }
  65.             ct.setText(null);
  66.             ct.addElement(e);
  67.             status = ct.go();
  68.             while (ColumnText.hasMoreText(status)) {
  69.                 document.newPage();
  70.                 ct.setSimpleColumn(template.getBody());
  71.                 status = ct.go();
  72.             }
  73.         }
  74.         // step 5
  75.         document.close();
  76.     }
  77.    
  78.     protected TagProcessorFactory getTagProcessorFactory() {
  79.         TagProcessorFactory factory = new DefaultTagProcessorFactory();
  80.         factory.addProcessor(new Div(), "description", "moviecountry");
  81.         factory.addProcessor(new Div(), "title", "country");
  82.         factory.addProcessor(new Table(), "movies");
  83.         factory.addProcessor(new TableRow(), "movie");
  84.         factory.addProcessor(new TableRow() {
  85.         public List end(WorkerContext ctx, final Tag tag, final List currentContent) {
  86.                 List l = new ArrayList(1);
  87.                 l.add(new TableRowElement(currentContent, TableRowElement.Place.HEADER));
  88.                 return l;
  89.             }
  90.         }, "movieheader");
  91.         factory.addProcessor(new TableData(), "column1", "columnheader1", "column2", "columnheader2", "column3", "columnheader3");
  92.         return factory;
  93.     }
  94.    
  95.     public static void main(String[] args) throws IOException, DocumentException {
  96.         File file = new File(DEST);
  97.         file.getParentFile().mkdirs();
  98.         new FillTemplate4().createPdf(DEST);
  99.     }
  100. }
FillTemplateHelper.java
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6.  
  7. package sandbox.xmlworker.reporting;
  8.  
  9. import com.itextpdf.text.Chunk;
  10. import com.itextpdf.text.Document;
  11. import com.itextpdf.text.DocumentException;
  12. import com.itextpdf.text.Element;
  13. import com.itextpdf.text.ExceptionConverter;
  14. import com.itextpdf.text.Font;
  15. import com.itextpdf.text.Image;
  16. import com.itextpdf.text.Paragraph;
  17. import com.itextpdf.text.Phrase;
  18. import com.itextpdf.text.Rectangle;
  19. import com.itextpdf.text.pdf.AcroFields;
  20. import com.itextpdf.text.pdf.BaseFont;
  21. import com.itextpdf.text.pdf.ColumnText;
  22. import com.itextpdf.text.pdf.PdfContentByte;
  23. import com.itextpdf.text.pdf.PdfPageEventHelper;
  24. import com.itextpdf.text.pdf.PdfReader;
  25. import com.itextpdf.text.pdf.PdfTemplate;
  26. import com.itextpdf.text.pdf.PdfWriter;
  27. import com.itextpdf.tool.xml.ElementList;
  28. import com.itextpdf.tool.xml.XMLWorker;
  29. import com.itextpdf.tool.xml.XMLWorkerHelper;
  30. import com.itextpdf.tool.xml.css.CssFile;
  31. import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
  32. import com.itextpdf.tool.xml.html.TagProcessorFactory;
  33. import com.itextpdf.tool.xml.parser.XMLParser;
  34. import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
  35. import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
  36. import com.itextpdf.tool.xml.pipeline.end.ElementHandlerPipeline;
  37. import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
  38. import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
  39.  
  40. import java.io.FileInputStream;
  41. import java.io.IOException;
  42. import java.nio.charset.Charset;
  43. import java.text.DateFormat;
  44. import java.util.Calendar;
  45. import java.util.Locale;
  46.  
  47. /**
  48.  *
  49.  * @author iText
  50.  */
  51. public class FillTemplateHelper extends PdfPageEventHelper {
  52.     // initialized in constructor
  53.     protected PdfReader reader;
  54.     protected Rectangle pageSize;
  55.     protected Rectangle body;
  56.     protected float mLeft, mRight, mTop, mBottom;
  57.     protected Rectangle to;
  58.     protected Rectangle from;
  59.     protected Rectangle date;
  60.     protected Rectangle footer;
  61.     protected BaseFont basefont;
  62.     protected Font font;
  63.     // initialized with setter
  64.     protected String sender = "";
  65.     protected String receiver = "";
  66.     // initialized upon opening the document
  67.     protected PdfTemplate background;
  68.     protected PdfTemplate total;
  69.     protected String today;
  70.        
  71.     public FillTemplateHelper(String stationery) throws IOException, DocumentException {
  72.         reader = new PdfReader(stationery);
  73.         AcroFields fields = reader.getAcroFields();
  74.         pageSize = reader.getPageSize(1);
  75.         body = fields.getFieldPositions("body").get(0).position;
  76.         mLeft = body.getLeft() - pageSize.getLeft();
  77.         mRight = pageSize.getRight() - body.getRight();
  78.         mTop = pageSize.getTop() - body.getTop();
  79.         mBottom = body.getBottom() - pageSize.getBottom();
  80.         to = fields.getFieldPositions("to").get(0).position;
  81.         from = fields.getFieldPositions("from").get(0).position;
  82.         date = fields.getFieldPositions("date").get(0).position;
  83.         footer = fields.getFieldPositions("footer").get(0).position;
  84.         basefont = BaseFont.createFont();
  85.         font = new Font(basefont, 12);
  86.     }
  87.  
  88.     public void setSender(String sender) {
  89.         this.sender = sender;
  90.     }
  91.     public void setReceiver(String receiver) {
  92.         this.receiver = receiver;
  93.     }
  94.  
  95.     public Rectangle getPageSize() {
  96.         return pageSize;
  97.     }
  98.  
  99.     public float getmLeft() {
  100.         return mLeft;
  101.     }
  102.  
  103.     public float getmRight() {
  104.         return mRight;
  105.     }
  106.  
  107.     public float getmTop() {
  108.         return mTop;
  109.     }
  110.  
  111.     public float getmBottom() {
  112.         return mBottom;
  113.     }
  114.    
  115.     public Rectangle getBody() {
  116.         return body;
  117.     }
  118.  
  119.     public String getToday() {
  120.         return today;
  121.     }
  122.  
  123.     public void setToday(String today) {
  124.         this.today = today;
  125.     }
  126.  
  127.     @Override
  128.     public void onOpenDocument(PdfWriter writer, Document document) {
  129.         background = writer.getImportedPage(reader, 1);
  130.         total = writer.getDirectContent().createTemplate(30, 15);
  131.         Calendar c = Calendar.getInstance();
  132.         c.set(2015, 9, 13);
  133.         today = DateFormat.getDateInstance(DateFormat.LONG, Locale.US).format(c.getTime());
  134.     }
  135.    
  136.     @Override
  137.     public void onEndPage(PdfWriter writer, Document document) {
  138.         PdfContentByte canvas = writer.getDirectContentUnder();
  139.         // background
  140.         canvas.addTemplate(background, 0, 0);
  141.         try {
  142.             // date
  143.             ColumnText ct = new ColumnText(canvas);
  144.             ct.setSimpleColumn(date);
  145.             ct.addText(new Chunk(today, font));
  146.             ct.go();
  147.             // footer (page X of Y)
  148.             ct.setSimpleColumn(footer);
  149.             ct.addText(new Chunk("page " + writer.getPageNumber(), font));
  150.             ct.addText(new Chunk(Image.getInstance(total), 0, 0));
  151.             ct.go();
  152.             // from address
  153.             ct.setSimpleColumn(from);
  154.             ct.addElement(new Paragraph(sender, font));
  155.             ct.go();
  156.             // to address
  157.             ct.setSimpleColumn(to);
  158.             ct.addElement(new Paragraph(receiver, font));
  159.             ct.go();
  160.         } catch (DocumentException e) {
  161.             // can never happen, but if it does, we want to know!
  162.             throw new ExceptionConverter(e);
  163.         }
  164.     }
  165.    
  166.     @Override
  167.     public void onCloseDocument(PdfWriter writer, Document document) {
  168.         // we only know the total number of pages at the moment the document is closed.
  169.         String s = "/" + (writer.getPageNumber() - 1);
  170.         Phrase p = new Phrase(12, s, font);
  171.         ColumnText.showTextAligned(total, Element.ALIGN_LEFT, p, 0.5f, 0, 0);
  172.     }
  173.  
  174.     public static ElementList parseHtml(String content, String style, TagProcessorFactory tagProcessors) throws IOException {
  175.         // CSS
  176.         CSSResolver cssResolver = new StyleAttrCSSResolver();
  177.         CssFile cssFile = XMLWorkerHelper.getCSS(new FileInputStream(style));
  178.         cssResolver.addCss(cssFile);
  179.         // HTML
  180.         HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
  181.         htmlContext.setTagFactory(tagProcessors);
  182.         htmlContext.autoBookmark(false);
  183.         // Pipelines
  184.         ElementList elements = new ElementList();
  185.         ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
  186.         HtmlPipeline html = new HtmlPipeline(htmlContext, end);
  187.         CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
  188.         // XML Worker
  189.         XMLWorker worker = new XMLWorker(css, true);
  190.         XMLParser p = new XMLParser(worker);
  191.  
  192.         p.parse(new FileInputStream(content),Charset.forName("cp1252"));
  193.         return elements;
  194.     }
  195. }
Contact

Still have questions? 

We're happy to answer your questions. Reach out to us and we'll get back to you shortly.

Contact us
Stay updated

Join 11,000+ subscribers and become an iText PDF expert by staying up to date with our new products, updates, tips, technical solutions and happenings.

Subscribe Now