繁体   English   中英

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

[英]Show the number of pages in a pdf generated using itext only on the first page

我正在使用itext 2.1.7和java servlets创建一个PDF文件,我通过覆盖PdfpageEvents插入页眉和页脚onEndPageonCloseDocument我成功地将页面/页脚中的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)? 我应该在哪里放置代码来实现这一目标?

您可以:

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

@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中,您只需更新两个模板,而不是更新模板。 原始模板已存在于所有页面上,但新模板仅在第一页上。

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

心连心

马里奥

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM