using it.stefanochizzolini.clown.documents; using it.stefanochizzolini.clown.documents.contents.colorSpaces; using it.stefanochizzolini.clown.documents.contents.composition; using fonts = it.stefanochizzolini.clown.documents.contents.fonts; using it.stefanochizzolini.clown.documents.contents.xObjects; using files = it.stefanochizzolini.clown.files; using it.stefanochizzolini.clown.tools; using System; using System.Drawing; using System.IO; namespace it.stefanochizzolini.clown.samples { /** This sample demonstrates how to insert a watermark text on an existing document. This implementation uses a Form XObject [PDF:1.6:4.9] to conveniently achieve a consistent page background. Form XObjects provide context independence encapsulating their contents (and resources) in a single stream: such an approach allows content reuse. The watermark is seamlessly inserted under each page content using the PageStamper class. */ public class WatermarkSample : ISample { public void Run( PDFClownSampleLoader loader ) { // (boilerplate user choice -- ignore it) string filePath = loader.GetPdfFileChoice("Please select a PDF file"); // 1. Open the PDF file! files::File file = new files::File(filePath); // Get the PDF document! Document document = file.Document; // 2. Create a watermark (form)! FormXObject watermark = CreateWatermark(document); // 3. Apply the watermark to the pages of the document! ApplyWatermark(watermark); // (boilerplate metadata insertion -- ignore it) loader.BuildAccessories(document,this.GetType(),"Watermark","how to place some content behind existing pages"); // 4. Serialize the PDF file (again, boilerplate code -- see the PDFClownSampleLoader class source code)! loader.Serialize(file,this.GetType().Name); } private void ApplyWatermark( FormXObject watermark ) { // 1. Instantiate the stamper! /* NOTE: The PageStamper is optimized for dealing with pages. */ PageStamper stamper = new PageStamper(); // 2. Inserting the watermark into each page of the document... foreach(Page page in watermark.Document.Pages) { // 2.1. Associate the page to the stamper! stamper.Page = page; // 2.2. Stamping the watermark on the background... // Get the background 'layer' of the page! PrimitiveFilter background = stamper.Background; // Show the watermark into the page background! background.ShowXObject(watermark); // 2.3. End the stamping! stamper.Flush(); } } private FormXObject CreateWatermark( Document document ) { // 1. Create a new external form object to represent the watermark! FormXObject watermark = new FormXObject(document); // Size. Size size = document.GetSize(); watermark.Size = size; // 2. Inserting the contents of the watermark... // 2.1. Create a content builder for the watermark! PrimitiveFilter builder = new PrimitiveFilter(watermark); // 2.2. Inserting the contents... // Set the font to use! builder.SetFont( new fonts::StandardType1Font( document, fonts::StandardType1Font.FamilyNameEnum.Times, true, false ), 120 ); // Set the color to fill the text characters! builder.SetFillColor( new DeviceRGBColor(115f/255, 164f/255, 232f/255) ); // Show the text! builder.ShowText( "PDFClown", // Text to show. new PointF(size.Width/2f,size.Height/2f), // Anchor location: page center. AlignmentXEnum.Center, // Horizontal placement (relative to the anchor): center. AlignmentYEnum.Middle, // Vertical placement (relative to the anchor): middle. 50 // Rotation: 50-degree-counterclockwise. ); // 2.3. Flush the contents into the watermark! builder.Flush(); return watermark; } } }