ChangeTextAttrs.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 GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.TextMap;
using GrapeCity.Documents.Pdf.Layers;
using GrapeCity.Documents.Text;

namespace DsPdfWeb.Demos
{
    // Finds all occurrences of a regular expression (specifically,
    // the regex searches for strings that look like dates or times)
    // and changes the text rendering attributes of all those occurrences.
    // The following attributes can be changed:
    // - Text rendering mode (fill/stroke/clip);
    // - Text fill color and alpha;
    // - Text stroke color and alpha.
    // For reference, the original PDF without changes is appended to the result.
    // The original PDF and the search regex are the same as used in DeleteText.
    public class ChangeTextAttrs
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "TimeSheet.pdf"));
            doc.Load(fs);
            var pageCount = doc.Pages.Count;
            // Duplicate the PDF:
            doc.MergeWithDocument(doc);
            // Modify text on the first copy:
            for (int i = 0; i < pageCount; ++i)
            {
                var ftps = new FindTextParams(@"\d+/\d+/\d+|\d+:\d+| am| pm", false, false, 72, 72, false, true);
                // TextRenderingAttrs allows you to specify the following text rendering attributes:
                // - RenderingMode
                // - FillAlpha
                // - FillColor
                // - StrokeAlpha
                // - StrokePen
                doc.Pages[i].SetTextRenderingAttrs(ftps, new TextRenderingAttrs() {
                    RenderingMode = TextRenderingMode.FillStroke,
                    FillColor = Color.Red,
                    FillAlpha = 0.5f,
                    StrokeAlpha = 1.0f,
                    StrokePen = new GrapeCity.Documents.Drawing.Pen(Color.Blue, 1)});
            }
            // Done:
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}