itextsharp modifie le pdf existant (pas de nouveau pdf source) et ajoute un filigrane

Je souhaite modifier un document pdf existant et append une image en filigrane. Comment puis-je faire cela sans créer un nouveau fichier?

Je pense que c’est une solution stupide pour créer un pdf temporaire. Supprimez le fichier source et renommez le pdf temporaire comme le fichier source!?

Voici mon exemple de code mais là je crée un nouveau fichier de destination.

Cordialement

private static void PdfApplication(Ssortingng 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 n’est pas destiné à être utilisé pour éditer des fichiers sur place. Et si, pendant la rédaction de vos modifications, il y avait une exception? Vous perdriez à la fois votre ancien et votre nouveau fichier. Même si iTextSharp était 100% exempt de bogues, le code utilisateur pourrait quand même le casser. Et puis, il y a les cas extrêmes tels que le fait de transformer un fichier de 1 Mo à 10 Go en ajoutant un tas d’images et de manquer d’espace sur un lecteur. Le seul moyen pour iTextSharp de tester ces cas de manière fiable consiste à écrire un fichier.

Il y a aussi des tests. Chaque fois que je modifie un fichier, je veux toujours comparer mon fichier d’entrée à mon fichier de sortie. Si iTextSharp n’arrêtait pas d’effacer mon fichier d’entrée, je devais constamment le copier depuis un autre emplacement, ce que je devrais peut-être faire des dizaines de fois par heure.

Voilà donc pourquoi. Mais il existe un moyen de faire ce que vous voulez faire. L’un des constructeurs de PdfReader est un tableau d’octets. PdfReader y simplement System.IO.File.ReadAllBytes(filePath) . Puisque ces octets ne sont plus liés au disque, vous pouvez maintenant y écrire.

Une seconde option est d’écrire sur un MemoryStream place, appelez-le .ToArray() dessus, puis après avoir fermé l’appel System.IO.File.WriteAllBytes(filePath, bytes) .

lien pour pdfsharp dll ‘importer cette

 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 Ssortingng = "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.DrawSsortingng(watermark, fontx, XBrushes.Black, New XPoint(1, 1), XSsortingngFormats.Default) Next If File.Exists(save_path) = False Then document.Save(save_path) End If