@Override
  public void postProcess(ITextContext context, File fileIn, File fileOut) {
    FileInputStream in = null;
    FileOutputStream out = null;

    try {
      in = new FileInputStream(fileIn);
      out = new FileOutputStream(fileOut);

      PageNumber pageNumber = context.pageNumber();

      int startPage = pageNumber.lookupFrontMatterLastPage();
      ColumnText ct = generateTableOfContent(context);
      pageNumber.continueFrontMatter();

      PdfReader reader = new PdfReader(in);
      Rectangle pageSize = reader.getPageSize(1);
      PdfStamper stamper = new PdfStamper(reader, out);
      while (true) {
        stamper.insertPage(++startPage, pageSize);

        PdfContentByte under = stamper.getUnderContent(startPage);
        pageNumber.notifyPageChange();
        headerFooter.drawFooter(under, pageNumber.pageInfos());

        PdfContentByte canvas = stamper.getOverContent(startPage);
        ct.setCanvas(canvas);
        ct.setSimpleColumn(36, 36, 559, 770);
        if (!ColumnText.hasMoreText(ct.go())) break;
      }
      stamper.close();

    } catch (FileNotFoundException e) {
      log.error("Unable to reopen temporary generated file ({})", fileIn, e);
    } catch (DocumentException e) {
      log.error("Error during report post-processing from: {}, to: {}", fileIn, fileOut, e);
    } catch (IOException e) {
      log.error("Error during report post-processing from: {}, to: {}", fileIn, fileOut, e);
    } finally {
      IOUtils.closeQuietly(out);
      IOUtils.closeQuietly(in);
    }
  }