[]
DioDocs for PDF では、ドキュメント内の操作性を高める複数のアクションを提供しています。これにより、ユーザーはリンクやドキュメントアウトライン、その他の要素とのインタラクション時に特定の動作を実行できます。
URIアクションを使用すると、PDFドキュメント内にハイパーリンクを作成し、特定のURIへ移動することができます。DioDocs for PDFでは、ActionURIクラスおよびそのプロパティを利用して、このアクションタイプをPDFドキュメント内で定義できます。
以下のコードは、ActionURIオブジェクトを使用して、テキストをGoogle公式サイトへリンクします。
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
// リンクを表すテキストを描画します。
var tf = new TextFormat() { Font = StandardFonts.Times, FontSize = 14 };
var tl = g.CreateTextLayout();
tl.MarginAll = 72;
tl.Append("google検索はこちら", tf);
tl.PerformLayout(true);
g.DrawTextLayout(tl, PointF.Empty);
// テキスト領域に関連付けられたリンクを追加します。
page.Annotations.Add(new LinkAnnotation(tl.ContentRectangle, new ActionURI("http://www.google.com")));
// PDFを保存します。
doc.Save(stream);
return doc.Pages.Count;
}
サウンドアクションは、PDFドキュメントを操作する際にオーディオファイルを再生するインタラクティブな機能です。ボタンをクリックしたり、エリアにマウスオーバーしたり、その他のユーザーによるイベントを通じて操作できます。DioDocs for PDFでは、ActionSoundクラスおよびそのプロパティを利用して、このアクションタイプをPDFドキュメント内で定義できます。
以下のコードは、フォームの「送信」と「リセット」ボタンがクリックされたときに効果音を再生する例です。
public int CreatePDF(Stream strem)
{
var doc = new GcPdfDocument();
var page = doc.NewPage();
var rc = Common.Util.AddNote(
"このサンプルは、複数のボタン要素を持つPDFを作成し、" +
"各ボタンのマウスダウンイベントにサウンドファイルを再生するアクションサウンドを関連付けます。" +
"このサンプルをダウンロードする場合は、送信先のURLを有効なサーバーを指すように更新する必要があることに注意してください。",
page);
var g = page.Graphics;
var tf = new TextFormat() { Font = StandardFonts.Times, FontSize = 14 };
var ip = new PointF(72, rc.Bottom + 36);
float fldOffset = 72 * 2 + 46;
float fldHeight = tf.FontSize * 1.2f;
float dY = 32;
// テキストフィールドを追加します。
g.DrawString("名:", tf, ip);
var fldFirstName = new TextField() { Name = "名", Value = "太郎" };
fldFirstName.Widget.Page = page;
fldFirstName.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
fldFirstName.Widget.DefaultAppearance.Font = tf.Font;
fldFirstName.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldFirstName);
ip.Y += dY;
// テキストフィールドを追加します。
g.DrawString("姓:", tf, ip);
var fldLastName = new TextField() { Name = "姓", Value = "山田" };
fldLastName.Widget.Page = page;
fldLastName.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
fldLastName.Widget.DefaultAppearance.Font = tf.Font;
fldLastName.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldLastName);
ip.Y += dY;
// チェックボックスを追加します。
g.DrawString("メール配信を希望する:", tf, ip);
var fldCheckbox = new CheckBoxField() { Name = "メール配信を希望する", 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 fldAdditionalInfo = new TextField() { Name = "備考", Multiline = true };
fldAdditionalInfo.Widget.Page = page;
fldAdditionalInfo.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight * 2);
fldAdditionalInfo.Widget.DefaultAppearance.Font = tf.Font;
fldAdditionalInfo.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldAdditionalInfo);
ip.Y += dY * 2;
// 送信ボタンを追加します。
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.Page = page;
// 送信先URLを設定します。
btnSubmit.Widget.Activate = new ActionSubmitForm("/Samples/HandleFormSubmitFields");
btnSubmit.Widget.Events.MouseDown = new ActionSound(SoundObject.FromFile(Path.Combine("Resources", "Sounds", "form-submitted.wav")));
doc.AcroForm.Fields.Add(btnSubmit);
// リセットボタンを追加します。
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.Page = page;
btnReset.Widget.Activate = new ActionResetForm();
btnReset.Widget.Events.MouseDown = new ActionSound(SoundObject.FromFile(Path.Combine("Resources", "Sounds", "form-reset.wav")));
doc.AcroForm.Fields.Add(btnReset);
ip.Y += dY;
// PDFを保存します。
doc.Save(stream);
return doc.Pages.Count;
}
制限事項
Adobe Acrobat では、ActionSound クラスの Volume プロパティは無視されます。
JavaScriptアクションは、PDFドキュメントに埋め込まれたJavaScriptコードのスニペットを実行できる機能です。ドキュメントを開いたときや、その他のトリガーイベントによってJavaScriptコードを実行することができます。DioDocs for PDFでは、ActionJavaScriptクラスとそのプロパティを利用して、このアクションタイプをPDFドキュメント内で定義できます。
以下のコードは、クリック時にJavaScriptコードを実行するテキストの例です。スクリプトは、複数の選択肢を持つポップアップメニューを表示し、ユーザーが選択したオプションをアラートで知らせます。
public class JavaScriptAction
{
const string js =
"var cChoice = app.popUpMenu(\"導入\", \" - \", \"第1章\",\r\n" +
"[ \"第2章\", \"第2章開始\", \"第2章中間\",\r\n" +
"[\"第2章終了\", \"終わり\"]]);\r\n" +
"app.alert(\"『\" + cChoice + \"』メニュー項目を選択しました\");";
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
var g = doc.NewPage().Graphics;
var jsAction = new ActionJavaScript(js);
var tf = new TextFormat()
{
Font = StandardFonts.Times,
FontSize = 14
};
// Draw the link string in a rectangle:
var text = "これをクリックするとポップアップメニューが表示されます。";
var rect = new RectangleF(new PointF(72, 72), g.MeasureString(text, tf));
g.FillRectangle(rect, Color.LightGoldenrodYellow);
g.DrawString(text, tf, rect);
var result = new LinkAnnotation(rect, jsAction);
doc.Pages.Last.Annotations.Add(result);
// Add warning about this possibly not working in a browser:
Common.Util.AddNote(
"JavaScript は、ブラウザーに組み込まれているビューアーなど、一部の PDF ビューアーでは動作しない場合がありますのでご注意ください。",
doc.Pages.Last, new RectangleF(rect.X, rect.Bottom + 36, 400, 400));
// Done:
doc.Save(stream);
return doc.Pages.Count;
}
}
制限事項
一部の PDF ビューア(例:ブラウザー組み込みビューアなど)では JavaScript が動作しない場合があります。
ActionSubmitForm を使用すると、ユーザーはインタラクティブフォームのフィールドを指定した URL(Uniform Resource Locator)に送信できます。通常は、これがフィールドを処理し、レスポンスを返す Web サーバーのアドレスとなります。DioDocs for PDFでは、ActionSubmitFormクラスおよびそのプロパティを利用して、このアクションタイプをPDFドキュメント内で定義できます。
以下のコードは、フォームを送信すると、データを受信して特別な形式でデータを返すサンプルサーバーにデータを送信するフォームを含みます。
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
var page = doc.NewPage();
var rc = Common.Util.AddNote(
"このサンプルでは、送信ボタンは ActionSubmitForm アクションに関連付けられており、" +
"URL は弊社のサンプルサーバー上で動作する POST ハンドラーを指しています。" +
"フォームが送信されると、そのハンドラーは入力済みフォームからフィールド名と値のコレクションを受け取り、" +
"それを簡単な HTML ページに返します。" +
"このサンプルをダウンロードして正しく実行するには、ご自身のハンドラーを用意し、" +
"Submit ボタンのアクションの URL をそのハンドラーを指すように変更する必要があります。",
page);
var g = page.Graphics;
var tf = new TextFormat() { Font = StandardFonts.Times, FontSize = 14 };
var ip = new PointF(72, rc.Bottom + 36);
float fldOffset = 72 * 2 + 46;
float fldHeight = tf.FontSize * 1.2f;
float dY = 32;
// テキストフィールドを追加します。
g.DrawString("名:", tf, ip);
var fldFirstName = new TextField() { Name = "名", Value = "太郎" };
fldFirstName.Widget.Page = page;
fldFirstName.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
fldFirstName.Widget.DefaultAppearance.Font = tf.Font;
fldFirstName.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldFirstName);
ip.Y += dY;
// テキストフィールドを追加します。
g.DrawString("姓:", tf, ip);
var fldLastName = new TextField() { Name = "姓", Value = "山田" };
fldLastName.Widget.Page = page;
fldLastName.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
fldLastName.Widget.DefaultAppearance.Font = tf.Font;
fldLastName.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldLastName);
ip.Y += dY;
// チェックボックスを追加します。
g.DrawString("メール配信を希望する:", tf, ip);
var fldCheckbox = new CheckBoxField() { Name = "メール配信を希望する", 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 fldAdditionalInfo = new TextField() { Name = "備考", Multiline = true };
fldAdditionalInfo.Widget.Page = page;
fldAdditionalInfo.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight * 2);
fldAdditionalInfo.Widget.DefaultAppearance.Font = tf.Font;
fldAdditionalInfo.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldAdditionalInfo);
ip.Y += dY * 2;
// 送信ボタンを追加します。
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.Page = page;
// 送信先URLを設定します。
btnSubmit.Widget.Activate = new ActionSubmitForm("/Samples/HandleFormSubmitFields");
doc.AcroForm.Fields.Add(btnSubmit);
// PDFを保存します。
doc.Save(stream);
return doc.Pages.Count;
}
ResetFormアクションを使用すると、ユーザーはインタラクティブなフォームフィールドをデフォルト値にリセットできます。フィールドにデフォルト値が定義されていない場合は、その値がクリアされます。値を持たないことができるフィールド(PushButtonFieldなど)には、このアクションは影響を与えません。DioDocs for PDFでは、ActionResetFormクラスおよびそのプロパティを利用して、このアクションタイプをPDFドキュメント内で定義できます。
以下のコードは、クリックするとフォームフィールドをデフォルト値にリセットするリセットボタン付きのフォームの例です。
public int CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
var page = doc.NewPage();
var rc = Common.Util.AddNote(
"このサンプルでは、リセットボタンに ActionResetForm アクションが関連付けられています。" +
"フィールドにデフォルト値が定義されていない場合、その値はクリアされます。", page);
var g = page.Graphics;
var tf = new TextFormat() { Font = StandardFonts.Times, FontSize = 14 };
var ip = new PointF(72, rc.Bottom + 36);
float fldOffset = 72 * 2 + 46;
float fldHeight = tf.FontSize * 1.2f;
float dY = 32;
// テキストフィールドを追加します。
g.DrawString("名:", tf, ip);
var fldFirstName = new TextField() { Name = "名", Value = "太郎" };
fldFirstName.Widget.Page = page;
fldFirstName.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
fldFirstName.Widget.DefaultAppearance.Font = tf.Font;
fldFirstName.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldFirstName);
ip.Y += dY;
// テキストフィールドを追加します。
g.DrawString("姓:", tf, ip);
var fldLastName = new TextField() { Name = "姓", Value = "山田" };
fldLastName.Widget.Page = page;
fldLastName.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight);
fldLastName.Widget.DefaultAppearance.Font = tf.Font;
fldLastName.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldLastName);
ip.Y += dY;
// チェックボックスを追加します。
g.DrawString("メール配信を希望する:", tf, ip);
var fldCheckbox = new CheckBoxField() { Name = "メール配信を希望する", 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 fldAdditionalInfo = new TextField() { Name = "備考", Multiline = true };
fldAdditionalInfo.Widget.Page = page;
fldAdditionalInfo.Widget.Rect = new RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight * 2);
fldAdditionalInfo.Widget.DefaultAppearance.Font = tf.Font;
fldAdditionalInfo.Widget.DefaultAppearance.FontSize = tf.FontSize;
doc.AcroForm.Fields.Add(fldAdditionalInfo);
ip.Y += dY * 2;
// リセットボタンを追加します。
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.Page = page;
btnReset.Widget.Activate = new ActionResetForm();
doc.AcroForm.Fields.Add(btnReset);
ip.Y += dY;
// PDFを保存します。
doc.Save(stream);
return doc.Pages.Count;
}