2016-03-21 2 views
0

Я работаю над приложением, где мне нужно иметь возможность редактировать существующую форму PDF и интерактивно отбрасывать поля формы PDF в файл.Интеграция Adobe SDK в Delphi для редактирования PDF

Поля формы, такие как выпадающий, текст, многострочный текст, переключатель. В настоящее время я использую элементы управления ActiveX для открытия PDF-файлов в приложении Delphi.

Однако я могу читать только PDF-форму, но я хочу, чтобы ее можно было отредактировать, также как и удаление поля формы.

Идея состоит в том, чтобы добавить форму формы в существующую форму PDF и сохранить ее. Я пробовал Gnostice, PowerPDF, quickPDF, но они не позволяют интерактивно изменять файлы PDF, такие как ADOBE. Это онлайн-приложение PDFEscape позволяет нам создавать новые и редактировать существующие формы PDF в интерактивном режиме.

enter image description here

В гностических, мы можем Edit программно, например:

enter image description here

Вопросы:

  • Есть ли способ, где мы можем в интерактивном режиме редактирования формы PDF уронить Поля формы?
  • Можете ли мы встроить Adobe или любое другое программное обеспечение в Delphi для редактирования существующего PDF?

ответ

4

Полная версия Acrobat включает в себя средства для доступа & манипулировать поля формы из Delphi кода, а также поддерживает такие операции, как добавление полей формы в документ, заполняя их с помощью кода с помощью автоматизации OLE, и удалить их, если они не нужно.

Конечно, вы можете разместить окно Acrobat в своем собственном приложении, чтобы оно отображало f.i. в TPanel. Вы можете сделать это, используя метод OpenInWindowEx объекта CAcroAVDoc в Acrobat_TLB.Pas. Тем не менее, это только рисует документ PDF (плюс аннотации/комментарии, iirc), он не обеспечивает отображение или обеспечивает доступ к gui Acrobat. Единственный способ, который я знаю сделать из приложения Delphi, - открыть файл Pdf в объекте TOleContainer, но если вы это сделаете, gui Acrobat откроется в своем собственном окне, а не размещен в одном из ваших. В наши дни интерфейс OleContainer выглядит на переднем плане допотопным.

Так что если вы хотите взаимодействовать с редактором форм-полей Acrobat, я думаю, что вы застряли. С другой стороны, вы можете манипулировать полями формы и заполнять их с помощью собственного кода DIY - см. Пример ниже.

Чтобы обработать поля формы в коде, вам необходимо импортировать библиотеку типов Acrobat Forms в Delphi.
Библиотека типов необходимо импортировать ваш эквивалент

D:\Program Files\Adobe\Acrobat 8.0\Acrobat\plug_ins\AcroForm.api 

Вы, возможно, потребуется зарегистрировать этот файл с ОС Windows с помощью утилиты TRegSvr в Delphi (или regsvr32 Windows');

Это дает вам доступ к объекту IAFormApp, который является объектом верхнего уровня для работы с формами и, среди прочих, объектом IField, который предназначен для создания отдельного поля.

Если у вас есть документация Acrobat SDK, способ использования этих объектов через Ole Automation описан в «Справочнике API связи между приложениями» (iac_api_reference.pdf). Я включил импорт Delphi интерфейса IFIeld ниже, чтобы вы могли видеть то, что вы можете с ним сделать.

«Есть ли способ, в котором мы можем интерактивно редактировать форму PDF, чтобы удалить поля формы?»

С формой, открытой в Acrobat, да, вы можете сбросить поле (если «drop» вы имеете в виду «удалить»). Вы можете сделать это в коде, вызвав метод 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; 

Btw, я не уверен, были ли намерены спросить об этом, но также можно разместить gui Acrobat в окне приложения Delphi. Но если вы хотите узнать об этом, вам нужно спросить об этом в отдельном 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; 
+2

Тот факт, что вы не приняли или отреагировали на этот ответ заставляет меня задаться вопросом, есть ли аспект вашего д, что я не ответил. Здесь? – MartynA