FormFields.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Pdf.AcroForms;
using GrapeCity.Documents.Pdf.Annotations;
using GrapeCity.Documents.Pdf.Actions;

namespace DsPdfWeb.Demos
{
    // テキストボックス、チェックボックス、プッシュボタンなど、
    // 各種フォームフィールドを作成する方法を示しています。
    public class FormFields
    {
        public int CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var page = doc.NewPage();
            var g = page.Graphics;
            var tf = new TextFormat();
            tf.FontName = "Yu Gothic";
            tf.FontSize = 14;
            var ip = new PointF(72, 72);
            float fldOffset = 72 * 2;
            float fldHeight = tf.FontSize * 1.2f;
            float dY = 32;

            // テキストフィールド。
            g.DrawString("テキストフィールド:", tf, ip);
            var fldText = new TextField();
            fldText.Value = "初期値を表示できます。";
            fldText.Widget.Page = page;
            fldText.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
            fldText.Widget.DefaultAppearance.Font = tf.Font;
            fldText.Widget.DefaultAppearance.FontSize = tf.FontSize;
            doc.AcroForm.Fields.Add(fldText);
            ip.Y += dY;

            // チェックボックス。
            g.DrawString("チェックボックス:", tf, ip);
            var fldCheckbox = new CheckBoxField();
            fldCheckbox.Checked = true;
            fldCheckbox.Widget.Page = page;
            fldCheckbox.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, fldHeight, fldHeight);
            doc.AcroForm.Fields.Add(fldCheckbox);
            ip.Y += dY;

            // ラジオボタン。
            g.DrawString("ラジオボタン:", tf, ip);
            var fldRadio = new RadioButtonField();
            fldRadio.Value = 1;
            fldRadio.Widgets.Add(new WidgetAnnotation(page, new RectangleF(ip.X + fldOffset, ip.Y, fldHeight, fldHeight)));
            fldRadio.Widgets.Add(new WidgetAnnotation(page, new RectangleF(ip.X + fldOffset, ip.Y + fldHeight * 1.2f, fldHeight, fldHeight)));
            fldRadio.Widgets.Add(new WidgetAnnotation(page, new RectangleF(ip.X + fldOffset, ip.Y + (fldHeight * 1.2f) * 2, fldHeight, fldHeight)));
            doc.AcroForm.Fields.Add(fldRadio);
            ip.Y = fldRadio.Widgets[fldRadio.Widgets.Count - 1].Rect.Y + dY;

            // マス目フィールド。
            g.DrawString("マス目フィールド:", tf, ip);
            var fldCombText = new CombTextField();
            fldCombText.Value = "123";
            fldCombText.Widget.DefaultAppearance.FontSize = 12;
            fldCombText.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
            fldCombText.Widget.Page = page;
            doc.AcroForm.Fields.Add(fldCombText);
            ip.Y += dY;

            // コンボボックス。
            g.DrawString("コンボボックス:", tf, ip);
            var fldComboBox = new ComboBoxField();
            fldComboBox.Items.Add(new ChoiceFieldItem("選択肢1"));
            fldComboBox.Items.Add(new ChoiceFieldItem("選択肢2"));
            fldComboBox.Items.Add(new ChoiceFieldItem("選択肢3"));
            fldComboBox.SelectedIndex = 1;
            fldComboBox.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
            fldComboBox.Widget.Page = page;
            doc.AcroForm.Fields.Add(fldComboBox);
            ip.Y += dY;

            // リストボックス。
            g.DrawString("リストボックス:", tf, ip);
            ListBoxField fldListBox = new ListBoxField();
            fldListBox.Items.Add(new ChoiceFieldItem("リスト項目1"));
            fldListBox.Items.Add(new ChoiceFieldItem("リスト項目2"));
            fldListBox.Items.Add(new ChoiceFieldItem("リスト項目3"));
            fldListBox.SelectedIndexes = new int[] { 0, 2 };
            fldListBox.MultiSelect = true;
            fldListBox.CommitOnSelChange = true;
            fldListBox.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 100, 60);
            fldListBox.Widget.Page = page;
            doc.AcroForm.Fields.Add(fldListBox);
            ip.Y = fldListBox.Widget.Rect.Bottom - fldHeight + dY;

            // 署名フィールド。
            g.DrawString("電子署名:", tf, ip);
            var fldSignature = new SignatureField();
            fldSignature.AlternateName = "署名された文書は全てのフィールドがロックされます";
            fldSignature.LockedFields = new SignatureLockedFields();
            fldSignature.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 2, 72 - dY);
            fldSignature.Widget.DefaultAppearance.FontSize = 8;
            fldSignature.Widget.ButtonAppearance.Caption = "クリックして署名";
            fldSignature.Widget.Border = new Border() { Width = 0.5f, Color = Color.DarkSeaGreen };
            fldSignature.Widget.Page = page;
            doc.AcroForm.Fields.Add(fldSignature);
            ip.Y += 72 - fldHeight;

            // ボタン。
            g.DrawString("ボタン:", tf, ip);

            // フォーム送信ボタン。
            var btnSubmit = new PushButtonField();
            btnSubmit.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72, fldHeight);
            btnSubmit.Widget.ButtonAppearance.Caption = "送信";
            btnSubmit.Widget.Highlighting = HighlightingMode.Invert;
            btnSubmit.Widget.Activate = new ActionSubmitForm("Sample Form Submit URI");
            btnSubmit.Widget.Page = page;
            doc.AcroForm.Fields.Add(btnSubmit);
            // ip.Y += dY;

            // フォームリセットボタン。
            var btnReset = new PushButtonField();
            btnReset.Widget.Rect = new RectangleF(ip.X + fldOffset + 72 * 1.5f, ip.Y, 72, fldHeight);
            btnReset.Widget.ButtonAppearance.Caption = "リセット";
            btnReset.Widget.Highlighting = HighlightingMode.Invert;
            btnReset.Widget.Activate = new ActionResetForm();
            btnReset.Widget.Page = page;
            doc.AcroForm.Fields.Add(btnReset);
            ip.Y += dY;

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