Acrobat のフル バージョンには、Delphi コードからフォーム フィールドにアクセスして操作する機能が含まれており、ドキュメントへのフォーム フィールドの追加、OLE オートメーションによるコードを使用した入力、不要な場合の削除などの操作をサポートしています。
独自のアプリで Acrobat ウィンドウをホストして、TPanel に fi を表示することができます。OpenInWindowEx
これは、Acrobat_TLB.Pas の CAcroAVDoc オブジェクトのメソッドを使用して行うことができます。ただし、これは PDF ドキュメント (および注釈/コメント、iirc) を描画するだけで、表示を提供したり、Acrobat の GUI へのアクセスを提供したりしません。Delphi アプリからそれを行う唯一の方法は、TOleContainer オブジェクトで Pdf ファイルを開くことですが、そうすると、Acrobat の GUI が独自のウィンドウで開き、自分のウィンドウではホストされません。そして、最近の OleContainer インターフェースは、画面上で前向きに前時代的なものに見えます。
したがって、Acrobat のフォーム フィールド エディター GUI とのやり取りが必要な場合は、行き詰まっていると思います。一方、フォーム フィールドを操作して、独自の DIY コードを使用して入力することもできます。以下の例を参照してください。
コードでフォーム フィールドを操作するには、Acrobat Forms タイプ ライブラリを Delphi にインポートする必要があります。
インポートする必要があるタイプ ライブラリは、
D:\Program Files\Adobe\Acrobat 8.0\Acrobat\plug_ins\AcroForm.api
Delphi の TRegSvr ユーティリティ(または Windows の RegSvr32)を使用して、このファイルを Windows に登録する必要がある場合があります。
これにより、フォームを操作するための最上位オブジェクトである IAFormApp オブジェクトや、個々のフィールドを作成するための IField オブジェクトにアクセスできます。
Acrobat SDK ドキュメントをお持ちの場合、Ole Automation を介してこれらのオブジェクトを使用する方法は、「Interapplication Communication API Reference」(iac_api_reference.pdf) に記載されています。IFIeld インターフェースの Delphi インポートを以下に含めたので、それでできることの種類を確認できます。
「PDF フォームをインタラクティブに編集してフォーム フィールドをドロップする方法はありますか?」
Acrobat でフォームを開いた状態で、フィールドをドロップできます (「ドロップ」が「削除」を意味する場合)。Remove
IFields インターフェイスのメソッドを呼び出すことにより、コードでこれを行うことができます。おっと、「フォームにフィールドをドロップできますか」という意味であれば、はい、使用可能なフィールドのリストを作成し、リストからフィールドを選択することで、それを行うこともできます。
「Adobe やその他のソフトウェアを Delphi に埋め込んで、既存の PDF を編集することはできますか?」
はい、次の例は、Delphi コードから、既存のフィールドに入力して新しいフィールドを追加する方法を示しています。
implementation
{$R *.DFM}
uses
AFORMAUTLib_TLB, Acrobat_TLB;
const
scDocument = 'D:\delphi\code\acrobat\blank.pdf';
procedure TForm1.FillInForm;
var
Acrobat : CAcroApp;
AVDoc : CAcroAVDoc;
PDDoc : CAcroPDDoc;
FormApp : IAFormApp;
Fields : IFields;
Field : IField;
begin
Acrobat := CoAcroApp.Create;
AVDoc := CoAcroAVDoc.Create;
AVDoc.Open(scDocument, scDocument);
PDDoc := AVDoc.GetPDDoc as CAcroPDDoc;
FormApp := CoAFormApp.Create;
Fields := FormApp.Fields as IFields;
Field := Fields.Item['Text1'] as IField;
Field.Value := 'My test';
Field := Fields.Add('AnotherField', 'text',
0,
360,
790,
360 + 200,
790 - 30) as IField;
Field.Value := 'Added';
end;
ところで、これについて質問するつもりだったかどうかはわかりませんが、Delphi アプリのウィンドウで Acrobat の GUI をホストすることもできます。ただし、それについて知りたい場合は、別の技術的な問題であるため、別の q で質問する必要があります。
AFORMAUTLib_TLB.Pas からの抜粋:
*********************************************************************//
// Interface: IField
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {673E8454-7646-11D1-B90B-00A0C9259304}
// *********************************************************************//
IField = interface(IDispatch)
['{673E8454-7646-11D1-B90B-00A0C9259304}']
// getters amd setters omitted
procedure SetBorderColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
procedure SetBackgroundColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
procedure SetJavaScriptAction(const bstrTrigger: WideString; const bstrTheScript: WideString); safecall;
procedure SetSubmitFormAction(const bstrTrigger: WideString; const bstrTheURL: WideString;
theFlags: Integer; arrFields: OleVariant); safecall;
procedure SetResetFormAction(const bstrTrigger: WideString; theFlags: Integer;
arrFields: OleVariant); safecall;
procedure SetButtonIcon(const bstrFace: WideString; const bstrFullPath: WideString;
pageNum: Smallint); safecall;
procedure SetForegroundColor(const bstrColorSpace: WideString; GorRorC: Single; GorM: Single;
BorY: Single; K: Single); safecall;
procedure PopulateListOrComboBox(arrItems: OleVariant; arrExportVal: OleVariant); safecall;
procedure SetButtonCaption(const bstrFace: WideString; const bstrCaption: WideString); safecall;
property Name: WideString read Get_Name;
property Value: WideString read Get_Value write Set_Value;
property IsHidden: WordBool read Get_IsHidden write Set_IsHidden;
property IsTerminal: WordBool read Get_IsTerminal;
property Type_: WideString read Get_Type_;
property IsReadOnly: WordBool read Get_IsReadOnly write Set_IsReadOnly;
property IsRequired: WordBool read Get_IsRequired write Set_IsRequired;
property PrintFlag: WordBool read Get_PrintFlag write Set_PrintFlag;
property BorderWidth: Smallint read Get_BorderWidth write Set_BorderWidth;
property Alignment: WideString read Get_Alignment write Set_Alignment;
property CharLimit: Smallint read Get_CharLimit write Set_CharLimit;
property DefaultValue: WideString read Get_DefaultValue write Set_DefaultValue;
property IsMultiline: WordBool read Get_IsMultiline write Set_IsMultiline;
property IsPassword: WordBool read Get_IsPassword write Set_IsPassword;
property CalcOrderIndex: Smallint read Get_CalcOrderIndex write Set_CalcOrderIndex;
property BorderStyle: WideString read Get_BorderStyle write Set_BorderStyle;
property Editable: WordBool read Get_Editable write Set_Editable;
property Highlight: WideString read Get_Highlight write Set_Highlight;
property Style: WideString read Get_Style write Set_Style;
property TextFont: WideString read Get_TextFont write Set_TextFont;
property TextSize: Smallint read Get_TextSize write Set_TextSize;
property ButtonLayout: Smallint read Get_ButtonLayout write Set_ButtonLayout;
property NoViewFlag: WordBool read Get_NoViewFlag write Set_NoViewFlag;
end;
2021 年 11 月 11 日更新
Delphiのより新しいバージョンでインポートユニットAcrobat_Tlb.PasおよびAFORMAUTLib_TLB.Pasを生成する方法の正確な詳細を要求する削除されたnot-an-answerに応じて、この回答を更新しています。
次の方法は、Adobe オンライン ストアから購入してインストールした「Adobe Acrobat Standard 2020」と Delphi 10.4.2 で動作します。
Acrobat_Tlb.Pas の場合
新しい VCL プロジェクトを作成し、プロジェクトとそのフォーム ファイルを保存します。
IDE で、[コンポーネント] | [コンポーネント] に移動します。コンポーネントをインポートし、タイプ ライブラリのインポートを選択します
[次へ] をクリックし、[登録済みのタイプ ライブラリ] タブで、[説明] 列の幅を拡大して、完全な説明を表示できるようにします。
説明が Acrobat だけのエントリまで下にスクロールします。ウィザードの残りのタブをクリックします。適切な項目があれば、次のタブの ClassName(s) ボックスに「AcroApp=TAcroApp, AcroAVDocs=...」が表示されます。
次のタブで、[Create Unit] ラジオ ボタンを選択します。その後、[完了] をクリックすると、Acrobat_Tlb.Pas が作成されます。
AFORMAUTLib_Tlb.Pas の場合
次の変更を加えて、Acrobat_Tlb.Pas の手順を繰り返します。
- ステップ 4 で必要な説明は AFormAut 1.0 Type Library であり、次のタブの ClassName(s) ボックスには「AFormApp=TAFormApp,Fields= ...」が含まれている必要があり、生成されたインポート ユニットは AFORMAUTLib_TLB.Pas である必要があります。