FillForm.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © 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.Pdf.AcroForms;

namespace DsPdfWeb.Demos
{
    // FormFieldsサンプルで作成されたフォームを読み込み、
    // そのファイルにあるすべてのフォームフィールドをループし、
    // 入力フィールドの値を変更します。
    // 実行ログ(古い値と新しい値の記録)がフォームページに追加されます。
    public class FillForm
    {
        public int CreatePDF(Stream stream)
        {
            // 読み込んだ PDF を操作している間は、元のファイルストリームを開いたままにしておく必要があります。詳しくは、LoadPDF を参照してください。
            using var fs = File.OpenRead(Path.Combine("Resources", "PDFs", "FormFields.pdf"));
            var doc = new GcPdfDocument();
            doc.Load(fs);
            var page = doc.Pages.Last;
            var sb = new StringBuilder();
            sb.AppendLine("サンプルコードで行われた更新のログ:\r\n");

                foreach (Field fld in doc.AcroForm.Fields)
                {
                    if (fld is CombTextField ctfld)
                    {
                        sb.Append($"マス目フィールド  : '{ctfld.Value}', ");
                        ctfld.Value = "新しいマス目フィールド";
                        sb.AppendLine($" ⇒ ⇒  '{ctfld.Value}'.");
                    }
                    else if (fld is TextField tfld)
                    {
                        sb.Append($"テキストフィールド  : '{tfld.Value}', ");
                        tfld.Value = $"更新日時 : {DateTime.Now}";
                        sb.AppendLine($" ⇒ ⇒  '{tfld.Value}'.");
                    }
                    else if (fld is CheckBoxField cfld)
                    {
                        sb.Append($"チェックボックス  :  '{cfld.Checked}', ");
                        cfld.Checked = !cfld.Checked;
                        sb.AppendLine($" ⇒ ⇒  '{cfld.Checked}'.");
                    }
                    else if (fld is RadioButtonField rbfld)
                    {
                        sb.Append($"ラジオボタン  :  '{rbfld.Value}', ");
                        rbfld.Value = rbfld.Widgets.Count - 1;
                        sb.AppendLine($" ⇒ ⇒  '{rbfld.Value}'.");
                    }
                    else if (fld is ComboBoxField cmbfld)
                    {
                        sb.Append($"コンボボックスフィールドの選択  :  '{cmbfld.Items[cmbfld.SelectedIndex].Text}', ");
                        cmbfld.SelectedIndex = cmbfld.Items.Count - 1;
                        sb.AppendLine($" ⇒ ⇒  '{cmbfld.Items[cmbfld.SelectedIndex].Text}'.");
                    }
                    else if (fld is ListBoxField lbfld)
                    {
                        sb.Append($"リストボックスフィールドの選択  :  '{lbfld.Items[lbfld.SelectedIndex].Text}', ");
                        lbfld.SelectedIndex = lbfld.Items.Count - 1;
                        sb.AppendLine($" ⇒ ⇒  '{lbfld.Items[lbfld.SelectedIndex].Text}'.");
                    }
                    else if (fld is SignatureField sfld)
                    {
                        sb.AppendLine("署名フィールドが存在");
                    }
                    else if (fld is PushButtonField btnfld)
                    {
                        sb.AppendLine($"ボタンフィールドが存在 '{btnfld.Widget.ButtonAppearance.Caption}' ");
                    }
                    else
                    {
                        sb.AppendLine($"その他 '{fld}' が存在/");
                    }
                }
                // ページの一番下に到達したことのログを追加します。
                var tl = new TextLayout(72)
                {
                    MaxWidth = page.Size.Width,
                    MaxHeight = page.Size.Height,
                    MarginLeft = 80,
                    MarginRight = 80,
                    MarginBottom = 80,
                    ParagraphAlignment = ParagraphAlignment.Far
                };
                tl.Append(sb.ToString(), new TextFormat() { Font = Common.Util.getFont(), FontSize = 10 });
                tl.PerformLayout(true);
                var rc = tl.ContentRectangle;
                rc.Inflate(8, 8);
                page.Graphics.FillRectangle(rc, Color.LightYellow);
                page.Graphics.DrawRectangle(rc, Color.Orange);
                page.Graphics.DrawTextLayout(tl, PointF.Empty);

                // PDF ドキュメントを保存します。
                doc.Save(stream);
            return doc.Pages.Count;
        }
    }
}