2012-06-01 81 views
1

我想將圖像轉換爲PDF併爲其添加水印。我用iTextSharp來轉換它。我成功地將圖像文件轉換爲pdf,但是我無法添加水印而不創建另一個PDF文件。我想水印一個PDF文件,而無需創建另一個PDF文件

下面的代碼創建一個PDF文件,還增加了自定義屬性, 功能watermarkpdf用於添加水印和pdfname給出的arguement

foreach (string filenm in Images) 
    using (var imageStream = new FileStream(filenm, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     doc.NewPage(); 

     iTextSharp.text.Image jpeg = iTextSharp.text.Image.GetInstance(filenm); 
     float width = doc.PageSize.Width; 
     float height = doc.PageSize.Height; 
     jpeg.ScaleToFit(width,height); 
     doc.Add(jpeg); 
    } 
    doc.AddHeader("name", "vijay"); 
    watermarkpdf(pdfname); 

watermarkpdf功能如下。

PdfReader pdfReader = new PdfReader(txtpath.Text+"\\pdf\\" + pdfname); 
FileStream stream = new FileStream(txtpath.Text + pdfname,FileMode.Open); 
PdfStamper pdfStamper = new PdfStamper(pdfReader, stream); 
for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) 
{ 
    Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex); 
    PdfContentByte pdfData = pdfStamper.GetUnderContent(pageIndex); 
    pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 40); 
    PdfGState graphicsState = new PdfGState(); 
    graphicsState.FillOpacity = 0.4F; 
    pdfData.SetGState(graphicsState); 
    pdfData.SetColorFill(BaseColor.BLUE); 
    pdfData.BeginText(); 
    pdfData.ShowTextAligned(Element.ALIGN_CENTER, "SRO-Kottarakkara", pageRectangle.Width/2, pageRectangle.Height/2, 45); 
    pdfData.EndText(); 
} 
pdfStamper.Close(); 
stream.Close(); 
+0

只需刪除原始PDF並重新命名爲具有相同的名稱。 – Ben

回答

2

iTextSharp不支持文件的「就地編輯」,只讀取現有文件和創建新文件。問題在於它必須寫入正在寫入的內容,這可能是非常有問題的。

但是,不要使用文件,您可以在MemoryStream中創建圖像,從中獲取字節並將其傳送到PdfReader,所有這些操作只需對代碼進行最小限度的更改。所有采用文件的PDF編寫功能實際上都與抽象的Stream類一起工作,並且其中的MemoryStream繼承於此,因此它們可以互換使用。下面是一些基本的代碼,應該告訴你我在說什麼。我目前沒有IDE,所以可能會有一兩個錯字,但大多數情況下它應該起作用。

//Image part 
//We will dump the bytes from the memory stream to the variable below later 
byte[] bytes; 
using (MemoryStream ms = new MemoryStream()){ 
    Document doc = new Document(PageSize.LETTER); 
    PdfWriter writer = PdfWriter.GetInstance(doc, ms); 
    doc.Open(); 
    //foreach (string filenm in Images) 
    //... 
    doc.Close(); 
    //Dump the bytes, make sure to use ToArray() and not GetBuffer() 
    bytes = ms.ToArray(); 
} 

//Watermark part 
//Read from our bytes 
PdfReader pdfReader = new PdfReader(bytes); 
FileStream stream = new FileStream(txtpath.Text + pdfname,FileMode.Open); 
//... 
相關問題