В этой статье, рассмотрим, как создавать свои pdf-документы, а в следующей статье рассмотрим, как можно просматривать pdf-документы в своих проектах, а также печатать содержимое, перемещаться по документу и так далее.

Для этого нам понадобятся компоненты с вкладки Rave. Давайте же установим, необходимые нам, для работы компоненты, а это:

  • TRvNDRWriter
  • TRvRenderPdf
  • TButton

Компонент TRvNDRWriter предназначен для записи в pdf-файл информацию (текстовую, графическую), через поток.

Компонент TRvRenderPdf предназначен для создания, отрисовки информации (текстовой, графической и так далее). Ну и по нажатию на кнопку, мы будем что-то заносить в наш pdf-файл.

Из теории много писать ничего не будем, а сразу перейдем к программированию, но необходимо еще сперва создать обычный пустой pdf-файл и положить его в корень с программой. Дальше на событие OnClick нашей кнопки мы напишем следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
 Streams:TMemoryStream;
begin
   Streams:=TMemoryStream.create;
   RvNDrWriter1.Stream:=Streams;
   RvNDRWriter1.Execute;
   RvRenderPdf1.PrintRender(Streams,'test.pdf');
   ShellExecute(Handle,nil,'test.pdf','','',SW_SHOW);
   FreeAndNil(Streams);
end;

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

Все теперь, нам необходимо событие, которое возникает при отрисовке данных, в нем мы и будем выводить всю нашу информацию. Выделяем компонент TRvNDRWriter и переходим список событий данного компонента, после чего, находим событие OnPrint и в данной событие пишем следующий код:

procedure TForm1.Print(Sender: TObject);
begin
   bmp:=TBitmap.Create;
   bmp.LoadFromFile('test.bmp');
   with RvNDRWriter1 do
    begin
     SetFont('Arial',16);
     FontColor:=clGreen;
     Print('Test Text');
     PrintHeader('Begin PDF File',pjCenter);
     PrintFooter('End PDF File',pjCenter);
     LineTo(10,10);
     PrintBitmap(1,1,1,1,bmp);
   end;
   FreeAndNil(bmp);
end;

Ну, сперва, мы загружаем картинку *.bmp, естественно переменная bmp, у нас объект класса TBitmap. Загружаем мы для того, чтобы потом ее отрисовать в нашем pdf-документе.

А дальше, я думаю все понятно, процедура PrintHeader - выводит надпись в заголовок документа (страницы), процедура PrintFooter - выводит надпись в конец документа (страницы). Процедура PrintBitmap - выводит изображение в документ, процедура SetFont - устанавливает шрифт документа, процедура FontColor - устанавливает цвет шрифта документа.

Остальные графические функции и процедуры, такие же, что и при выводе графической информации на Canvas других компонентов.

Для создания нового листа в документе используется функции NewPage, все что будет после нее написано на вывод информации, будет выводиться на новом листе документа.

Проследите, чтобы все эти модули: RpRender, RpRenderPDF, RpDefine, RpBase,  RpFiler, RpRave, RpCon были подключены в Ваш проект

В следующей статье, по работе с pdf, мы рассмотрим, как можно открывать pdf-документы, печатать их, перемещаться по документы и многое другое.

Исходник статьи можно скачать тут

Метки: , , ,




К записи “Работа с PDF-документами” оставлено комментариев: 24.

  1. Danil:

    Что-то не работает на моем делфи7. Что сам пытался копипастом свою программу написать, что скачанный пример — оба выдают ошибку:
    EFCreateError, Cannot create file «». Системе не удается найти указанный путь. Process stopped.
    Останавливается на выходе процедуры Print, то есть Execute выполняет и ошибка, либо на PrintRender.

    • Andrey53:

      странно почему-то, так как у меня исходник рабочий и рисует все отлично в pdf-документе

      • Danil:

        Очень странно. Видимо только у меня эта ошибка проявляется? Delphi 7 вроде обычный, недавно поставленный, винда XP Home SP3, Acrobat Reader 9 прекрасно все файлы открывает. Чудесато.

        • Andrey53:

          точно не могу сейчас сказать, у меня Delphi 7, Win7 все прекрасно без ошибок работает, очень странно, да и на Delphi XE без проблем

          • Danil:

            Сейчас на работе попробовал, тут стоит та же версия Delphi 7 и еще Delphi 2007. И тоже ни там, ни там не работает. И все та же ошибка: Project Project1.exe raised exception class EFCreateError with message ‘Cannot create file «». Системе не удается найти указанный путь’.
            Вот такие пироги с котятами..

          • Andrey53:

            очень странно, в ближайшее время посмотрю в чем проблема

  2. Алексей:

    Я запихал в RvNDrWriter фотографии и при размере больше 540 мегабайт вылезла ошибка Out of memory while expanding memory stream. Есть мысли? У меня только ограничение размера Tmemorystream.

  3. Алексей:

    Нет я не его не ограничиваю. Я имею в виду может быть контролировать размер TMemoryStream и при приближении его к «критической массе» записывать pdf файл а после создавать следующий, а может быть есть и более элегантный вариант. Как то так…

  4. Putnik:

    Для Danil.
    Автор просто не посчитал нужным (наверное, как очевидный факт) указать, что
    RvNDrWriter1.StreamMode := smUser;
    (smUser-данные передаются в поток, заданный разработчиком.По умолчанию установлен smMemory.)
    и…,вуаля, все заработало.
    Не следуйте слепо чужим мыслям, ищите причину в себе.
    Автору — респект. Многое можно почерпнуть из блога

    • Danil:

      Посчитал ли он или не посчитал, но его рабочий исходник должен работать, «как очевидный факт». А там стоит smMemory.
      Поменял, запустил, теперь исключения не выдает, но открывает пустой pdf-файл. Так что с вуаля вы поторопились. Проверю завтра еще на рабочей машине для объективности.
      Причины в себе можно долго искать, но быстрее на рабочих примерах и книгах учиться. И кто-то простеньким рабочим исходником должен толчок дать, показать направление движения. Вот когда я стану гуру в делфи, тогда буду в себе уже закрепленные знания искать и писать с нуля свои исходники, не заходя на подобные сайты.
      А пока читаем и учимся.

  5. Алексей:

    Привет! Я все еще слежу за этой веткой. Если есть соображения по моему вопросу пожалуйста не стесняйтесь, пишите…

  6. Григорий:

    Здравствуйте, Андрей!
    Заглянул в Ваш блог на devdelphi.ru, так как написал приложение на Delphi 2009, выводящее в форме содержимое PDF-файлов.
    Для этого я импортировал соответствующий ActiveX-компонент, после чего вставил форму AcroPDFLib_TLB.
    Проблема в том, что приложение работает не на всех машинах.
    Бывает, что после запуска форма разворачивается, но затем выходит сообщение об ошибке в приложении (EOleException)
    Причем это только на машинах Windows XP. Под Windows 7 работает нормально.
    Может, что подскажете?
    С Уважением,
    Григорий

    • Andrey:

      возможно необходима конкретная библиотека, попробуйте положить в папку с проектом dcu файлы данной библиотеки

  7. Sergey:

    Здравствуйте Андрей!
    Наткнулся на статью — очень познавательно.
    Не подскажете когда будет 2 часть?

    • Andrey:

      здравствуйте, могу организовать в ближайшее время, сейчас занят немного другой написанием статей

  8. […] найти интересный материал, который описывает связку pdf delphi , для решения задачи, по открытию и чтению pdf файлов. […]

  9. Alexander:

    Доброго времени суток, Андрей. Меня зовут Александр.
    Вы может сталкивались. Подскажите в каком направлении двигаться.
    Вообщем есть задача воспльзоваться средствами Word Equation 3.0 в Delphi 7. Т.е. программа должна имея в БД какие то исходные значения обрабатывать их, например, расчет теоремы Котельникова и после обработки выводить в файл (*.doc или *.pdf) в понятном/знакомом пользователю виде. Как на уроках математики… :)) … используя знаки интегралов, дробей, степеней и т.д. Если есть решение такой проблемы, подскажите, пожалуйста, по какому курсу плыть и где копать. Заранее благодарен.
    P.S. Блог Ваш понравился, много полезного для себя нашел. Ёмко, кратко и исчерпывающе понятно. Продолжайте в том же духе! Спасибо.

    • Andrey:

      Использовать редактор формул Офиса через делфи, я не знаю как, но можно попробовать использовать модули ExprDraw и ExprMake, которые рисуют формулы в понятном, для пользователя виде

  10. Sabi:

    надо установить RvNDRWriter1.StreamMode := smUser;

  11. Юрий:

    В примере событие OnPrint сделано не для компонента TRvNDRWriter, а для формы (компонент TForm1):
    «procedure TForm1.Print(Sender: TObject);
    begin»
    А надо:
    «procedure TForm1.RvNDRWriter1Print(Sender: TObject);
    begin
    bmp:=TBitmap.Create;
    bmp.LoadFromFile(‘test.bmp’);
    with RvNDRWriter1 do
    begin
    SetFont(‘Arial’,16);
    FontColo…»

  12. Алексей:

    Добрый день … не пдскажете как в Delphi7 создать pdf файл с картинками и текстами

  13. Радик:

    Доброго времени суток!
    Кто-нибудь смог разобраться как можно внести изменения в уже имеющийся файл, а не создать новый? Подскажите пожалуйста в какую сторону рыть, а то никак не получается.

  14. руки из жопы:

    ничего не работало

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*