僅添加一次背景是正常的,因爲您只添加一次。
如果你想添加內容到每一頁,你不應該這樣做手動,因爲你不知道什麼時候iText會創建一個新頁面。相反,你應該使用頁面事件。這在Chapter 5 of my book(對於示例的C#版本,參見http://tinyurl.com/itextsharpIIA2C05)中有解釋。
一個很好的例子可以在Stationery示例中找到在第6章:Stationery.cs
的想法是通過擴展PdfPageEventHelper
類並覆蓋OnEndPage()
方法創建PdfPageEvent
接口的實現,例如:
class TemplateHelper : PdfPageEventHelper {
private Stationery instance;
public TemplateHelper() { }
public TemplateHelper(Stationery instance) {
this.instance = instance;
}
/**
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
* com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
*/
public override void OnEndPage(PdfWriter writer, Document document) {
writer.DirectContentUnder.AddTemplate(instance.page, 0, 0);
}
}
在這種情況下,我們添加一個PdfTemplate
,但它是很容易的添加Image
與Image
實例替換Stationery
實例和更換AddTemplate()
方法與AddImage()
方法。
一旦你有你的自定義頁面事件的情況下,你需要將其申報爲PdfWriter
實例:
writer.PageEvent = new TemplateHelper(this);
從這以後,你OnEndPage()
方法將每一個頁面被最終確定的時間執行的那一刻。
警告:如記錄你不得使用OnStartPage()
方法在一個頁面事件中添加內容!
更新:
最後的結果看起來或多或少是這樣的:
class ImageBackgroundHelper : PdfPageEventHelper {
private Image img;
public ImageBackgroundHelper(Image img) {
this.img = img;
}
/**
* @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
* com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
*/
public override void OnEndPage(PdfWriter writer, Document document) {
writer.DirectContentUnder.AddImage(img);
}
}
現在你可以使用這個事件是這樣的:
string imageFilePath = parent + "/Images/bg_image.jpg";
iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(imageFilePath);
jpg.ScaleToFit(1700, 1000);
jpg.SetAbsolutePosition(0, 0);
writer.PageEvent = new ImageBackgroundHelper(jpg);
注意1700和1000似乎相當大。你確定這些是你網頁的尺寸嗎?
我一直有錯誤,說「ImageBackgroundHelper不包含一個構造函數,需要1參數」的代碼writer.PageEvent = new ImageBackgroundHelper(jpg); – dandy 2014-11-01 12:06:13
我可以清楚地看到構造函數:'public ImageBackgroundHelper(Image img){this.img = img; }'請不要釣魚StackOverflow! – 2014-11-01 12:33:40