// // Copyright (c) 2001-2012 by PDFTron Systems Inc. All Rights Reserved. // using System; using pdftron; using pdftron.Common; using pdftron.Filters; using pdftron.SDF; using pdftron.PDF; using pdftron.PDF.OCG; /// //----------------------------------------------------------------------------------- // This sample demonstrates how to create layers in PDF. // The sample also shows how to extract and render PDF layers in documents // that contain optional content groups (OCGs) // // With the introduction of PDF version 1.5 came the concept of Layers. // Layers, or as they are more formally known Optional Content Groups (OCGs), // refer to sections of content in a PDF document that can be selectively // viewed or hidden by document authors or consumers. This capability is useful // in CAD drawings, layered artwork, maps, multi-language documents etc. // // Notes: // --------------------------------------- // - This sample is using CreateLayer() utility method to create new OCGs. // CreateLayer() is relatively basic, however it can be extended to set // other optional entries in the 'OCG' and 'OCProperties' dictionary. For // a complete listing of possible entries in OC dictionary please refer to // section 4.10 'Optional Content' in the PDF Reference Manual. // - The sample is grouping all layer content into separate Form XObjects. // Although using PDFNet is is also possible to specify Optional Content in // Content Streams (Section 4.10.2 in PDF Reference), Optional Content in // XObjects results in PDFs that are cleaner, less-error prone, and faster // to process. //----------------------------------------------------------------------------------- /// namespace PDFLayersTestCS { class Class1 { // Relative path to the folder containing test files. static string input_path = "../../../../TestFiles/"; static string output_path = "../../../../TestFiles/Output/"; [STAThread] static void Main(string[] args) { PDFNet.Initialize(); try { PDFDoc doc = new PDFDoc(); // Create three layers... Group image_layer = CreateLayer(doc, "Image Layer"); Group text_layer = CreateLayer(doc, "Text Layer"); Group vector_layer = CreateLayer(doc, "Vector Layer"); // Start a new page ------------------------------------ Page page = doc.PageCreate(); ElementBuilder builder = new ElementBuilder(); // ElementBuilder is used to build new Element objects ElementWriter writer = new ElementWriter(); // ElementWriter is used to write Elements to the page writer.Begin(page); // begin writing to this page // Add new content to the page and associate it with one of the layers. Element element = builder.CreateForm(CreateGroup1(doc, image_layer.GetSDFObj())); writer.WriteElement(element); element = builder.CreateForm(CreateGroup2(doc, vector_layer.GetSDFObj())); writer.WriteElement(element); // Add the text layer to the page... if (false) // set to 'true' to enable 'ocmd' example. { // A bit more advanced example of how to create an OCMD text layer that // is visible only if text, image and path layers are all 'ON'. // An example of how to set 'Visibility Policy' in OCMD. Obj ocgs = doc.CreateIndirectArray(); ocgs.PushBack(image_layer.GetSDFObj()); ocgs.PushBack(vector_layer.GetSDFObj()); ocgs.PushBack(text_layer.GetSDFObj()); OCMD text_ocmd = OCMD.Create(doc, ocgs, OCMD.VisibilityPolicyType.e_AllOn); element = builder.CreateForm(CreateGroup3(doc, text_ocmd.GetSDFObj())); } else { element = builder.CreateForm(CreateGroup3(doc, text_layer.GetSDFObj())); } writer.WriteElement(element); // Add some content to the page that does not belong to any layer... // In this case this is a rectangle representing the page border. element = builder.CreateRect(0, 0, page.GetPageWidth(), page.GetPageHeight()); element.SetPathFill(false); element.SetPathStroke(true); element.GetGState().SetLineWidth(40); writer.WriteElement(element); writer.End(); // save changes to the current page doc.PagePushBack(page); // Set the default viewing preference to display 'Layer' tab. PDFDocViewPrefs prefs = doc.GetViewPrefs(); prefs.SetPageMode(PDFDocViewPrefs.PageMode.e_UseOC); // Calling Dispose() on ElementReader/Writer/Builder can result in increased performance and lower memory consumption. builder.Dispose(); writer.Dispose(); doc.Save(output_path + "pdf_layers.pdf", SDFDoc.SaveOptions.e_linearized); doc.Close(); Console.WriteLine("Done."); } catch (PDFNetException e) { Console.WriteLine(e.Message); } // The following is a code snippet shows how to selectively render // and export PDF layers. try { PDFDoc doc = new PDFDoc(output_path + "pdf_layers.pdf"); doc.InitSecurityHandler(); if (!doc.HasOC()) { Console.WriteLine("The document does not contain 'Optional Content'"); } else { Config init_cfg = doc.GetOCGConfig(); Context ctx = new Context(init_cfg); PDFDraw pdfdraw = new PDFDraw(); pdfdraw.SetImageSize(1000, 1000); pdfdraw.SetOCGContext(ctx); // Render the page using the given OCG context. Page page = doc.GetPage(1); // Get the first page in the document. pdfdraw.Export(page, output_path + "pdf_layers_default.png"); // Disable drawing of content that is not optional (i.e. is not part of any layer). ctx.SetNonOCDrawing(false); // Now render each layer in the input document to a separate image. Obj ocgs = doc.GetOCGs(); // Get the array of all OCGs in the document. if (ocgs != null) { int i, sz = ocgs.Size(); for (i=0; i