2016-04-26 3 views
0

Я изучаю подготовку словарной программы с delphi. До сих пор я решил свои проблемы с документами Word, но у меня возникла проблема с документами в формате PDF. Я импортировал и установил компонент AcroPdf с Delphi 7, и я хочу получить слово (или текст), которое было выбрано dblclicking пользователем из pdf-документа, который был просмотрен компонентом ACROPDF в Delphi. Если я могу его получить, я отправлю ему базу данных словарей напрямую. Если вы поможете мне, я буду рад. Спасибо ... Remzi MAKAKКак получить выделенный текст из компонента acropdf для прямого редактирования с Delphi 7

+0

Вы используете полную версию Adobe Acrobat или Reader? – MartynA

+0

Да, я использую полную версию Adob ​​Acrobat X pro. –

+0

Дорогие друзья, вы ничего не знаете об этой теме? –

ответ

1

Следующий показывает один из способов получения выделенного текста из документа Pdf, который является открыт в Adobe Acrobat Professional (версия 8, английская версия).

Update Оригинальная версия этого ответа запущенного проверить логический результат вызова MenuItemExecuteи указан неверный аргумент к нему. Обе эти точки зафиксированы в обновленной версии этого ответа. Оказалось, что причиной отказа вызова MenuItemExecute было то, что перед копированием текста, выбранного в буфер обмена, необходимо вызвать BringToFront в документе Acrobat.

  1. Создать новый проект Delphi VCL.

  2. В IDE D7 идут к Projects | Import Type Library, и в Import Type Library всплывающем окне, прокрутите вниз, пока не появится что-то вроде «Acrobat (версия 1.0) в списке файлов и „TAcroApp, TAcroAVDoc ...“в Class names окно. это один вам нужно импортировать. Нажмите кнопку Create unit/

  3. в главном виде файла проекта

    а. Убедитесь, что он использует устройство Acrobat_Tlb.Pas с шага 2. вы можете необходимо добавить путь к тому месту, где вы сохранили Acrobat_Tlb.Pas, в SearchPath вашего проекта.

    b. Бросьте TButton на форму, назовите ее btnGetSel. Бросьте TEdit на форму и назовите ее edSelection

  4. Отредактируйте исходный код блока основной формы, как показано ниже.

  5. Установка отладчика точки останова на Acrobat.MenuItemExecute('File->Copy'); ли не установить контрольную точку в GetSelection процедуры, так как это, скорее всего, чтобы победить вызов BringToFront в нем.

  6. Закройте любой исполняемый экземпляр Adobe Acrobat. Зайдите в диспетчер задач, чтобы не было скрытых экземпляров запуска. Причина этого шага заключается в том, чтобы убедиться, что при запуске приложения он «разговаривает» с экземпляром Acrobat, который он запускает, а не другой.

  7. Скомпилируйте и запустите приложение. Как только приложение и Acrobat открыты, переключитесь на Acrobat, выберите текст, вернитесь в свое приложение и нажмите кнопку btnGetSel.

Код:

uses ... Acrobat_Tlb, ClipBrd; 

    TDefaultForm = class(TForm) 
    [...] 
    private 
    FFileName: String; 
    procedure GetSelection; 
    public 
    Acrobat : CAcroApp; 
    PDDoc : CAcroPDDoc; 
    AVDoc : CAcroAVDoc; 
    end; 

[...] 

procedure TDefaultForm.FormCreate(Sender: TObject); 
begin 
    // Adjust the following path to suit your system. My application is 
    // in a folder on drive D: 
    FFileName := ExtractfilePath(Application.ExeName) + 'Printed.Pdf'; 
    Acrobat := CoAcroApp.Create; 
    Acrobat.Show; 
    AVDoc := CoAcroAVDoc.Create; 
    AVDoc.Open(FileName, FileName); // := Acrobat.GetAVDoc(0) as CAcroAVDoc; // 

    PDDoc := AVDoc.GetPDDoc as CAcroPDDoc; 
end; 

procedure TDefaultForm.btnGetSelClick(Sender: TObject); 
begin 
    GetSelection; 
end; 

procedure TDefaultForm.GetSelection; 
begin 
    // call this once some text is selected in Acrobat 
    edSelection.Text := ''; 

    if AVDoc.BringToFront then // NB: This call to BringToFront is essential for the call to MenuItemExecute('Copy') to succeed 
    Caption := 'BringToFront ok' 
    else 
    Caption := 'BringToFront failed'; 
    if Acrobat.MenuItemExecute('Copy') then 
    Caption := 'Copy ok' 
    else 
    Caption := 'BringToFront failed'; 

    Sleep(100); // Normally I would avoid ever calling Sleep in a Delphi  
    // App's main thread. In this case, it is to allow Acrobat time to transfer the selected 
    // text to the clipboard before we attempt to read it. 

    try 
    edSelection.Text := Clipboard.AsText; 
    except 
    end; 

end; 
+0

К сожалению, в «Acrobat_Tlb» была опечатка, когда я редактировал ее вручную в списке Uses. Исправлена. – MartynA

+0

Mr.MartynA, благодарю вас за помощь. У меня есть ваш ответ. Теперь я пытаюсь изменить его. Acrobat XI, когда я получу результат, я сообщу вам. –

+0

Mr.MartynA, я проверил программные коды с полной версией Acrobat XI pro, но я не смог добиться успеха. Я понял, что ACROBAT.MENUITEMEXECUTE ('FILE-> COPY') не работает. –

Смежные вопросы