我想在不创建另一个pdf文件的情况下为pdf文件添加水印

时间:2012-06-01 07:18:14

标签: c# asp.net c#-2.0 itextsharp

我想将图片转换为PDF并为其添加水印。我使用iTextSharp来转换它。我成功地将图像文件转换为pdf但我无法在不创建其他pdf文件的情况下为其添加水印。

以下代码创建PDF文件并添加自定义属性, 函数watermarkpdf用于添加水印,pdfname作为参数

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();

1 个答案:

答案 0 :(得分: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);
//...