2012-06-01 82 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); 
//... 
相关问题