NoPassSetMetadata.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.Security;
using GrapeCity.Documents.Text;

namespace DsPdfWeb.Demos
{
    // このサンプルでは、パスワードで保護されたPDFを読み込み、そのメタデータを変更する方法を紹介しています。
    // なお、PDFのメタデータも暗号化されている場合があり、その場合はパスワードを指定せずに
    // メタデータにアクセスすることができないことに留意してください。
    // 参考までに、読み込むPDFはオーナーパスワード「owner」とユーザーパスワード「user」で保護されています。
    public class NoPassSetMetadata
    {
        public int CreatePDF(Stream stream)
        {
            using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "Wetlands-password-user.pdf"));
            // パスワードで保護されたPDFをパスワードを指定せずに読み込めるようDecryptionOptionsを設定します。
            var dopt = new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false };
            var docSrc = new GcPdfDocument();
            docSrc.Load(fs, dopt);

            // StandardSecurityHandlerRev4より前のすべてのセキュリティハンドラは常にメタデータを暗号化していましたが、
            // StandardSecurityHandlerRev4にはEncryptMetadataプロパティがあり、これを確認する必要があります。
            bool metadataIsEncrypted = true;
            if (docSrc.Security.EncryptHandler is StandardSecurityHandlerRev4 ssh)
                metadataIsEncrypted = ssh.EncryptMetadata;
            // このサンプルで使用されているPDFでは、メタデータは暗号化されていません。
            if (metadataIsEncrypted)
                throw new Exception("PDFメタデータの設定:予期しないエラーが発生しました。");

            Metadata m = docSrc.Metadata;
            // 結果を比較できるように、元のメタデータを取得します。
            var origTitle = m.Title;
            var origCreatorTool = m.CreatorTool;
            var origModifyDate = m.ModifyDate;
            // 一部のメタデータを変更します。
            m.Title = "サンプル:PDFメタデータの設定";
            m.CreatorTool = "DioDocs for PDFのデモ";
            m.ModifyDate = DateTime.Now;

            // 変更後のパスワードで保護されたドキュメントを一時ファイルに保存し、
            // それをパスワードを指定せずに再度読み込み、変更されたメタデータを取得して
            // 結果のPDFに出力します。
            var fn = Path.GetTempFileName();
            {
                docSrc.Save(fn);

                using var fsTemp = File.OpenRead(fn);
                var docTemp = new GcPdfDocument();
                docTemp.Load(fsTemp, dopt);

                // 結果を出力するPDFです。
                var doc = new GcPdfDocument();
                var page = doc.NewPage();
                // 結果のテキストのためのTextLayoutを設定します。
                var tl = page.Graphics.CreateTextLayout();
                tl.DefaultFormat.Font = Common.Util.getFont();
                tl.DefaultFormat.FontSize = 14;
                tl.MaxWidth = doc.PageSize.Width;
                tl.MaxHeight = doc.PageSize.Height;
                tl.MarginAll = tl.Resolution;
                var captionFmt = new TextFormat(tl.DefaultFormat) { FontBold = true, FontSize = tl.DefaultFormat.FontSize + 2 };

                if (docTemp.Security.EncryptHandler is StandardSecurityHandlerRev4 sshTemp)
                    metadataIsEncrypted = sshTemp.EncryptMetadata;
                if (metadataIsEncrypted)
                    throw new Exception("PDFメタデータの設定:予期しないエラーが発生しました。");

                // 結果のテキストを描画します。
                Metadata mTemp = docTemp.Metadata;
                tl.AppendLine("パスワードで保護されたPDFの変更されたメタデータ:", captionFmt);
                tl.AppendLine($"\nTitle", captionFmt);
                tl.AppendLine($"変更前「{origTitle}」、変更後「{mTemp.Title}」");
                tl.AppendLine($"\nCreatorTool", captionFmt);
                tl.AppendLine($"変更前「{origCreatorTool}」、変更後「{mTemp.CreatorTool}」");
                tl.AppendLine($"\nModifyDate", captionFmt);
                var origModifyDateStr = origModifyDate.HasValue ? origModifyDate.Value.ToString() : string.Empty;
                var newModifyDateStr = mTemp.ModifyDate.HasValue ? mTemp.ModifyDate.Value.ToString() : string.Empty;
                tl.AppendLine($"変更前「{origModifyDateStr}」、変更後「{newModifyDateStr}」");
                tl.PerformLayout(true);
                page.Graphics.DrawTextLayout(tl, PointF.Empty);
                doc.Save(stream);
            }
            File.Delete(fn);

            // PDF ドキュメントを保存します。
            return 1;
        }
    }
}