FontEmbeddingStatus.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © 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.Text;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Pdf.Spec;
using System.Collections.Immutable;
using System.Collections.Generic;
using System.Linq;

namespace DsPdfWeb.Demos
{
    // このサンプルでは、既存のPDFを読み込み、そのPDFで使用されているフォントを列挙し、
    // 各フォントが埋め込まれているかどうかを判定します。
    // PDFの1ページ目にフォントのリストと埋め込み状況を表示し、
    // その後に元の文書を続けて出力します。
    // 
    // 注意:フォントが埋め込まれているかどうかの判定は正確です。
    // ただし、埋め込まれたフォントがフルフォントかサブセットかを判定する方法は推測に基づいており、
    // すべてのPDFで正確とは限りません。
    public class FontEmbeddingStatus
    {
        public int CreatePDF(Stream stream)
        {
            // この関数では、フォントが埋め込まれているかどうかをチェックします。
            // 埋め込まれている場合は、サブセットか完全なフォントかも確認します。
            // サブセットフォントの場合、名前には通常「+」で終わる接頭辞がついているので、
            // 表示するときにはその接頭辞を取り除きます(Acrobatと同じ方法です)。
            (FontEmbedMode, string) GetFontInfo(GrapeCity.Documents.Pdf.Text.Font font)
            {
                if (font.IsEmbedded)
                {
                    int p = font.BaseFont.IndexOf('+');
                    if (p > 0)
                        return (FontEmbedMode.EmbedSubset, font.BaseFont[(p + 1)..]);
                    else
                        return (FontEmbedMode.EmbedFullFont, font.BaseFont);
                }
                return (FontEmbedMode.NotEmbed, font.BaseFont);
            }
            string EmbedModeToString(FontEmbedMode fem)
            {
                if (fem == FontEmbedMode.EmbedFullFont)
                    return "Embedded font";
                else if (fem == FontEmbedMode.EmbedSubset)
                    return "Embedded subset";
                else
                    return "Not embedded";
            }

            const string pdfName = "C1Olap-QuickStart.pdf";
            var fs = File.OpenRead(Path.Combine("Resources", "PDFs", pdfName));
            var doc = new GcPdfDocument();
            doc.Load(fs);

            var page = doc.Pages.Insert(0);
            var g = page.Graphics;
            var tl = g.CreateTextLayout();
            tl.DefaultFormat.Font = Common.Util.getFont();
            tl.AppendLine($"{pdfName}内で使用されているフォントと、そのフォントの埋め込み状況:\n");
            // 使用されているフォントと埋め込み状況の一覧を表示:
            var ff = doc.GetFonts().ToImmutableArray().Select(f_ => GetFontInfo(f_)).DistinctBy(fi_ => fi_.Item2).OrderBy(fi_ => fi_.Item2);
            foreach (var fi in ff)
                tl.AppendLine($"- \"{fi.Item2}\": {EmbedModeToString(fi.Item1)}");

            tl.MarginAll = g.Resolution;
            g.DrawTextLayout(tl, Point.Empty);
            
            doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}