using org.pdfclown.documents;
using org.pdfclown.documents.contents.colorSpaces;
using org.pdfclown.documents.contents.composition;
using fonts = org.pdfclown.documents.contents.fonts;
using org.pdfclown.documents.contents.xObjects;
using files = org.pdfclown.files;
using org.pdfclown.tools;
using System;
using System.Drawing;
using System.IO;
namespace org.pdfclown.samples.cli
{
/**
This sample demonstrates how to insert a watermark text on an existing PDF 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
: Sample
{
public override bool Run(
)
{
string filePath = PromptPdfFileChoice("Please select a PDF file");
// 1. Open the PDF file!
files::File file = new files::File(filePath);
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)
BuildAccessories(document,"Watermark","how to place some content behind existing pages");
// 4. Serialize the PDF file!
Serialize(file);
return true;
}
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!
PrimitiveComposer 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.
SizeF size = document.GetSize();
watermark.Size = size;
// 2. Inserting the contents of the watermark...
// 2.1. Create a content composer for the watermark!
PrimitiveComposer composer = new PrimitiveComposer(watermark);
// 2.2. Inserting the contents...
// Set the font to use!
composer.SetFont(
new fonts::StandardType1Font(
document,
fonts::StandardType1Font.FamilyEnum.Times,
true,
false
),
120
);
// Set the color to fill the text characters!
composer.SetFillColor(
new DeviceRGBColor(115f/255, 164f/255, 232f/255)
);
// Show the text!
composer.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!
composer.Flush();
return watermark;
}
}
}