With the introduction of PDF version 1.5 came the concept of Layers. Layers or as they are more formally known Optional Content Groups (OCG) provide an excellent method for dealing with related content.
The concept of Layers isn't new, Illustration and CAD packages have been using Layers to separate content for many years, however the ability to have this functionality inside Acrobat/PDF provides developers and PDF authors alike with the kind of functionality we've become accustomed to, and made use of extensively.
Authoring Applications
An essential point to remember is that Acrobat is not able to set or create layers from existing content. This is largely due in part to the fact that Acrobat isn't an illustration package or indeed an authoring application. This means we need to rely on authoring applications to generate PDF files that can write PDF version 1.5 and also write OCGs/Layers.
At present the following applications support this functionality:
Illustrator CS (v11)
InDesign CS (v3)
AutoCAD (w/Acrobat PDFMaker)
Visio (w/Acrobat PDFMaker)
AcroTips.com StacksOn for MSWord*
ARTS PDF Stratify (Acrobat Plugin)*
The new Adobe Creative Suite translates directly the layers you have in your documents into layers in you PDF's, AutoCAD and Visio rely on Acrobat's PDFMaker (VBA) macro to to create the corresponding layers from the source documents.
StacksOn* is the first MSWord tool for creating Layers from Word source documents and ARTS PDF Stratify* is the only tool on the market for creating or rather defining layers from existing PDF content (it's a plugin for Acrobat).
* AcroTips is currently in the late stages of development of StacksOn -- the first tool for creating layers in Word that produce a layered PDF version. ARTS PDF (a division of BinaryThing) has also announced it will be releasing a new version of ARTS PDF Stratify which will let Acrobat users define layers from within Acrobat.
Next Steps
So this gives us an idea on how to create Layered PDFs, in our example I've created a PDF with a floor plan with several layers.
The potential of Layered PDF (OCGs) is huge, one of the best examples I've seen so far has been a company brochure with two layers. The page is initially blank with just the background images for the products, however when the PDF is opened a little bit of Javascript checks the language of the user and switches either the German Layer or English layer on -- these two layers contain the appropriate translated text for the product -- all in one PDF!
What we'll concentrate on in this article is how to manipulate OCGs with Javascript to truly make best use of this new technology.
Throughout this article I'll use the terms Layers and OCGs interchangeably.
Finding the Layers
When you open a PDF file that has Layers you'll notice a piece of cake (no really, a piece of cake) in the status bar at the bottom left of the screen. This icon indicates that the PDF you have open has special features and by clicking on the icon a dialog will display informing you what these special features are.
In our case the PDF has Layers (or Optional Content Groups), so the dialog let's us know that such a thing exists and how to show the layers panel.
So if we havent already got the Layers Panel open we can go into the 'view' menu and select 'Navigation Tabs' and then choose 'layers'.
You should be presented with the list of currently available Layers for this PDF. Just remember that Layers are page bound not Document bound, meaning each layer in the list belongs to a page somewhere in the document, using the properties menu you can actually elect to show only Layers for the current page or for the entire document.
Properties for Layers
The authoring application that created the PDF can set attributes for each Optional Content Group that can tell the viewing software (in our case Acrobat/Reader) how to deal with the OCG and also any other features that may or may not be Interface driven.
OCG Properties
The following properties can be defined when creating PDF's, the actual properties that are set are determined by the authoring application, some properties are user defineable and others are part of the PDF standard. (This list isn't complete)
Property/Feature
Description
CreatorInfo: Creator
The application that created the OCG/PDF
CreatorInfo: Subtype
For example, Artwork or Technical or Illustration
Language: Lang
Language and Locale for this Layer. This is useful for applications extracting or exporting data from PDF files.
Language: Preferred
This can contain either an ON or OFF value indicating if this Language should be the preferred Language.
View:ViewState
A value of either ON or OFF which indicates if this Layer should be visible when the document is opened
Export:ExportState
ON or OFF again indicating if the layer should be included for export by Acrobat or other applications
Print:Subtype
This property can indicate what type of content is being controlled by the OCG for the purposes of printing, eg Trapping, Water
From the Properties dialog for a PDF Layer created from Adobe Illustrator CS (v11.0) it indicates the following four properties.
Groups of Optional Content
It's possible to have loads of single Layers (or content marked as Optional Content) or to actually gather these layers into related groups. However currently we only have programmatic access to individual layers, not the entire group(s).
It's also possible to have nested groups, meaning groups inside groups inside groups. The level of complexity is purely driven by your needs or the needs of the application using the PDF.
Scripting OCGs
The real power of OCGs comes from the ability to programmatically control the visibility and other properties of each individual Layer, regardless of the page is belongs to.
However one thing you might notice that's missing is the ability to control any Top Level Groups that exist as 'wrappers' to individual Layers. Although it's missing the functionality provided in other areas more than makes up for this deficiency.
If we take a look in the AcroJS (Acrobat Javascript Scripting Reference) manual we can see we have the following objects to play with.
Effectively it breaks down to having control over Layers in the following ways:
Change the current State: Visible/Invisible
Extract the Name of the Layer
Set the Action for the Layer (what happens when it's Visibility is changed)
We are also able to get ALL of the OCGs for the current document or a specific page, this method is listed under the 'Doc' object.
Writing the Code
In our example I want to add four link boxes, one to each of the icons in the PDF. Each Icon toggles the appropriate layers visibility:
Toggle the display of the Names
Toggle the display of the Wet Areas
Toggle the display of the Carpeted Areas
Toggle the display of the Tiled Areas
I'll also add a link box over the logo to toggle it's visibility, and also one covering the actual floor plan -- so you can toggle that layer also (although in our case the icons are on that layer as well so you'll need to remember where the link boxes are ;)
Probably the first thing you'll notice when you add a link box and go to set it's action is that there's an action of type 'set Layer Visibility'. For this example we aren't going to make use of this action type. Basically this action makes note of the current layer visibility settings. When you click the link it changes the visibility of all of the layers to however they were when you set the action.
Code for the Icon Links Boxes
Create a link box and choose 'Custom Link' , under the Action settings select 'run a Javascript'. Click 'Add' and enter the following Javascript.
var docOCGs = this.getOCGs();
for (var x=0; x < docOCGs.length; x++)
{
if(docOCGs[x].name == "names")
{
docOCGs[x].state = !docOCGs[x].state;
}
}
You'll need to repeat this step for each of the link boxes (in our case there's 6 link boxes. The important thing to change being the 'names' to whatever the name of the layer is.
As a convenience I also added two form buttons that run similar code, except they turn all of the layers on or all of the layers off:
// Visible
var docOCGs = this.getOCGs();
for (var x=0; x < docOCGs.length; x++)
{
docOCGs[x].state = true;
}
// InVisible
var docOCGs = this.getOCGs();
for (var x=0; x < docOCGs.length; x++)
{
docOCGs[x].state = false;
}
Summary
Hopefully from the example code and the example PDF you should see how useful Layers can be.
Remembering of course that the javascript we entered for the links could easily have been set as the action for a text field, bookmark, form button, checkbox etc.
Despite the numerous benefits, there can be potential issues with the conversion of paper documents into electronic archives. When scanning paper pages into PDF, it's possible to end up with the odd- and even-numbered pages in separate PDF files. It can be very time-consuming to collate them manually, but there is an easier way. Sean Stewart explains.
BCL easyPDF SDK is a set of PDF Programming Libraries designed specifically to help Software Developers / Programmers build and deploy enterprise class PDF applications for corporate wide PDF...