Skip to main content
All docs
V24.1

DevExpress v24.1 Update — Your Feedback Matters

Our What's New in v24.1 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

Layers (Optional Content Groups)

  • 5 minutes to read

#Layers: Overview

Complex PDF documents such as CAD drawings, technical construction plans, layered artwork, maps, or multi-language documents can contain optional content (layers). Layers in a PDF document allow you to selectively view or hide specific content sections. The main purpose of layers is to control the visibility of graphics objects rendered in a PDF document in different states (when you view or print a PDF document). For example, layer visibility can be helpful in the following cases:

  • A PDF document with multi-lingual content that can be displayed conditionally.
  • A PDF document that contains animation that appears on a separate layer.
  • License agreement in a PDF document that needs to be agreed upon before the content can be viewed.
  • A PDF document containing a watermark that may not show on screen but is always printed and exported to other applications.
  • A PDF document that contains details of a product design.

#Set Layer Visibility

The PDF Viewer allows you to manage layer visibility when you view a document:

layers overview

Important

The PDF Viewer does not save layer visibility changes, even if you save a separate copy of the document. Original visibility settings remain in effect and they control document appearance when someone opens the document to view its content, or prints it, or exports it to an image.

#User Interface

The Layers panel displays all layers contained in a document. To display a layer, click on its check box. Visible layers are marked with the eye icon.

layers panel

If a layer has no check box or displays a lock icon, you cannot change its visibility:

Locked layers

Click the “Reset to Initial Visibility” command to reset layers settings and return to initial document state.

Reset to Initial Visibility

#Use PDF Facade API to Manage Layer Visibility

Important

The Universal Subscription or an additional Office File API Subscription is required to use Facade API in production code. Refer to the DevExpress Subscription page for pricing information.

Call the GetDocumentFacade method to obtain PdfDocumentFacade and manage layer visibility.

Use the PdfDocumentFacade.OptionalContentVisibility property to access PdfOptionalContentGroupVisibility objects. The PdfOptionalContentGroupVisibility class contains visibility settings that correspond to a layer (the PdfOptionalContentGroup object).

Use the PdfOptionalContentGroupVisibility.Visible property to show or hide a layer.

The following code snippet hides two layers in the “PdfLayers.pdf” document and displays the third layer:

Third layer visible

<Grid>
    <dxpdf:PdfViewerControl x:Name="pdfViewer" CommandBarStyle="Bars" ShowStartScreen="True"
            DocumentSource="..\\PdfLayers.pdf"/>
</Grid>
using DevExpress.Pdf;
// ...
public partial class MainWindow : Window{
    public MainWindow() {
        InitializeComponent();
        pdfViewer.DocumentLoaded += PdfViewer_DocumentLoaded;

    }
    private void PdfViewer_DocumentLoaded(object sender, RoutedEventArgs e) {
        PdfDocumentFacade facade = pdfViewer.GetDocumentFacade();
        facade.OptionalContentVisibility.Groups[0].Visible = false;
        facade.OptionalContentVisibility.Groups[1].Visible = false;
        facade.OptionalContentVisibility.Groups[2].Visible = true;
    }
}

A layer can contain zoom settings. For example, a PDF document can contain a layer that changes its visibility based on the zoom level. If your code makes a layer visible, it may still disappear when users change the zoom level in the viewer. If you want to display a layer regardless of the zoom level, set both Visible and PdfOptionalContentGroupVisibility.ManualVisibilityOverride to true for that layer. The latter indicates that your current visibility settings have higher priority than the default configuration.

#Use PDF Facade API to Configure State-Dependent Settings

Important

The Universal Subscription or an additional Office File API Subscription is required to use Facade API in production code. Refer to the DevExpress Subscription page for pricing information.

A PDF document may contain default configuration (the PdfOptionalContentProperties.DefaultConfiguration property value) that specifies “usages” (layer settings that depend on state).

The following usage categories are available:

View
Settings applied to the layer in view state (when you view a document in a viewer).
Print
Settings applied to the layer in print preview or when you print a document.
Export
Settings applied to the layer when you export a document.
Zoom
Settings applied to the layer according to the zoom level.
Language
Language culture settings applied to the layer.

In code, use the ActiveUsages property to specify which settings from the default configuration should be preserved. Set ActiveUsages to none to disable all default settings and apply only those you specified in code or in the UI.

For example, the configuration can specify that a layer hidden when you view the document, yet is visible on a printed copy:

Print Usage

The following code snippet disables all usages in layers and allows you to print the document as you specified:

<Grid>
    <dxpdf:PdfViewerControl x:Name="pdfViewer" CommandBarStyle="Bars" ShowStartScreen="True"
            DocumentSource="..\\PdfLayers.pdf"/>
</Grid>
using DevExpress.Pdf;
// ...
public partial class MainWindow : Window{
    public MainWindow() {
        InitializeComponent();
        pdfViewer.DocumentLoaded += PdfViewer_DocumentLoaded;

    }
    private void PdfViewer_DocumentLoaded(object sender, RoutedEventArgs e) {
        PdfDocumentFacade facade = pdfViewer.GetDocumentFacade();
        facade.OptionalContentVisibility.ActiveUsages = PdfOptionalContentUsageCategories.None;
        pdfViewer.Print();
    }
}

The following image illustrate the result:

Print with no usages