itextsharp修改现有pdf(没有新的源pdf)并添加水印
本文关键字:pdf 添加 修改 itextsharp | 更新日期: 2023-09-27 18:27:53
我想修改现有的pdf文档并添加水印图像。如果不创建一个新文件,我怎么能做到这一点?
我认为创建一个临时pdf是一个愚蠢的解决方案。删除源文件并像源文件一样重命名临时pdf!?
这是我的示例代码,但在那里我正在创建一个新的目标文件。
问候
private static void PdfApplication(String filePath) {
PdfReader pdfReader = new PdfReader(filePath);
Stream outputStream = new FileStream(newFilePath, FileMode.Open, FileAccess.Write, FileShare.None);
PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream,'1', true);
for (int pageIndex = 1; pageIndex <= pdfReader.NumberOfPages; pageIndex++) {
pdfStamper.FormFlattening = false;
iTextSharp.text.Rectangle pageRectangle = pdfReader.GetPageSizeWithRotation(pageIndex);
PdfContentByte pdfData = pdfStamper.GetOverContent(pageIndex);
pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 10);
PdfGState graphicsState = new PdfGState();
graphicsState.FillOpacity = 0.4F;
pdfData.SetGState(graphicsState);
pdfData.BeginText();
FileStream fileStreamImage = new FileStream(watermark.jpg", FileMode.Open);
iTextSharp.text.Image jpeg = iTextSharp.text.Image.GetInstance(System.Drawing.Image.FromStream(fileStreamImage), ImageFormat.Jpeg);
float width = pageRectangle.Width;
float height = pageRectangle.Height;
jpeg.ScaleToFit(width, height);
jpeg.SetAbsolutePosition(width / 2 - jpeg.Width / 2, height / 2 - jpeg.Height / 2);
jpeg.SetAbsolutePosition(50, 50);
jpeg.Rotation = 250;
pdfData.AddImage(jpeg);
pdfData.EndText();
}
pdfStamper.Close();
outputStream.Close();
outputStream.Dispose();
}
iTextSharp不用于就地编辑文件。如果在编写更改时出现异常,该怎么办?在这个过程中,您会丢失旧文件和新文件。即使iTextSharp是100%无错误的,用户代码仍然可以破坏它。还有一些边缘情况,比如你通过添加一堆图像将1MB的文件扩展到10GB,然后驱动器上的空间就用完了。iTextSharp可靠测试这些情况的唯一方法是实际编写一个文件。
还有测试。每当我编辑一个文件时,我总是想将输入文件与输出文件进行比较。如果iTextSharp不断擦除我的输入文件,我将不得不不断地从另一个位置复制它,我可能每小时要做几十次。
所以这些就是为什么。但是有一种方法可以做你想做的事情。PdfReader
的构造函数之一是一个字节数组,只需将System.IO.File.ReadAllBytes(filePath)
传递给它。由于这些字节不再与磁盘绑定,你现在可以向它写入。
第二个选项是写入MemoryStream
,在其上调用.ToArray()
,然后在关闭PdfReader
之后调用System.IO.File.WriteAllBytes(filePath, bytes)
。
Imports System.IO
Imports PdfSharp.Pdf
Imports PdfSharp.Pdf.IO
Imports PdfSharp.Drawing
Dim doc = ReturnCompatiblePdf(path_of_pdf_file)
Dim document As New PdfDocument
document = PdfReader.Open(doc, PdfDocumentOpenMode.Modify)
Dim watermark As String = "This is my watermark"
For Each page_ As PdfPage In document.Pages
Dim gfx As XGraphics = XGraphics.FromPdfPage(page_, XGraphicsPdfPageOptions.Append)
Dim fontx As New XFont("Trebuchet MS", 8, FontStyle.Bold)
Dim posx, posy As Double
posx = (page_.Width.Value - watermark.Length) / 2
posy = page_.Height.Value - 8
gfx.TranslateTransform(posx, posy)
gfx.DrawString(watermark, fontx, XBrushes.Black, New XPoint(1, 1), XStringFormats.Default)
Next
If File.Exists(save_path) = False Then
document.Save(save_path)
End If