Добавляем в программу просмотр PDF с помощью ActiveX

Существует два основных способа организовать в программе просмотр документов в формате PDF.

  • Использование технологии ActiveX;
  • Использование специальных компонентов.

Компоненты для работы с PDF есть не во всех выпусках Delphi и чаще всего их нужно искать и устанавливать дополнительно. В тоже время, для использования ActiveX необходимо всего лишь наличие на компьютере пользователя соответствующего программного обеспечения. В данном случае Adobe Acrobat Reader (бесплатная) или Adobe Acrobat.

Работу с ActiveX можно условно разделить на два этапа.

  • Импорт библиотеки типов или компонентов;
  • Собственно, использование импортированных средств в приложении.
Импорт компонентов ActiveX

Для импорта компонентов используется команда «Component» – «Import Component» в главном меню Delphi. Сам процесс импорта реализован в виде мастера.

На первой странице мастера выбираем «Import ActiveX Control».

1я страница мастера

Далее выбираем нужный нам компонент. В данном случае Adobe Acrobat Browser Control Type Library 1.0.

Выбор компонента

Далее выбираем панель компонентов, на которой будут размещаться компоненты для просмотра с PDF после импорта.

Выбор панели компонентов

После этого необходимо решить, как поступить с импортируемыми компонентами. Так как планируется их использование в виде компонентов Delphi, выбираем «Install to New Package».

Создание модуля компонента

Теперь остаётся только указать имя вновь создаваемого пакета.

Имя пакета

После нажатия на кнопку «Finish», компоненты ActiveX для просмотра PDF будут импортированы в Delphi.

Импортированные компоненты

Просмотр PDF в приложении

Для создания просмотра PDFфайлов в приложении средствами ActiveX необходим компонент TAcroPDF. Процесс его импорта подробно описан выше.

Загрузка файла для просмотра производится при помощи метода LoadFile, который принимает единственный параметр – имя файла.

В качестве примера создадим следующее приложение. Поместим на форму компоненты TAcroPDF, TOpenDialog и TButton как показано на скриншоте ниже.

Форма с компонентами

При нажатии на кнопку вызываем диалог открытия файла для выбора файла PDF для просмотра.

После компиляции программа сможет открывать и выводить для просмотра в своём окне PDF файлы.

Работа программы

4 комментария

  1. Здравствуйте.
    Я сделал всё как написано. Файл просматривает. Но при закрытии приложения возникает сообщение о нарушении доступа по …….. адресу в модуле exe файла.
    Подскажите пожалуйста как решить эту проблему.
    С Уважением.

    1. Здравствуйте.
      Сказать честно, не припомню, чтобы у меня с ActiveX от Acrobat возникали проблемы.
      Что касается решения, то как я смогу Вам его подсказать, не имея достаточной информации? Ведь Вы не предоставили даже скриншота Вашей ошибки. Конечно, по её описанию, можно предположить, что речь идёт об Access Violation. Но, согласитесь, от «гаданий на кофейной гуще» толку мало. Поэтому всё, что я могу посоветовать, это отладка проблемного участка кода или, как вариант, можно попробовать перевод просмотра PDF на сторонние библиотеки. В последнем случае Ваша программа не будет зависеть от установки стороннего ПО.
      Помочь Вам чем-то большим у меня, к сожалению, возможности нет.

  2. Олег, есть решение проблемы — см.
    https://stackoverflow.com/questions/37885850/acrobat-reader-activex-access-violation-on-form-close
    Если коротко, то нужно при закрытии формы сделать следующее:
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
    Ref : Integer;
    begin
    Ref := AcroPdf1.ControlInterface._AddRef;
    AcroPdf1.Src := '';
    AcroPdf1.Free;
    AcroPdf1 := Nil;
    end;

  3. Олег, там, по этой же ссылке в самом конце есть более грамотное решение — исправить сам TLB-файл, а не таскать из проекта в проект искусственный FormClose!
    я проверил — всё отлично работает:

    The better solution is to edit the TPDF Object in «AcroPDFLib_Tlb.pas»
    Just add the proper destructor to the Code to free the OLE Object:
    Declaration
    Type
    TAcroPDF = class(TOleControl)

    public
    destructor Destroy; override; // <- New Line

    end;
    Implementation

    destructor TAcroPDF.Destroy;
    begin
    FIntf := NIL;
    inherited;
    end;

Добавить комментарий для Олег Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *