Example_46

Using PDF layers (optional content groups) that can be shown or hidden: a relief map of Europe, lines of latitude and longitude that are not printed, and capital cities.

Example_46.pdf — the PDF this example creates.

using System;
using System.IO;
using System.Diagnostics;
using PDFjet.NET;

/**
 * Example_46.cs
 * Using PDF layers (optional content groups) that can be shown or hidden: a
 * shaded relief map of Europe, the lines of latitude and longitude over it,
 * and the capital cities. The map covers 12°W to 42°E and 34°N to 62°N, and
 * longitude and latitude map linearly to x and y on it.
 */
public class Example_46 {
    private readonly float x0 = 50f;       // The top left corner of the map
    private readonly float y0 = 180f;
    private readonly float w = 512f;       // The size of the map
    private readonly float h = 512f * 840f / 1084f;

    private float MapX(float longitude) {
        return x0 + (longitude + 12f) / 54f * w;
    }

    private float MapY(float latitude) {
        return y0 + (62f - latitude) / 28f * h;
    }

    public Example_46() {
        PDF pdf = new PDF(new BufferedStream(
                new FileStream("Example_46.pdf", FileMode.Create)));

        Font f1 = new Font(pdf, IBMPlexSans.Regular);
        Font f2 = new Font(pdf, IBMPlexSans.SemiBold);

        Page page = new Page(pdf, Letter.PORTRAIT);

        TextLine text = new TextLine(f2, "PDF Layers");
        text.SetFontSize(22f);
        text.SetLocation(50f, 80f);
        text.DrawOn(page);

        TextBlock textBlock = new TextBlock(f1,
                "Each part of this map is a layer, an optional content group, that "
                + "a PDF viewer lists in its Layers panel and can show or hide: the "
                + "relief, the lines of latitude and longitude, and the capital "
                + "cities. The lines are shown on the screen but not printed.");
        textBlock.SetFontSize(12f);
        textBlock.SetLineSpacing(1.5f);
        textBlock.SetLocation(50f, 95f);
        textBlock.SetWidth(512f);
        textBlock.DrawOn(page);

        Image image = new Image(pdf, "images/europe-relief.png");
        image.ResizeWidth(w);
        image.SetLocation(x0, y0);

        // A layer is hidden and not printed unless it is set to be.
        OptionalContentGroup group = new OptionalContentGroup(pdf, "Relief");
        group.SetVisible(true);
        group.SetPrintable(true);
        group.Add(image);
        group.DrawOn(page);

        group = new OptionalContentGroup(pdf, "Latitude and Longitude");
        group.SetVisible(true);
        for (int longitude = -10; longitude <= 40; longitude += 5) {
            Line line = new Line(MapX(longitude), y0, MapX(longitude), y0 + h);
            line.SetStrokeWidth(0.5f);
            line.SetStrokeColor(Color.white);
            group.Add(line);

            String label = (longitude < 0) ? -longitude + "°W" :
                    (longitude > 0) ? longitude + "°E" : "0°";
            text = new TextLine(f1, label);
            text.SetFontSize(8f);
            text.SetTextColor(Color.dimgray);
            text.SetLocation(MapX(longitude) - text.GetWidth() / 2f, y0 + h + 12f);
            group.Add(text);
        }
        for (int latitude = 35; latitude <= 60; latitude += 5) {
            Line line = new Line(x0, MapY(latitude), x0 + w, MapY(latitude));
            line.SetStrokeWidth(0.5f);
            line.SetStrokeColor(Color.white);
            group.Add(line);

            text = new TextLine(f1, latitude + "°N");
            text.SetFontSize(8f);
            text.SetTextColor(Color.dimgray);
            text.SetLocation(x0 + w + 4f, MapY(latitude) + 3f);
            group.Add(text);
        }
        group.DrawOn(page);

        String[] cities = {
            "Athens", "Ankara", "Berlin", "Bucharest", "Dublin",
            "Kyiv", "Lisbon", "London", "Madrid", "Oslo",
            "Paris", "Rome", "Stockholm", "Vienna", "Warsaw",
        };
        float[,] locations = {     // Longitude and latitude
            {23.73f, 37.98f}, {32.86f, 39.93f}, {13.40f, 52.52f},
            {26.10f, 44.43f}, {-6.26f, 53.35f}, {30.52f, 50.45f},
            {-9.14f, 38.72f}, {-0.13f, 51.51f}, {-3.70f, 40.42f},
            {10.75f, 59.91f}, { 2.35f, 48.86f}, {12.50f, 41.90f},
            {18.07f, 59.33f}, {16.37f, 48.21f}, {21.01f, 52.23f},
        };
        group = new OptionalContentGroup(pdf, "Capital Cities");
        group.SetVisible(true);
        group.SetPrintable(true);
        for (int i = 0; i < cities.Length; i++) {
            float x = MapX(locations[i, 0]);
            float y = MapY(locations[i, 1]);

            Point point = new Point(x, y);
            point.SetRadius(2.5f);
            point.SetFillColor(Color.white);
            point.SetStrokeColor(Color.black);
            group.Add(point);

            text = new TextLine(f2, cities[i]);
            text.SetFontSize(8f);
            text.SetLocation(x + 5f, y + 3f);
            group.Add(text);
        }
        group.DrawOn(page);

        text = new TextLine(f1, "Relief: Natural Earth, public domain, naturalearthdata.com");
        text.SetFontSize(8f);
        text.SetTextColor(Color.dimgray);
        text.SetURIAction("https://www.naturalearthdata.com");
        text.SetLocation(x0, y0 + h + 30f);
        text.DrawOn(page);

        pdf.Complete();
    }

    public static void Main(String[] args) {
        Stopwatch sw = Stopwatch.StartNew();
        long time0 = sw.ElapsedMilliseconds;
        new Example_46();
        long time1 = sw.ElapsedMilliseconds;
        sw.Stop();
        Console.WriteLine($"Example_46 => {time1 - time0,4} ms");
    }
}   // End of Example_46.cs

©2026 PDFjet Software.