PDF 構文 インタラクティブ 機能 [Form]
PDF構文 [PDF Syntax ISO 32000-2]
ここでは32000-2規格に基づいたPDF2.0の構文(構造)について説明しています。
PDFファイルは8-bitデータを単位として構成されていて一般の文書編集アプリケーションで開くことができその内容を読取ることができます。ただし、バイナリのデータもそのまま(表示可能な文字に変換されずに)格納されていますので文字化けしているように表示されますが、これはPDFの仕様です。
ここではそのデータの一部を読み解くことでPDF文書へのデータ追加などPDF再構成の意味を説明しPDF StructureやPdftools SDKでのPDFデータ解析や編集をより詳細にできるようにします。
14. インタラクティブ フォームと非インタラクティブ フォーム
インタラクティブ フォーム(AcroForm とも呼ばれます)は、ユーザーからインタラクティブに情報を収集するためのフィールドの集まりです。
PDF文書にはページに表示される任意の数のフィールドを含めることができ、そのすべてが文書全体にわたる単一のグローバルなインタラクティブ フォームを構成します。
これらのフィールドの任意のサブセットを文書からインポートまたはエクスポートできます。
非インタラクティブ フォームは、フォーム フィールドの静的な表現です。
このフォームに元はインタラクティブなフィールド(テキストフィールドやラジオボタンなど)が含まれていたものが非インタラクティブなPDFファイルに変換された可能性があり、
フォーム フィールドや外部ソースから変換されたデータを表している可能性があります。
14.1 インタラクティブ フォーム
文書フォームの各フィールドは、Fieldディクショナリによって定義されます。 定義と命名のためにFieldを階層的に編成しField階層の祖先から属性を継承できます。 階層内のFieldの子にはページ内での外観(Appearance)を定義するWidget(ウィジェット)アノテーションを含めることができます。
Fieldの内で子を持つものを非終端フィールド(non-terminal field)といい、子を持たないものを終端フィールド(terminal field)といいます。
インタラクティブ フォームの終端フィールドには、ページ内での外観を定義するWidgetアノテーションである子を含める場合があります。
PDF Imager-LP(無償版)でPDF文書のフォント名を取得するソースコード
| C# | C/C++ | Python | ダウンロード |
// 初期化
MlpInitialize("0-0GR8-HE1103E6R1G6");
// オープン
if (0 <= MlpOpenDoc("HelloWorld.pdf", "", ""))
{
// 最初のフォーム データ
MlpFormData res = MlpInterractiveFormFirstData();
if (res.type > 0) {
printf("*** FORM DATA ***\n");
showData(&res);
// 2番目以降のフォーム データ
while(1) {
res = MlpInterractiveFormNextData();
if (res.type < 1) break;
showData(&res);
}
printf("\n\n");
}
else
printf("The document has not AcroForm\n\n");
// クローズ
MlpCloseDoc();
}
// 後始末
MlpUninitialize();
| 全体のソースコード |
| C# | C/C++ | Python | ダウンロード |
using (var mlp = new PdfImager()){
// ライセンスキー
mlp.Initialize("0-0GR8-HE1103E6R1G6");
// オープン
if (0 <= mlp.OpenDoc("HelloWorld.pdf"))
{
// PDF文書内のフォント総数
Console.WriteLine("フォント総数: {0}", mlp.SimpleFontListLength());
// 最初のフォームデータ
FormData res = mlp.InterractiveFormFirstData();
if (res.type > 0)
{
Console.WriteLine("*** FORM DATA ***");
ShowData(res);
// 2番目以降のフォームデータ
while (true)
{
res = mlp.InterractiveFormNextData();
if (res.type <= 0) break;
ShowData(res);
}
Console.WriteLine("\n");
}
else
Console.WriteLine("No Form Data");
// クローズ
mlp.CloseDoc();
}
}
| 全体のソースコード |
| C# | C/C++ | Python | ダウンロード |
import PdfImagerLP
# インスタンス生成
mlp = PdfImagerLP.Mlp();
# 初期化
res = mlp.Initialize('0-0GR8-HE1103E6R1G6')
if res!=0:
print('Bad License Key.')
exit()
# オープン
if 0 <= mlp.OpenDoc('HelloWorld.pdf'):
# 最初のフォーム データ
d = mlp.InteractiveFormFirstData()
if d.type > 0:
print('*** FORM DATA ***')
show_data(d)
# 2番目以降のフォーム データ
while(True):
d = mlp.InteractiveFormNextData()
if d.type < 1:
break
show_data(d)
else:
print('No Form')
print()
# クローズ
mlp.CloseDoc()
# 後始末
mlp.Uninitialize()
| 全体のソースコード |
14.2 インタラクティブ フォーム ディクショナリ
文書のインタラクティブ フォーム のコンテンツとプロパティはインタラクティブ フォーム ディクショナリに定義されます。このディクショナリはドキュメント カタログであるカタログ ディクショナリ のAcroForm項目から参照されなければなりません。
インタラクティブ フォーム ディクショナリには、以下の項目が含まれます。
| キー | タイプ | 値 |
|---|---|---|
| Fields | array | (必須)文書のルートFieldの参照配列 |
| NeedAppearances | boolean | (オプション)外観を持つ場合に真 外観を持つ場合はStreamと外観のディクショナリ(Widget Annotation)で定義します。 既定値は偽(Variable Text参照) |
| SigFlags | integer | (オプション)署名フィールドのレベルを示す。 既定値は0(ゼロ) |
| CO | array | (必要な場合あり)Fieldの値が変更された際の再計算の順序を定義する。 |
| DR | dictionary | (オプション)Fieldを表示する際に利用する既定のリソース(フォント、パターン、色空間など)を定義する。 |
| DA | string | (オプション)文書レベルのVariable Text FieldのDAの既定値を定義する。 |
| Q | integer | (オプション)文書レベルのVariable Text FieldのQの既定値を定義する。 |
| XFA | stream / array | XFAリソース |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
上記のディクショナリのSigFlagエントリは文書レベルでの署名フィールド特性を以下のようにそのビット位置の値で定義します。
| ビット位置 | 名前 | 意味 |
|---|---|---|
| 1 | SignaturesExist | このビットがセットされている場合は少なくとも1つの署名フィールドを含みます。 |
| 2 | AppendOnly | このビットがセットされている場合は以前の状態が無効になるように署名フィールドが変更されることがあります。 |
14.3 Fieldディクショナリ
インタラクティブ フォームのそれぞれのField(フィールド)はこのFieldディクショナリで定義されます。
Fieldディクショナリは1つ以上のツリー構造で階層的に構成されます。
多くのField属性は継承できますので、特定のFieldで明示指定されていない場合その値はField階層内の親から取得します。
Fieldディクショナリには、以下の項目が含まれます。
このFieldが端末Fieldであった場合は、外観を定義するWidgetアノテーションの要素が含まれる場合があります。
| キー | タイプ | 値 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| FT | name | (必須)このディクショナリが定義するFieldのタイプ
| ||||||||
| Parent | dictionary | (必須)直接の親であるField | ||||||||
| Kids | array | (場合による)直接の子であるFieldへの間接参照の配列 非終端FieldではこのFieldの直接の子孫であるFieldディクショナリを参照するためにKids配列が必要な場合があります。 | ||||||||
| T | text string | (オプション)部分的なField名 (Field Names参照) | ||||||||
| TU | text string | (オプション)代替Field名 (Alternate Descriptions参照) | ||||||||
| TM | text string | (オプション)文書からインタラクティブForm Fieldのデータを取り出す際に使用するマッピング名 | ||||||||
| Ff | integer | (オプション)Fieldのさまざまな特性を指定するフラグのセット(フィールドフラグ) 既定値:0 | ||||||||
| V | (various) | (オプション)Fieldの値 個々のフィールドタイプにより異なる | ||||||||
| DV | (various) | (オプション)リセットフォームアクションが実行される際の既定値 (Reset-Form Action参照) | ||||||||
| AA | dictionary | (オプション)様々なトリガーイベントに応じて実行されるFieldの動作を定義した追加のアクション (Trigger Events、Annotation Dictionary参照) |
オブジェクトのタイプは「2.5オブジェクト」を参照してください。
上記のディクショナリのFfエントリは、そのビット位置で以下の意味を持ちます。
| ビット位置 | 名前 | 意味 |
|---|---|---|
| 1 | ReadOnly | セットさせている場合ユーザーはこのFieldを変更できません。 |
| 2 | Required | セットされている場合サブミットアクションで取り出す場合にこのFieldは値を持たなければなりません。 |
| 3 | NoExport | セットされている場合サブミットアクションで取り出すことはできません。 |
14.3.1 Fieldの命名規則
FieldディクショナリのT要素では「部分的なField名」として文字列を記載します。完全な名称はPDF文書内に明示されていませんが、この部分名称と祖先から構築されます。
ただし、親のないFieldは部分名称と完全名称は同じです。
親を持つフィールドの完全名称は以下のようにピリオド(2Eh)で区切られた親の完全名称に子フィールドの部分名称を追加することによって構築されます。
parent’s_full_name.child’s_partial_name
ピリオドは完全名称の区切り文字として使用されるため、部分な名前名称にピリオド文字を含められません。
14.3.2 可変テキスト
Fieldの内容とプロパティが表示前にわかっていれば、その外観は指定されたAppearanceストリームによって表示できます。
しかしながら、表示の時点で確定していない値をもつFieldがあります。
この場合、PDF文書はFieldに表示内容としての静的なAppearanceストリームを提供できません。
その代わりとしてPDFプロセッサはAppearanceストリームを動的に構築しなければなりません。
以下の表はFieldの外観に対して一般的な情報を提供し、Fieldに含まれる特定のテキストと組み合わせてAppearanceストリームを構築するものです。
| キー | タイプ | 値 | ||||||
|---|---|---|---|---|---|---|---|---|
| DA | string | (必須)Fieldのテキストサイズや色などのプロパティを定義する一連の有効なページコンテンツのグラフィックまたはテキスト状態演算子を含むデフォルトの外観文字列 | ||||||
| Q | integer | (オプション)テキスト表示をジャスティファイを指定するコード
| ||||||
| DS | text string | (オプション)XFAによる既定のスタイル文字列 | ||||||
| RV | text stringまたは text stream | (オプション)XFAによるリッチテキスト文字列 |
新しいAppearenceストリームはFieldのWidgetアノテーションに関連付けられたAppearenceディクショナリの「通常の外観(N:Normal)」になります。
14.4 Buttonタイプ フィールド
Buttonタイプには以下の種類があります。
- プッシュボタン(push-button)
- チェックボタン(check box)
- ラジオボタン(radio button)
| ビット位置 | 名前 | 意味 |
|---|---|---|
| 15 | NoToggleToOff | (ラジオボタンのみ)設定されている場合は常に単一のラジオボタンが選択され、現在選択されているボタンを選択しても効果はありません。クリアされているの場合は選択したボタンをクリックすると選択が解除され、ボタンは選択されません。 |
| 16 | Radio | 設定されている場合に関連するフィールドはラジオボタンです。オフの場合のフィールドはチェックボタンです。このフラグは、Pushbuttonフラグがクリアされている場合にのみ設定できます。 |
| 17 | Pushbutton | 設定されている場合のフィールドは永続的な値を持たないプッシュボタンです。 |
| 26 | RadiosInUnison | 設定されている場合はオン状態に同じ値を持つラジオボタン フィールド内のラジオボタンのグループが一斉にオンとオフを切り替えます(1つがチェックされると、すべてがチェックされます)。クリアの場合では、ボタンは相互に排他的です。 |
14.4.1 プッシュボタン
プッシュボタンのフィールド タイプは"Btn"であり、Pushbuttonフラグがオンに設定されます。
プッシュボタンは永続的な値を保持しないためFieldディクショナリのVおよびDV要素を使用しません。
14.4.2 チェックボタン
チェックボタンは利用者がマウスまたはキーボードで操作したときにオンとオフの2つの状態を切り替えられるボタンです。
このフィールド タイプは"Btn"であり、そのフィールドフラグはPushbuttonフラグおよびRadioフラグの両方がオフでなければなりません。
各状態は個別の外観(Annotation)を持つことができ、フィールドのWidget Annotationの外観ストリームによって定義されます。
オフ状態の外観はオプションですが、存在する場合は"Off"という名前で保存されます。
14.4.3 ラジオボタン
ラジオボタンは関連するボタンのセット(グループ)です。チェックボタンと同様に個々のラジオボタンにはオンとオフの2つの状態があります。
通常は、1つのラジオボタンを直接オフにすることはできませんが、別のボタンをオンにした結果としてオフにすることができます。
一連の(グループの)ラジオボタンは任意の時点で最大1つのボタンをオン状態にします。いずれかのボタンを選択すると、他のすべてのボタンが自動的に選択解除されます。
フィールド タイプはBtnで、Pushbuttonフラグがクオフで、Radioフラグがオンに設定されます。
ラジオボタンには追加のフラグNoToggleToOffがあります。このフラグがオンの場合はラジオボタンの1つだけが常に選択されることが指定され、現在選択されているボタンをクリックしても効果はありません。
NoToggleToOffフラグがオフの場合は選択したボタンをクリックすると選択が解除され、ボタンは選択されません。
サンプルPDF文書
ButtonタイプのサンプルPDF文書はこちらです。 サンプルPDF文書の内容はこちらです。
AcroFormはオブジェクト3(3 0 obj)に記載され、ButtonフォームのFieldはオブジェクト11,12,13(11 0 obj, 12 0 obj, 13 0 obj)に記載されています。
テキスト フィールドの値を取得するサンプルでFormの内容を取得できます。
14.5 Textタイプ フィールド
テキストフィールド(タイプは"Tx")は、通常は、キーボードから入力されるテキスト入力データ用のボックスまたは余白です。
フィールドディクショナリにおけるフィールドフラグのMultilineフラグ設定に応じてテキストは1行に制限されるか、複数行にまたがることが許可される場合があります。
以下はTextフィールド固有のフラグです。
| ビット位置 | 名前 | 意味 |
|---|---|---|
| 13 | Multiline | オンの場合はフィールドに複数行のテキストが含まれる場合があります。オフの場合はフィールドのテキストは1行に制限されます。 |
| 14 | Password | オンの場合、このフィールドは画面に表示されないようにするための安全にパスワードを入力するためのものです。キーボードから入力された文字はアスタリスクなどの判読できない形式でエコーされます。 パスワードの機密性を担保するために、このフラグが設定されている場合はPDFプロセッサがこのフィールド値をPDFファイルに保存しません。 |
| 21 | FileSelect | オンの場合、フィールドに入力されたテキストはその内容がファイルのパス名であることを表します。 |
| 23 | DoNotSpellCheck | オンの場合、フィールドに入力されたテキストはスペルチェックされません。 |
| 24 | DoNotScroll | オンの場合、テキストフィールドはAnnotationの長方形内に収まる以上のテキストを収容するためのスクロールをしません。フィールドがいっぱいになるとインタラクティブなフォームへの入力にそれ以上のテキストは受け入れられません。 |
| 25 | Comb | MaxLen要素がテキストフィールド ディクショナリに存在し、Multiline、Password、および FileSelect フラグがオフの場合にだけ設定できます。 オンの場合、テキストフィールドはMaxLenの値と同じ数のマス目で自動的に分割され、テキストはそれらのマス目に配置されます。 |
| 26 | RichText | オンの場合、このフィールドの値はリッチテキスト文字列になります。テキストフィールドに値がある場合はフィールドディクショナリのRV要素にはリッチテキスト文字列が指定されます。 |
フィールドのテキストは、フィールド ディクショナリのV(Value)要素にテキスト文字列で保持されます。
このテキスト文字列またはストリームの内容は、テキストフィールドを表示するためのAppearanceストリームを構築するために使用されます。
テキストは単一のスタイル(フォント、サイズ、色など)で表示されます。
テキストフィールドのフィールドディクショナリには、以下の追加要素が含まれる場合があります。
| キー | タイプ | 値 |
|---|---|---|
| MaxLen | integer | (オプション)フィールドのテキストの最大長(文字数) |
サンプルPDF文書
TextタイプのサンプルPDF文書はこちらです。 サンプルPDF文書の内容はこちらです。
AcroFormはオブジェクト3(3 0 obj)に記載され、TextフォームのFieldはオブジェクト12,13,14(12 0 obj, 14 0 obj, 14 0 obj)に記載されています。
テキスト フィールドの値を取得するサンプルでFormの内容を取得できます。
14.6 Choiceタイプ フィールド
Choiceフィールドはフィールドタイプ"Ch"であり、いくつかのテキスト項目を含み、そのうちの1つ以上がフィールドの値として選択されます。
アイテムは、次の2つの形式のいずれかで利用者に表示されます。
- スクロール可能なリストボックス
- ドロップダウンリストで構成されるコンボボックス
コンボボックスでは、定義済みの選択肢や利用者が入力できる編集可能なテキストボックスが付随します。
| ビット位置 | 名前 | 意味 |
|---|---|---|
| 18 | Combo | オンの場合、フィールドはコンボボックスです。 オフの場合、フィールドはリストボックスです。 |
| 19 | Edit | (Comboフラグがオンの場合のみ有効)オンの場合、コンボボックスには編集可能なテキストボックスとドロップダウンリストが含まれます。 オフの場合は、ドロップダウンリストのみが含まれます。 |
| 20 | Sort | オンの場合、フィールドのオプション項目はアルファベット順にソートされます。このフラグは、PDFリーダーではなく、PDFライターが使用するためのものです。 |
| 22 | MultiSelect | オンの場合、複数のオプション項目を同時に選択できます。オフの場合、1つだけのアイテムが選択できます。 |
| 23 | DoNotSpellCheck | オンの場合、フィールドに入力されたテキストはスペルチェックされません。このフラグはComboフラグとEditフラグの両方がオンの場合のみ有効です。 |
| 27 | CommitOnSelChange | 通常のChoiceフィールドで値を選択するには次の3つのアクションが必要です。
|
以下は、Chiceフィールドに固有なフィールドディクショナリの構成要素です。
| キー | タイプ | 値 |
|---|---|---|
| Opt | array | (オプション)利用者に提示されるオプションの配列。 配列の各要素は選択可能なオプションの1つを表すテキスト文字列、またはオプションの抽出値とオプション名として表示されるテキストの2つのテキスト文字列で構成される配列のいずれか この要素が存在しない場合、選択肢は利用者に表示されません。 |
| TI | integer | (オプション)スクロール可能なリストボックスの場合、先頭のインデックス(リストに表示されるOpt配列内の最初のインデックス)。 既定値は0 |
| I | array | (必須の場合あり)複数選択を許可する場合、現在選択されているオプション項目のOpt配列内のインデックスで、昇順で並べ替えられた整数の配列。このエントリによって識別される項目がフィールドディクショナリのV要素の項目と異なる場合にはV要素値が使用されます。 |
Opt配列は選択フィールドのオプションのリストを指定します。各要素は画面に表示されるテキスト文字列で表されます。
Opt配列の各要素にはこのテキスト文字列自体、または二要素配列のいずれかが含まれます。二要素配列の場合、最初の要素は表示される文字列で、2番目の要素は抽出されるテキスト文字列です。
サンプルPDF文書
ChoiceタイプのサンプルPDF文書はこちらです。 サンプルPDF文書の内容はこちらです。
AcroFormはオブジェクト3(3 0 obj)に記載され、ChoiceフォームのFieldはオブジェクト11,12,13(11 0 obj, 12 0 obj, 13 0 obj)に記載されています。
テキスト フィールドの値を取得するサンプルでFormの内容を取得できます。