pdfwriter para net license generar asp c# pdf itextsharp

para - c#itextsharp Creación de PDF con marca de agua en cada página



itextsharp pdf (7)

¿No puedes simplemente establecer la marca de agua en cada página después de haberla creado?

Estoy tratando de crear programáticamente una cantidad de documentos PDF con una marca de agua en cada página usando itextsharp (un puerto C # del itexto de Java).

Puedo hacer esto después de que el documento ha sido creado usando un PdfStamper. Sin embargo, esto parece implicar volver a abrir el documento leyéndolo y luego crear un nuevo documento con la marca de agua en cada página.

¿Hay alguna forma de hacerlo durante la creación del documento?

Aclamaciones,

Tim.


Aunque la solución de Tim parece muy buena, he logrado hacer lo mismo (creo) usando el siguiente código (tal vez iTextSharp ha mejorado 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 una matriz de bytes.

(No necesita hacerlo mientras crea el PDF).

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

¡Aclamaciones! :)


Después de investigarlo, encontré que la mejor manera era agregar la marca de agua a cada página tal como se creó. 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;


En iTextSharp, debería poder agregar una marca de agua mediante programación, por ej.

Watermark watermark = new Watermark(Image.getInstance("watermark.jpg"), 200, 420); document.Add(watermark);


Sí, la clase Watermark parece no ser más ... extraña. Sin embargo, en el proceso de conversión a iTextSharp 5.3, encontré una manera simple de agregar una marca de agua a un nuevo documento.

MemoryStream mem = new MemoryStream(); Document document = new Document(); PdfWriter writer = PdfWriter.GetInstance(document, mem); PdfContentByte cb = writer.DirectContent; document.Open(); document.NewPage(); Image watermark = Image.GetInstance(WATERMARK_URI); watermark.SetAbsolutePosition(80, 200); document.Add(watermark); BaseFont bf = BaseFont.CreateFont(FONT, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); cb.BeginText(); ... cb.EndText(); document.Close();


Usé la primera solución. Estaba teniendo problemas para que funcione al principio. Obtengo subrayados verdes en todos mis vacíos públicos diciendo que iba a ocultar algún miembro heredado.

Básicamente me di cuenta de que ya había agregado un PagePageEventHelper y, básicamente, recorté el código de OnStartPage. ¡ADEMÁS! Por alguna razón, tuve que anular toda anulación pública de mi vacío público.

public override void OnStartPage(PdfWriter writer, Document document) { if (condition) { string watermarkText = "-whatever you want your watermark to say-"; 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(iTextSharp.text.pdf.CMYKColor.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); } } }


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);