2

既存の PDF フォームを編集し、PDF フォーム フィールドをインタラクティブにファイルにドロップできるようにする必要があるアプリケーションに取り組んでいます。

ドロップダウン、テキスト、複数行テキスト、ラジオ ボタンなどのフォーム フィールド。現在、ActiveX コントロールを使用して、Delphi アプリケーションで PDF ファイルを開いています。

ただし、PDFフォームしか読めませんが、フォームフィールドをドロップするように編集できるようにしたいです。

アイデアは、既存の PDF フォームに Form フォームを追加して保存することです。Gnostice、PowerPDF、quickPDF を試しましたが、ADOBE のように PDF ファイルをインタラクティブに変更することはできません。このオンライン アプリケーションPDFEscapeを使用すると、インタラクティブに新しい PDF フォームを作成したり、既存の PDF フォームを編集したりできます。

ここに画像の説明を入力

Gnostic では、次のようにプログラムで編集できます。

ここに画像の説明を入力

質問:

  • PDF フォームをインタラクティブに編集してフォーム フィールドをドロップする方法はありますか?
  • 既存の PDF を編集するために Adob​​e やその他のソフトウェアを Delphi に埋め込むことはできますか?
4

1 に答える 1

7

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 でフォームを開いた状態で、フィールドをドロップできます (「ドロップ」が「削除」を意味する場合)。RemoveIFields インターフェイスのメソッドを呼び出すことにより、コードでこれを行うことができます。おっと、「フォームにフィールドをドロップできますか」という意味であれば、はい、使用可能なフィールドのリストを作成し、リストからフィールドを選択することで、それを行うこともできます。

「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 の場合

  1. 新しい VCL プロジェクトを作成し、プロジェクトとそのフォーム ファイルを保存します。

  2. IDE で、[コンポーネント] | [コンポーネント] に移動します。コンポーネントをインポートし、タイプ ライブラリのインポートを選択します

  3. [次へ] をクリックし、[登録済みのタイプ ライブラリ] タブで、[説明] 列の幅を拡大して、完全な説明を表示できるようにします。

  4. 説明が Acrobat だけのエントリまで下にスクロールします。ウィザードの残りのタブをクリックします。適切な項目があれば、次のタブの ClassName(s) ボックスに「AcroApp=TAcroApp, AcroAVDocs=...」が表示されます。

    次のタブで、[Create Unit] ラジオ ボタンを選択します。その後、[完了] をクリックすると、Acrobat_Tlb.Pas が作成されます。

AFORMAUTLib_Tlb.Pas の場合

次の変更を加えて、Acrobat_Tlb.Pas の手順を繰り返します。

  1. ステップ 4 で必要な説明は AFormAut 1.0 Type Library であり、次のタブの ClassName(s) ボックスには「AFormApp=TAFormApp,Fields= ...」が含まれている必要があり、生成されたインポート ユニットは AFORMAUTLib_TLB.Pas である必要があります。
于 2016-03-21T08:29:40.227 に答える