2011-05-16 113 views
2

我使用servlet查看PDF文件,如使用響應setContentType pdf。iText5.1.0在文檔中設置頁眉和頁腳

我想設置由IText 5.1.0生成的文檔的頁眉和頁腳。

請幫忙..

+0

可能重複(http://stackoverflow.com/questions/5062898/add-header-to-pdf-using-itext) – I82Much 2011-05-17 22:02:24

回答

5

忘掉一秒鐘的servlet。確保你可以讓頁眉/頁腳在本地工作。

編輯:我是一個不好的SO用戶發佈過時的HeaderFooter的東西。似乎很多人都這樣做,使得找到這個問題的簡潔例子變得非常困難。 add header to pdf using iText回答了這個問題。

這裏似乎是正確的方法來做到這一點:(來自http://itextpdf.com/examples/iia.php?id=104修改):的[添加報頭以利用iText PDF] enter image description here https://gist.github.com/977502

/* 
* This class is part of the book "iText in Action - 2nd Edition" 
* written by Bruno Lowagie (ISBN: 9781935182610) 
* For more info, go to: http://itextpdf.com/examples/ 
* This example only works with the AGPL version of iText. 
* 
* Modified by Nick Dunn (http://developmentality.wordpress.com) to 
* focus on just the PDF header aspect. 
*/ 

package part1.chapter05; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Set; 
import java.util.TreeSet; 

import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Element; 
import com.itextpdf.text.ExceptionConverter; 
import com.itextpdf.text.Image; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.Phrase; 
import com.itextpdf.text.Rectangle; 
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; 

public class MovieCountries1 { 

    /** The resulting PDF file. */ 
    public static final String RESULT 
     = "example_result.pdf"; 

    /** 
    * Inner class to add a table as header. 
    */ 
    class TableHeader extends PdfPageEventHelper { 
     /** The header text. */ 
     String header; 
     /** The template with the total number of pages. */ 
     PdfTemplate total; 

     /** 
     * Allows us to change the content of the header. 
     * @param header The new header String 
     */ 
     public void setHeader(String header) { 
      this.header = header; 
     } 

     /** 
     * 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(3); 
      try { 
       table.setWidths(new int[]{24, 24, 2}); 
       table.setTotalWidth(527); 
       table.setLockedWidth(true); 
       table.getDefaultCell().setFixedHeight(20); 
       table.getDefaultCell().setBorder(Rectangle.BOTTOM); 
       table.addCell(header); 
       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); 
     } 
    } 

    /** 
    * Creates a PDF document. 
    * @param filename the path to the new PDF document 
    * @throws DocumentException 
    * @throws IOException 
    * @throws SQLException 
    */ 
    public void createPdf(String filename) 
     throws IOException, DocumentException, SQLException { 

     // step 1 
     Document document = new Document(PageSize.A4, 36, 36, 54, 36); 
     // step 2 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT)); 
     TableHeader event = new TableHeader(); 
     writer.setPageEvent(event); 
     // step 3 - fill in the document 
     document.open(); 

     event.setHeader("Hello!"); 
     document.add(new Paragraph("Testing.")); 
     document.newPage(); 
     event.setHeader("There!"); 
     document.add(new Paragraph("Testing.")); 

     document.close(); 
    } 

    /** 
    * Main method. 
    * 
    * @param args no arguments needed 
    * @throws DocumentException 
    * @throws IOException 
    * @throws SQLException 
    */ 
    public static void main(String[] args) 
     throws IOException, DocumentException, SQLException { 
     new MovieCountries1().createPdf(RESULT); 
    } 
} 
+4

答:不錯的建議:「忘記第二個servlet」。在將它們添加到組合中之前,始終讓您的應用程序在servlet之外工作。 – 2011-05-17 20:54:12

+0

B:HeaderFooter在相當長的一段時間內並未成爲iText的一部分。當然不是5.1的一部分。 – 2011-05-17 20:55:07

+0

@Mark Storer感謝您的信息,我相應地更新了我的答案。 – I82Much 2011-05-17 22:02:06