2013-05-19 91 views
1

我使用iText 5.3.5創建PDF文檔。現在我正試圖在文檔的每一頁上獲得一個矩形,但我不確定如何執行此操作。我試圖在我的代碼的末尾添加這個(我發現它在互聯網上):如何使用iText在文檔的每個頁面上添加Rectangle?

PdfContentByte cb = writer.getDirectContent(); 
for (int pgCnt = 1; pgCnt <= writer.getPageNumber(); pgCnt++) { 
    cb.saveState(); 
    cb.setColorStroke(new CMYKColor(1f, 0f, 0f, 0f)); 
    cb.setColorFill(new CMYKColor(1f, 0f, 0f, 0f)); 
    cb.rectangle(20,10,10,820); 
    cb.fill(); 
    cb.restoreState(); 
}  

但這只是增加了長方形的最後一頁上,因爲我沒有使用pgCnt樣的意義任何地方。我如何指定我想要頁面編號pgCnt上的矩形,所以我可以在每個頁面上添加矩形?

希望我解釋一下自己。在此先感謝您的幫助。 :)

+0

我假設你在互聯網上找到的代碼與一些'PdfStamper'編輯已經存在的PDF一起使用,而你使用'PdfWriter'將它添加到代碼中創建一個新的PDF。在這種情況下,示例代碼不僅應該使用一次,而應該每頁使用一次(通過頁面事件偵聽器)。 – mkl

回答

1

請查看官方iText站點上關鍵字Page events的條目。您需要擴展PdfPageEventHelper類,並將您的代碼添加到onEndPage()方法中。

public void onEndPage(PdfWriter writer, Document document) { 
    PdfContentByte cb = writer.getDirectContent(); 
    cb.saveState(); 
    cb.setColorStroke(new CMYKColor(1f, 0f, 0f, 0f)); 
    cb.setColorFill(new CMYKColor(1f, 0f, 0f, 0f)); 
    cb.rectangle(20,10,10,820); 
    cb.fill(); 
    cb.restoreState(); 
} 

創建自定義的頁面事件類的實例,並打開文件之前申報的作家:

writer.setPageEvent(myPageEventInstance); 

現在您的矩形將在每一頁上繪製,在現有的頂部內容。如果您需要現有內容下的矩形:請用getDirectContentUnder()替換getDirectContent()

如果你需要一些工作源代碼,請看Stationery例子。請在將來諮詢iText官方網站,而不是說你已經在「互聯網」上發現了某些東西,而沒有提及源代碼。

+0

非常感謝你,它完美的作品。 :) –

+0

什麼是cb.restoreState(); ? –

+0

@DurgeshPandey在我們改變狀態(我們定義了新的筆觸和填充顏色)之前,我們使用了'saveState()'。一旦我們完成了使用這些顏色繪製內容,我們通過使用'restoreState()'返回原始狀態(在顏色改變之前)。如果不先使用'saveState()',則不能使用'restoreState()'。如果稍後不使用'saveState()',則不應使用'restoreState()'。 –

相關問題