OutputIntents.cs
//
// This code is part of Document Solutions for PDF demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Text;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos
{
    // This sample shows how to add output intents to a PDF.
    // It adds several versions of the ICC Probe Profile
    // which deliberately distorts the rendered colors, so that it is easy
    // to make sure that a profile is actually being used. To see the effect
    // in this PDF, you may open it in Adobe Acrobat Reader DC, and set the
    // Edit | Preferences | Page Display | Show Overprint Preview option to 'Always'.
    // Then the deliberate color distortion added by the Probe Profile will be obvious.
    // For details please see the "Output Intents" section of the PDF Specification.
    public class OutputIntents
    {
        public int CreatePDF(Stream stream)
        {
            // The different versions of the ICC Probe profile:
            var profiles = new (string, string)[] {
                ("Probev2_ICCv4.icc", @"https://www.color.org/probeprofile.xalter"),
                ("Probev1_ICCv4.icc", @"https://www.color.org/probeprofile.xalter"),
                ("Probev1_ICCv2.icc", @"https://www.color.org/probeprofile.xalter"),
            };
            //
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;
            var sb = new StringBuilder();
            const string bullet = "\x2022\x2003";
            sb.AppendLine("This document contains the following output intents (first one is the default):");
            int i = 0;
            foreach (var profile in profiles)
            {
                sb.AppendLine($"{bullet}{profile.Item1}, source: {profile.Item2}");
                using (FileStream fs = File.OpenRead(Path.Combine("Resources", "Misc", profile.Item1)))
                {
                    var oi = OutputIntent.Create($"Output intent testing {i++}", "", "http://www.color.org", profile.Item1, fs);
                    doc.OutputIntents.Add(oi);
                }
            }
            sb.AppendLine(
                "Colors processed via the ICC Probe Profile are deliberately distorted, " +
                "so that it is easy to visually confirm that a profile is being used. " +
                "To see the effect in this PDF, you may open it in Adobe Acrobat Reader DC and make sure that " +
                "Edit | Preferences | Page Display | Show Overprint Preview is set to 'Always', " +
                "then the deliberate color distortion will be obvious.");
            var rc = Common.Util.AddNote(sb.ToString(), page);
            g.DrawImage(GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "roofs.jpg")),
                new RectangleF(rc.Left, rc.Bottom + 24, rc.Width, rc.Width), null, ImageAlign.StretchImage);
            //
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}