Saltar al contenido

c# itextsharp creación de PDF con marca de agua en cada página

Estate atento ya que en esta sección vas a hallar el hallazgo que buscas.Este post ha sido analizado por nuestros especialistas para garantizar la calidad y exactitud de nuestro post.

Solución:

Después de investigarlo, encontré que la mejor manera era agregar la marca de agua a cada página a medida que se creaba. Para hacer esto, creé una nueva clase e implementé la interfaz IPdfPageEvent de la siguiente manera:

    class PdfWriterEvents : IPdfPageEvent
    
        string watermarkText = string.Empty;

        public PdfWriterEvents(string watermark) 
        
            watermarkText = watermark;
        

        public void OnOpenDocument(PdfWriter writer, Document document)  
        public void OnCloseDocument(PdfWriter writer, Document document)  
        public void OnStartPage(PdfWriter writer, Document document) 
            float fontSize = 80;
            float xPosition = 300;
            float yPosition = 400;
            float angle = 45;
            try
            
                PdfContentByte under = writer.DirectContentUnder;
                BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);
                under.BeginText();
                under.SetColorFill(BaseColor.LIGHT_GRAY);
                under.SetFontAndSize(baseFont, fontSize);
                under.ShowTextAligned(PdfContentByte.ALIGN_CENTER, watermarkText, xPosition, yPosition, angle);
                under.EndText();
            
            catch (Exception ex)
            
                Console.Error.WriteLine(ex.Message);
            
        
        public void OnEndPage(PdfWriter writer, Document document)  
        public void OnParagraph(PdfWriter writer, Document document, float paragraphPosition)  
        public void OnParagraphEnd(PdfWriter writer, Document document, float paragraphPosition)  
        public void OnChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title)  
        public void OnChapterEnd(PdfWriter writer, Document document, float paragraphPosition)  
        public void OnSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title)  
        public void OnSectionEnd(PdfWriter writer, Document document, float paragraphPosition)  
        public void OnGenericTag(PdfWriter writer, Document document, Rectangle rect, String text)  

    
}

Este objeto está registrado para manejar los eventos de la siguiente manera:

PdfWriter docWriter = PdfWriter.GetInstance(document, new FileStream(outputLocation, FileMode.Create));
PdfWriterEvents writerEvent = new PdfWriterEvents(watermark);
docWriter.PageEvent = writerEvent;

Aunque la solución de Tim parece muy buena, logré hacer lo mismo (creo) usando el siguiente código (quizás iTextSharp mejoró un poco desde entonces…):

    private byte[] AddWatermark(byte[] bytes, BaseFont bf)
    
        using(var ms = new MemoryStream(10 * 1024))
        
            using(var reader = new PdfReader(bytes))
            using(var stamper = new PdfStamper(reader, ms))
            
                int times = reader.NumberOfPages;
                for (int i = 1; i <= times; i++)
                
                    var dc = stamper.GetOverContent(i);
                    PdfHelper.AddWaterMark(dc, AppName, bf, 48, 35, new BaseColor(70, 70, 255), reader.GetPageSizeWithRotation(i));
                
                stamper.Close();
            
            return ms.ToArray();
        
    

    public static void AddWaterMark(PdfContentByte dc, string text, BaseFont font, float fontSize, float angle, BaseColor color, Rectangle realPageSize, Rectangle rect = null)
    
        var gstate = new PdfGState  FillOpacity = 0.1f, StrokeOpacity = 0.3f ;
        dc.SaveState();
        dc.SetGState(gstate);
        dc.SetColorFill(color);
        dc.BeginText();
        dc.SetFontAndSize(font, fontSize);
        var ps = rect ?? realPageSize; /*dc.PdfDocument.PageSize is not always correct*/
        var x = (ps.Right + ps.Left) / 2;
        var y = (ps.Bottom + ps.Top) / 2;
        dc.ShowTextAligned(Element.ALIGN_CENTER, text, x, y, angle);
        dc.EndText();
        dc.RestoreState();
    

Esto agregará una marca de agua en todas las páginas de un documento PDF que se proporciona como un byte array.

(No necesita hacerlo mientras crea el PDF).

Parece funcionar tanto para paisaje como para retrato y probablemente funcione para documentos con mixed orientaciones.

¡Salud! 🙂

string WatermarkLocation = "D:\Images\superseded.png";

    Document document = new Document();
    PdfReader pdfReader = new PdfReader(FileLocation);
    PdfStamper stamp = new PdfStamper(pdfReader, new FileStream(FileLocation.Replace(".pdf", "[temp][file].pdf"), FileMode.Create));

    iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(WatermarkLocation);
    img.SetAbsolutePosition(125, 300); // set the position in the document where you want the watermark to appear (0,0 = bottom left corner of the page)



    PdfContentByte waterMark;
    for (int page = 1; page <= pdfReader.NumberOfPages; page++)
    
        waterMark = stamp.GetOverContent(page);
        waterMark.AddImage(img);
    
    stamp.FormFlattening = true;
    stamp.Close();

    // now delete the original file and rename the temp file to the original file
    File.Delete(FileLocation);
    File.Move(FileLocation.Replace(".pdf", "[temp][file].pdf"), FileLocation);

Reseñas y valoraciones

Si estás de acuerdo, tienes la libertad de dejar una crónica acerca de qué le añadirías a esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *