1

我想将图像转换为 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();
4

1 回答 1

2

iTextSharp 不支持文件的“就地编辑”,仅读取现有文件并创建新文件。问题是它必须写入正在写入的东西,这可能是非常有问题的。

但是,您可以在 a 中创建图像,而不是使用文件,从中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);
//...
于 2012-06-01T13:19:31.690 回答