itextsharp修改现有的pdf(没有新的源代码pdf)并添加水印
我想修改现有的pdf文档并添加水印图像。 如何在不创建新文件的情况下执行此操作?
我认为创建临时pdf是一个愚蠢的解决方案。 删除源文件并重命名temp 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不适用于就地编辑文件。 如果在编写更改时有exception怎么办? 在此过程中,您将丢失旧文件和新文件。 即使iTextSharp 100%没有bug,用户代码仍然可以破解它。 然后是边缘情况,例如通过添加一堆图像并在驱动器上用尽空间将1MB文件增加到10GB。 iTextSharp可靠地测试这些情况的唯一方法是实际编写一个文件。
还有测试。 每当我编辑文件时,我总是想将输入文件与输出文件进行比较。 如果iTextSharp保持删除我的输入文件,我将不得不从另一个位置复制它,我可能每小时要做几十次。
所以这些都是为什么。 但是有一种方法可以做你想做的事。 PdfReader
的构造函数PdfReader
是字节数组,只需将System.IO.File.ReadAllBytes(filePath)
传递给它。 由于这些字节不再与磁盘绑定,您现在可以写入它。
第二个选项是写入MemoryStream
,在其上调用.ToArray()
然后关闭PdfReader
调用System.IO.File.WriteAllBytes(filePath, bytes)
。
链接为pdfsharp dll ‘导入此内容
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