В этой статье, рассмотрим, как создавать свои 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, все что будет после нее написано на вывод информации, будет выводиться на новом листе документа.
В следующей статье, по работе с pdf, мы рассмотрим, как можно открывать pdf-документы, печатать их, перемещаться по документы и многое другое.
Исходник статьи можно скачать тут
Метки: pdf, Rave, TRvNDRWriter, TRvRenderPdf
Что-то не работает на моем делфи7. Что сам пытался копипастом свою программу написать, что скачанный пример — оба выдают ошибку:
EFCreateError, Cannot create file «». Системе не удается найти указанный путь. Process stopped.
Останавливается на выходе процедуры Print, то есть Execute выполняет и ошибка, либо на PrintRender.
странно почему-то, так как у меня исходник рабочий и рисует все отлично в pdf-документе
Очень странно. Видимо только у меня эта ошибка проявляется? Delphi 7 вроде обычный, недавно поставленный, винда XP Home SP3, Acrobat Reader 9 прекрасно все файлы открывает. Чудесато.
точно не могу сейчас сказать, у меня Delphi 7, Win7 все прекрасно без ошибок работает, очень странно, да и на Delphi XE без проблем
Сейчас на работе попробовал, тут стоит та же версия Delphi 7 и еще Delphi 2007. И тоже ни там, ни там не работает. И все та же ошибка: Project Project1.exe raised exception class EFCreateError with message ‘Cannot create file «». Системе не удается найти указанный путь’.
Вот такие пироги с котятами..
очень странно, в ближайшее время посмотрю в чем проблема
Я запихал в RvNDrWriter фотографии и при размере больше 540 мегабайт вылезла ошибка Out of memory while expanding memory stream. Есть мысли? У меня только ограничение размера Tmemorystream.
Каким образом и на сколько Вы ограничиваете TMemoryStream?
Нет я не его не ограничиваю. Я имею в виду может быть контролировать размер TMemoryStream и при приближении его к «критической массе» записывать pdf файл а после создавать следующий, а может быть есть и более элегантный вариант. Как то так…
Для Danil.
Автор просто не посчитал нужным (наверное, как очевидный факт) указать, что
RvNDrWriter1.StreamMode := smUser;
(smUser-данные передаются в поток, заданный разработчиком.По умолчанию установлен smMemory.)
и…,вуаля, все заработало.
Не следуйте слепо чужим мыслям, ищите причину в себе.
Автору — респект. Многое можно почерпнуть из блога
Посчитал ли он или не посчитал, но его рабочий исходник должен работать, «как очевидный факт». А там стоит smMemory.
Поменял, запустил, теперь исключения не выдает, но открывает пустой pdf-файл. Так что с вуаля вы поторопились. Проверю завтра еще на рабочей машине для объективности.
Причины в себе можно долго искать, но быстрее на рабочих примерах и книгах учиться. И кто-то простеньким рабочим исходником должен толчок дать, показать направление движения. Вот когда я стану гуру в делфи, тогда буду в себе уже закрепленные знания искать и писать с нуля свои исходники, не заходя на подобные сайты.
А пока читаем и учимся.
Привет! Я все еще слежу за этой веткой. Если есть соображения по моему вопросу пожалуйста не стесняйтесь, пишите…
Здравствуйте, Андрей!
Заглянул в Ваш блог на zaokomtek.ru, так как написал приложение на Delphi 2009, выводящее в форме содержимое PDF-файлов.
Для этого я импортировал соответствующий ActiveX-компонент, после чего вставил форму AcroPDFLib_TLB.
Проблема в том, что приложение работает не на всех машинах.
Бывает, что после запуска форма разворачивается, но затем выходит сообщение об ошибке в приложении (EOleException)
Причем это только на машинах Windows XP. Под Windows 7 работает нормально.
Может, что подскажете?
С Уважением,
Григорий
возможно необходима конкретная библиотека, попробуйте положить в папку с проектом dcu файлы данной библиотеки
Здравствуйте Андрей!
Наткнулся на статью — очень познавательно.
Не подскажете когда будет 2 часть?
здравствуйте, могу организовать в ближайшее время, сейчас занят немного другой написанием статей
[…] найти интересный материал, который описывает связку pdf delphi , для решения задачи, по открытию и чтению pdf файлов. […]
Доброго времени суток, Андрей. Меня зовут Александр.
Вы может сталкивались. Подскажите в каком направлении двигаться.
Вообщем есть задача воспльзоваться средствами Word Equation 3.0 в Delphi 7. Т.е. программа должна имея в БД какие то исходные значения обрабатывать их, например, расчет теоремы Котельникова и после обработки выводить в файл (*.doc или *.pdf) в понятном/знакомом пользователю виде. Как на уроках математики… :)) … используя знаки интегралов, дробей, степеней и т.д. Если есть решение такой проблемы, подскажите, пожалуйста, по какому курсу плыть и где копать. Заранее благодарен.
P.S. Блог Ваш понравился, много полезного для себя нашел. Ёмко, кратко и исчерпывающе понятно. Продолжайте в том же духе! Спасибо.
Использовать редактор формул Офиса через делфи, я не знаю как, но можно попробовать использовать модули ExprDraw и ExprMake, которые рисуют формулы в понятном, для пользователя виде
надо установить RvNDRWriter1.StreamMode := smUser;
В примере событие 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…»
Добрый день … не пдскажете как в Delphi7 создать pdf файл с картинками и текстами
Доброго времени суток!
Кто-нибудь смог разобраться как можно внести изменения в уже имеющийся файл, а не создать новый? Подскажите пожалуйста в какую сторону рыть, а то никак не получается.