显示仅在第一页上使用itext生成的pdf中的页数

时间:2011-03-31 19:08:57

标签: java servlets itext

我正在使用itext 2.1.7和java servlet创建一个PDF文件,我通过覆盖PdfpageEvents来插入页眉和页脚onEndPageonCloseDocument我成功地能够放置Y的pagev X在页眉/页脚

现在我想计算页面的成本(即打印成本)。所以我需要找到不。 pdf中的页面(即假设打印页面成本为3我需要计算整个pdf的数量(3 * pdf页面总数))并且捕获量我还需要显示成本在第一页上,仅在同一个pdf的第一页

我尝试在onCloseDocument中打印它,但是会在每页上打印成本

我怎么能做到这一点是我做错了什么?

这里是创建PDF文件的Servlet文件的代码

Document document = new Document(PageSize.A4, 20, 20, 20, 50);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(request.getRealPath("/") +"NoticeReports/"+filename+".pdf"));
MyPageEvents events = new MyPageEvents();
writer.setPageEvent(events);
document.open();
/*
 * put some content in the pdf
 *
 */
document.close();

我正在引用具有以下方法的MyPageEvents类:

 int costofpage=3;

// we override the onEndPage method
public void onEndPage(PdfWriter writer, Document document) {

    int pageN = writer.getPageNumber();
    String text = "Page " + pageN + " of ";
    float len = bf.getWidthPoint(text, 8);
    cb.beginText();
    cb.setFontAndSize(bf, 8);
    cb.setTextMatrix(280, 20);
    cb.showText(text);
    cb.endText();



    cb.moveTo(0, 30);
    cb.lineTo(600, 30);
    cb.moveTo(0, 820);
    cb.lineTo(600, 820);
    cb.stroke();

    cb.addTemplate(template, 280 + len, 20);
}

// we override the onCloseDocument method
public void onCloseDocument(PdfWriter writer, Document document) {
    template.beginText();
    template.setFontAndSize(bf, 8);
    template.showText(String.valueOf(writer.getPageNumber() - 1));
    template.endText();
}

如何在pdf的第一页中获取(总页数* costofpage)?我应该在哪里放置代码来实现这个目标?

3 个答案:

答案 0 :(得分:2)

你可以:

  1. 在内存中创建PDF(在ByteArrayOutputStream上创建)
  2. 处理它以添加页眉/页脚
  3. 使用水印
  4. 在内存中创建新的PDF
  5. 再次处理PDF以合并第一页上的水印+页数。 PDFStamper应该提供帮助。

答案 1 :(得分:2)

@Shamit那会起作用,但是有一种更有效的方法可以做同样的事情。

在SM09的OnEndPage:

    if (this is the first page) {
      create two templates, one for the "page x of y" and one for the pricing info
      add them to the page
    } else {
      create the one template as usual.
      add it to the page
    }

在OnCloseDocument中,您只需更新两个模板,而不是更新模板。原始模板已存在于所有页面上,但新模板仅位于第一页上。

答案 2 :(得分:0)

我必须查找详细的代码,但是我会创建文档,并且一旦完成使用标记将该信息添加到第一页。

HTH

马里奥