2015-02-04 44 views
-2

我們在我們的應用程序中使用了用於PDF生成任務的itextpdf和xmlworker API(itextpdf-5.1.1.jar,Xmlworker-1.1.0.jar)。我們從XML-XSLT轉換生成HTML內容,然後使用HTML內容創建PDF文檔。ItextPdf中的分頁

當我們試圖實現分頁(作爲3中的1,2 ..)時,我們從itextpdf在線樣本中學習到,除了我們創建的PDF文檔之外,我們總是需要創建一個生成的PDF文檔,以便在每個頁面內容上標記頁碼。

這種方法帶來了刪除中間pdf文檔的挑戰。在我們第一次創建pdf的時候,是否有任何方法可以確定頁碼,以便我們避免創建一個由此產生的pdf文檔?

感謝 Venkat

class TableFooter extends PdfPageEventHelper {   
     String header;   
     PdfTemplate total; 

     public void setHeader(String header) {    
      this.header = header; 
     } 

     public void onOpenDocument(PdfWriter writer, Document document) { 
      total = writer.getDirectContent().createTemplate(30, 16); 

     } 

     public void onEndPage(PdfWriter writer, Document document) { 
      Font ffont = new Font(Font.FontFamily.UNDEFINED, 7, Font.NORMAL); 
      PdfPTable table = new PdfPTable(2); 
      try 
      { 
       table.setWidths(new int[]{1,1}); 
       table.setTotalWidth(50); 
       table.getDefaultCell().setFixedHeight(15); 
       table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); 
       Phrase footer = new Phrase(String.format("%d of", writer.getPageNumber()), ffont); 
       table.addCell(footer);     
       PdfPCell cell = new PdfPCell(Image.getInstance(total)); 
       table.addCell(cell); 
       table.writeSelectedRows(0, -1, 275, 20, writer.getDirectContent()); 
      } 
      catch(Exception de) { 
       throw new ExceptionConverter(de); 
      } 
     } 

     public void onCloseDocument(PdfWriter writer, Document document) {    
     ColumnText.showTextAligned(total, Element.ALIGN_LEFT, new Phrase(String.valueOf(writer.getPageNumber() - 1)), 10, 4, 0); 
     } 
    } 

回答

1

請下載免費的電子書The Best iText Questions on StackOverflow和閱讀題爲「頁面中的事件」一章中列出的問題。這些都是一些被選定爲這本書的問題:

您也可以看看keywords page官方iText網站,更具體地說,關鍵詞Page X of Y

在你的問題中,你指的是創建一箇中間文檔。這就是TwoPasses的例子。您正在尋求一種方法來一次添加Y頁面X的Y。這就是MovieCountries1的例子。

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

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

正如你所看到的,我們建立onOpenDocument()方法命名total小的佔位符。由於我們事先不知道頁面總數是多少,因此我們將此佔位符添加到每個頁面,而不知道頁面總數是。當我們關閉文檔時,我們只知道最後一頁的頁數,這就是爲什麼我們要等到onCloseDocument()方法被觸發才能將內容添加到佔位符。

+0

感謝Bruno Lowagie對單個通過實現Y素材第X頁的詳細解釋。由於我們使用XML-XSLT-HTMLContent方法生成PDF文檔,因此我們嘗試的類似於MovieCountries1的示例程序在標頭上創建了Y的Page X。是否有任何示例將Y的頁面X放在頁腳區域?你能指點我一個樣品嗎? – VenkatRam

+0

不需要額外的樣本。添加額外內容時只需更改座標。將803替換爲20(取決於您決定頁腳的位置)。 –

+0

感謝Bruno Lowagie。我們嘗試更改示例中的座標,但沒有任何幫助將頁面的總數(Y)更接近於X. – VenkatRam