2010-11-01 38 views
3

我想創建一個PdfWriter對象併爲Header和Footer設置Events。 如果我創建一個新的PDF,問題是它的工作原理。但我的問題是我已經在輸出流中有PDF。請在下面找到我的示例代碼。PdfWriter and Events

Document document = new Document(); 
    try { 
     // step 2: 
     FileInputStream is = new FileInputStream("D://2.pdf"); 
     int nRead; 
     byte[] data = new byte[16384]; 
     ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
     while ((nRead = is.read(data, 0, data.length)) != -1) { 
      buffer.write(data, 0, nRead);   
     } 

     buffer.flush(); 
     PdfWriter writer = PdfWriter.getInstance(document,buffer); 
     writer.setViewerPreferences(PdfWriter.PageLayoutTwoColumnLeft); 
     writer.setPageEvent(new DossierPortalUtil()); 

     document.setMargins(36, 36, 54, 72); 
     // step 3: 
     document.open(); 

     document.add(new Chunk("testing")); 

    } catch (Exception de) { 
     de.printStackTrace(); 
    } 
    finally{ 
     document.close(); 
    } 

如果我評論線

document.add(new Chunk("testing")); 

我得到一個異常的線程

異常 「主要」 ExceptionConverter:java.io.IOException異常:該文件有沒有頁面。

沒有評論,沒有例外,但它沒有添加頁眉和頁腳。任何線索都非常感謝。

問候, 蒂娜

enter code here 

回答

3

沒錯。

您正試圖使用​​PdfStamper修改現有的PDF,其格式爲PdfWriter

使用壓模添加文字比使用PdfWriterDocument這樣做要少得多。

您需要創建一個ColumnText對象,並通過調用myStamper.getOverContent(pageNum)獲取PdfContentByte

您將段落/塊/ etc添加到ColumnText,並將其傳遞給PdfContentByte(以及一些位置參數)以繪製文本。

或者,你可以創建你的文字(和其他東西)一個單獨的PDF,然後用PdfStamper & PdfImportedPage導入這些頁面並把它們寫在現有的頂部。 PDF頁面背景是透明的,直到你在它們上面畫一些東西,所以文本(和東西)會出現在現有頁面的頂部。這明顯效率較低,因爲第二個文檔必須轉換爲PDF語法的字節數組(如果您使用ByteArrayOutputStream而不是寫入文件,這會更慢),再次解析,然後添加到原始文檔並第二次寫出。

使用ColumnText值得花一點額外的努力。

您還需要直接使用PdfContentByte調用來編寫頁眉和頁腳,但必須在PdfPageEvent之內執行此操作,因此這些更改應該非常簡單。

+0

感謝馬克。我得到了它的工作。但是現在我面臨的問題是 - 它不是寫頭文件。雖然我做了一個getOverContent和一個getUnderContent,然後添加表格,但不知怎的,頭文件沒有被寫入。有什麼建議嗎? – 2010-11-03 06:50:17