Показывать количество страниц в PDF, сгенерированном с использованием itext только на первой - PullRequest
1 голос
/ 31 марта 2011

Я создаю PDF-файл, используя itext 2.1.7 и Java-сервлеты, где я вставляю верхний и нижний колонтитулы, переопределяя PdfpageEvents на onEndPage и onCloseDocument, и я успешно могу поместить страницу v X из Y в заголовок /Нижний колонтитул

Теперь я хочу рассчитать стоимость страниц (т.е. стоимость печати).Так что для этого мне нужно найти нет.страниц в pdf (т. е. предположим, что печать страницы стоит 3 Мне нужно рассчитать сумму (3 * общее количество страниц в pdf) для всего pdf), и выгода составляет Мне также нужно отобразить стоимостьна первой странице и только на первой странице того же pdf .

Я пытался напечатать его в onCloseDocument, но это напечатало стоимость на каждой странице

Какя могу это сделать, есть ли что-то, что я делаю неправильно?

Здесь код файла сервлета, который создает файл PDF

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();
}

Что я должен сделать, чтобы получить (общее количество страниц * costofpage) на первой странице pdf?Где я должен поставить код для достижения этого?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Вы можете:

  1. Создать PDF в памяти (создать его в ByteArrayOutputStream)
  2. Обработать его, чтобы добавить верхний / нижний колонтитул
  3. Создать новый PDF-файлв памяти с водяным знаком
  4. Снова обработайте PDF, чтобы объединить водяной знак + количество страниц на первой странице.PDFStamper должен помочь с этим.
2 голосов
/ 01 апреля 2011

@ Shamit Это сработает, но есть более эффективный способ сделать то же самое.

В OnEndPage SM09:

    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 вы просто обновляете оба шаблона, а не один. Оригинальный шаблон уже присутствует на всех страницах, но новый будет только на первой странице.

0 голосов
/ 01 апреля 2011

Мне нужно было бы найти подробный код, но я бы создал документ и однажды использовал штамп, чтобы добавить эту информацию только на первую страницу.*

...