ItextPdf中的分页

时间:2015-02-04 22:59:21

标签: pagination itextpdf

我们在我们的应用程序中使用itextpdf和xmlworker API(itextpdf-5.1.1.jar,Xmlworker-1.1.0.jar)来生成PDF生成任务。我们从XML-XSLT转换生成HTML内容,然后使用HTML内容创建pdf文档。

当我们尝试实现分页时(3个中的1个,3个中的2个),我们从itextpdf在线样本中学到了我们总是需要创建一个结果pdf文档,而不是我们创建的PDF文档以便标记每页内容的页码。

这种方法在删除中间pdf文档方面带来了挑战。有没有什么方法可以在我们第一次创建pdf时确定页码,以便我们避免创建一个结果pdf文档?

由于 Venkat

class TableFooter extends PdfPageEventHelper {          
      String header;          
      PdfTemplate total;

      public void setHeader(String header) {            
          this.header = header;
      }

      public void onOpenDocument(PdfWriter writer, Document document) {
          total = writer.getDirectContent().createTemplate(30, 16);

      }

      public void onEndPage(PdfWriter writer, Document document) {
          Font ffont = new Font(Font.FontFamily.UNDEFINED, 7, Font.NORMAL);
          PdfPTable table = new PdfPTable(2);
          try 
          {
              table.setWidths(new int[]{1,1});
              table.setTotalWidth(50);
              table.getDefaultCell().setFixedHeight(15);
              table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
              Phrase footer = new Phrase(String.format("%d of", writer.getPageNumber()), ffont);
              table.addCell(footer);                
              PdfPCell cell = new PdfPCell(Image.getInstance(total));
              table.addCell(cell);
              table.writeSelectedRows(0, -1, 275, 20, writer.getDirectContent());
          }
          catch(Exception de) {
              throw new ExceptionConverter(de);
          }
      }

      public void onCloseDocument(PdfWriter writer, Document document) {            
        ColumnText.showTextAligned(total, Element.ALIGN_LEFT, new Phrase(String.valueOf(writer.getPageNumber() - 1)), 10, 4, 0);
      }
  }

1 个答案:

答案 0 :(得分:1)

请下载免费的电子书The Best iText Questions on StackOverflow,并阅读“页面活动”一章中列出的问题。这些是为本书选择的一些问题:

您还可以查看官方iText网站上的keywords page,更具体地说,请查看关键字Page X of Y

在您的问题中,您指的是创建中间文档。这就是TwoPasses示例的内容。您要求在一次传递中添加 Y页面X 。这就是MovieCountries1示例的内容。

class PageXofYHeader extends PdfPageEventHelper {
    /** The template with the total number of pages. */
    PdfTemplate total;

    /**
     * Creates the PdfTemplate that will hold the total number of pages.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(30, 16);
    }

    /**
     * Adds a header to every page
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onEndPage(PdfWriter writer, Document document) {
        PdfPTable table = new PdfPTable(2);
        try {
            table.setWidths(new int[]{48, 2});
            table.setTotalWidth(527);
            table.setLockedWidth(true);
            table.getDefaultCell().setFixedHeight(20);
            table.getDefaultCell().setBorder(Rectangle.BOTTOM);
            table.getDefaultCell()
                .setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(
                String.format("Page %d of", writer.getPageNumber()));
            PdfPCell cell = new PdfPCell(Image.getInstance(total));
            cell.setBorder(Rectangle.BOTTOM);
            table.addCell(cell);
            table.writeSelectedRows(0, -1, 34, 803,
                writer.getDirectContent());
        }
        catch(DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }

    /**
     * Fills out the total number of pages before the document is closed.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onCloseDocument(PdfWriter writer, Document document) {
        ColumnText.showTextAligned(total, Element.ALIGN_LEFT,
                new Phrase(String.valueOf(writer.getPageNumber() - 1)),
                2, 2, 0);
    }
}

如您所见,我们在total方法中创建了一个名为onOpenDocument()的小占位符。由于我们事先并不知道总页数是多少,因此我们将此占位符添加到每个页面,而不知道页面总数将是什么。我们只知道关闭文档时的最终页数,这就是我们等到触发onCloseDocument()方法向占位符添加内容的原因。