2012-06-26 2 views
1

Я создаю несколько отчетов PDF с помощью iText в Java. В соответствии с требованиями, я должен сделать, чтобы число страниц в формате page_number/page_numbers_in_total.Нумерация PDF-страниц в Java и iText

Однако операции с памятью несут мой проект. Следовательно, я не хочу снова просматривать все страницы, чтобы их пронумеровать. Есть ли способ достижения этого?

ответ

6

Посмотрите this example, который задает подобный заголовок («Страница X из Y»):

Вы увидите, что метод onEndPage печатает «страницу Х» и onCloseDocument метод устанавливает «Y» на всех страницах через PdfTemplate.

+0

Любая идея, как это сделать в iText7 ...? Я пытаюсь найти подобный пример! –

1

Ответ, который корректно работает для меня. Я только что потратил много времени на реорганизацию кода (размер шрифта, положение) и его применимость ко всем существующим файлам PDF.

Обратите внимание, что номер страницы находится в нижнем правом углу страницы, а дополнительный текст находится в левом нижнем углу.

Ниже приведен код класса PageNumeration, созданный с использованием предыдущего комментария для этой цели.

package demo; 

import com.itextpdf.text.BaseColor; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Element; 
import com.itextpdf.text.ExceptionConverter; 
import com.itextpdf.text.Font; 
import com.itextpdf.text.Image; 
import com.itextpdf.text.Phrase; 
import com.itextpdf.text.Rectangle; 
import com.itextpdf.text.pdf.BaseFont; 
import com.itextpdf.text.pdf.ColumnText; 
import com.itextpdf.text.pdf.PdfPCell; 
import com.itextpdf.text.pdf.PdfPTable; 
import com.itextpdf.text.pdf.PdfPageEventHelper; 
import com.itextpdf.text.pdf.PdfTemplate; 
import com.itextpdf.text.pdf.PdfWriter; 

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

private Font normal, normalSmall; 
private Company company; 

public PageNumeration(){ 
    try{ 
     this.normal = new Font(BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 8); 
     this.normalSmall = new Font(BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 6); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* 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, 12); 
} 

/** 
* 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(3); 
    try { 
     table.setWidths(new int[]{24, 24, 2}); 
     table.getDefaultCell().setFixedHeight(10); 
     table.getDefaultCell().setBorder(Rectangle.TOP); 
     PdfPCell cell = new PdfPCell(); 
     cell.setBorder (0); 
     cell.setBorderWidthTop (1); 
     cell.setHorizontalAlignment(Element.ALIGN_LEFT); 
     cell.setPhrase(new Phrase("some text", normalSmall)); 
     table.addCell(cell); 

     cell = new PdfPCell(); 
     cell.setBorder (0); 
     cell.setBorderWidthTop (1); 
     cell.setHorizontalAlignment(Element.ALIGN_RIGHT); 
     cell.setPhrase(new Phrase(String.format("Page %d of", writer.getPageNumber()), normal)); 
     table.addCell(cell); 

     cell = new PdfPCell(Image.getInstance(total)); 
     cell.setBorder (0); 
     cell.setBorderWidthTop (1); 
     table.addCell(cell); 
     table.setTotalWidth(document.getPageSize().getWidth() 
       - document.leftMargin() - document.rightMargin()); 
     table.writeSelectedRows(0, -1, document.leftMargin(), 
       document.bottomMargin() - 15, 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), normal), 
      2, 2, 0); 
    } 
} 

После того, как вы создали этот класс, просто введите его в свой класс PDF и установите событие чуть ниже определения записи.

writer = PdfWriter.getInstance(document, new FileOutputStream("somepath/somedir/file.pdf")); 
PageNumeration event = new PageNumeration(this.company); 
writer.setPageEvent(event); 

Надеюсь, что это поможет.

Смежные вопросы