Как создать PDF из Delphi / C++Builder / Lazarus

14.05.2020

Довольно часто надо получить PDF-документ из приложения на Pascal - будь то Delphi или Lazarus.
Обычно рекомендуют использовать специализированные решения, конвертор в PDF (itext, Synopse PDF Engine, PowerPDF, HotPDF, PDF Creator Pilot, PDFtoolkit VCL, Debenu Quick PDF Library и так далее). Мы не будем в данной статье рассматривать их преимущества и недостатки.
Внезапно для нас оказалось, что, несмотря на отсутствие словосочетания PDF в названии продукта, возможности FastReport VCL для вывода в PDF в Delphi покрывают множество нужд программистов! И многие наши клиенты пользуются ТОЛЬКО возможностями FastReport для получения PDF!
Итак, прежде всего - вы можете отправить в PDF любой сколь угодно сложный отчёт! Давайте попробуем!

Создаём новое VCL приложение в Delphi

Добавляем с вкладки "FastReport" на форму компоненты TfrxReport, TfrxPDFExport и TButton.


приложение Delphi / Lazarus для сохранения PDF

Делаем двойной клик на TfrxReport, входим в FR Designer. Создаём новый отчёт (File - > New report). Добавляем TfrxMemoView c текстом "Test text" на MasterData1


Визуальный дизайнер документа PDF в Delphi / Lazarus


Устанавливаем MasterData1.RowCount = 200 (Чтобы повторить строку 200 раз и сформировать отчёт на 3-4 страницы, поскольку наш пример не использует датасет), выходим из дизайнера и прописываем и прописываем обработчик OnClick для Button1:

1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
begin
 {Формируем отчёт. Перед экспортом отчёт необходимо обязательно сформировать}
 if frxReport1.PrepareReport then
 frxReport1.ShowPreparedReport; 
 {и показываем окно предварительного просмотра}
end;

В принципе, этого кода нам уже достаточно для полноценной работы, формирования отчёта и экспорта в PDF. Теперь в "design time" делаете документ любой сложности (можете подключить любые источники данных и взять информацию оттуда) - таблицы, списки, иллюстрации, карты, QR-коды - для этого просто не забываем в проект предварительно добавить соответствующие компоненты (а иначе их в "run time" просто не будет), композитные и многостраничные документы, с якорями, встроенными ссылками и оглавлением - да пожалуйста! И любого размера - одностраничную квитанцию, стостраничный каталог, годовой отчёт о передвижениях персонала всех работников завода на тысячи страниц.
Да, не забываем положить компонент экспорта PDF в наш проект! Запускаем и нажимаем на единственную кнопку на форме. Видим окно предварительного просмотра и кнопку экспорта в PDF

Панель сохранения в PDF

Вперёд - сохраняем из нашего Delphi-приложения в PDF!

Нажимаем кнопку - вызываем экспорт из предпросмотра (ниже я расскажу, как всё это сделать из кода. можете сразу перейти по ссылке - отправить PDF из кода Delphi). Сразу видим диалог настроек результирующего PDF. И такому набору опций позавидует любой профессиональный PDF- конвертер!

Настройки сохранения в PDF

Можем выбрать, какие страницы нашего документа отправить в PDF, какую версию PDF использовать, сжатие уменьшит размер результирующего файла, встраивание шрифтов позволяет сохранять внешний вид документа на любом стороннем устройстве. Пойдёт ли в PDF-документ подложка. PDF можно оптимизировать для печати (качество изображений будет лучше, но и размер больше) или же только для экранного представления), будет ли результирующий PDF содержать выносное оглавление, как в исходном отчёте (в моём примере его нет, потому и выбрать его тоже нет возможности), прозрачность, степень сжатия растровых картинок.
Кстати, одна из важных особенностей FastReport VCL 6.6 - векторные изображения попадут в PDF-файл в векторном виде, то есть без потерь - особенно заметно это будет на 2D-штрих-кодах и картах. Ещё одна особенность - все тексты, в том числе RTF, будут при сохранении в PDF векторизованы, т.е. качество не потеряется, при этом сохранится возможность скопировать участок текста из PDF (если вы не запретите копирование соответствующей опцией, про которую скажу ниже).

Выбор стандарта PDF/A-1a, PDF/A-1b, PDF/A-2b, PDF/A-2a, PDF/A-3a, PDF/A-3b

Куда именно мы отправим наш PDF (локальный файл или электронная почта, или облака). Открыть после экспорта - результирующий файл будет открыт сразу же после экспорта программой просмотра PDF файлов, назначенной в операционной системе по умолчанию (например, Adobe Acrobat Reader).
Вы можете отправить сформированный документ в архивные форматы PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b - они специально разработаны для хранения документов в электронном неизменном виде. Например, шрифты, изображения, сторонние объекты, присутствующие в документе, в этом стандарте встраиваются в документ автоматически. Достаточно часто в крупных организациях принят какой-то из этих стандартов для электронного документооборота. Кстати, вот тут есть чуть подробнее о разнице PDF и PDF/A

Выбор версии PDF 1.4, PDF 1.5, PDF 1.6, PDF 1.7

Да и "не архивный" PDF тоже имеет несколько версий (и вы можете выбрать, в какую сохранять)

Настройка служебной информации PDF-документа

Служебная информация, которая также пойдёт в PDF-файл: Название, автор, тема, ключевые слова (вы можете выкладывать PDF в веб, они отлично индексируются), средство создания PDF, производитель документа.

Настройка защиты PDF

Безопасность - защита паролем документа от открытия (используется RC4). Возможность установить запрет на печать документа, изменение документа, копирование текста или графики, добавление или изменение текстовых заметок.

настройки сохраняемого из Delphi PDF при открытии

Настройка просмотрщика PDF в момент открытия документа: Скрыть панель инструментов, скрыть меню, скрыть окно пользовательского интерфейса, распахнуть окно просмотра, центрировать окно, растянуть под размер печати. Обычно при экспорте я использую параметры, выставленные разработчиками по умолчанию, но в этот раз пробежался по всем параметрам. Итак, если нам или нашим пользователям не нужно всё это богатство визуальное, то можно сразу

отправить в PDF из кода Delphi или Lazarus

сохраняем в PDF из кода Delphi с настройкой параметров PDF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
procedure TForm1.Button1Click(Sender: TObject);
begin
 {Формируем отчёт. Перед экспортом отчёт необходимо обязательно сформировать}
 frxReport1.PrepareReport();
 {Устанавливаем диапазон экспортируемых страниц. По умолчанию экспортируются 
 все страницы сформированного отчёта}
 frxPDFExport1.PageNumbers := '2-3';
 {Устанавливаем стандарт PDF
 TPDFStandard = (psNone, psPDFA_1a, psPDFA_1b, psPDFA_2a, psPDFA_2b, psPDFA_3a, psPDFA_3b);
 Требуется добавление модуля frxExportPDFHelpers в список uses:
 uses frxExportPDFHelpers;}
 frxPDFExport1.PDFStandard := psNone;
 {Для PDFStandard = psNone можно установить версию PDF стандарта
 TPDFVersion = (pv14, pv15, pv16, pv17);
 Требуется добавление модуля frxExportPDFHelpers в список uses:
 uses frxExportPDFHelpers;}
 frxPDFExport1.PDFVersion := pv17;
 {Для меньшего размера файла можно установить сжатие}
 frxPDFExport1.Compressed := True;
 {Устанавливаем, нужно ли встраивать шрифты в результирующий документ.
 Встраивание шрифтов значительно увеличивает размер результирующего документа}
 frxPDFExport1.EmbeddedFonts := False;
 {Устанавливаем, нужно ли экспортировать фоновую картинку страницы}
 frxPDFExport1.Background := True;
 {Отключаем экспорт объектов с оптимизацией для печати. С включённой опцией
 изображения будут качественными, но будут больше в 9 раз по объёму}
 frxPDFExport1.PrintOptimized := False;
 {Устанавливаем, будет ли результирующий PDF содержать выносное оглавление, как в исходном отчёте}
 frxPDFExport1.Outline := False;
 {Нужно ли экспортировать изображения с прозрачностью}
 frxPDFExport1.Transparency := True;
 {Можно установить требуемое DPI для изображений. Включение этой опции отключает
 опцию SaveOriginalImages, которая позволяет сохранять изображения в исходном виде}
 frxPDFExport1.PictureDPI := 150;
 {Устанавливаем степень сжатия растровых картинок}
 frxPDFExport1.Quality := 95;
 {Устанавливаем, нужно ли открывать результирующий файл после экспорта}
 frxPDFExport1.OpenAfterExport := False;
 {Устанавливаем, нужно ли отображать прогресс экспорта
 (показывать, какая страница в данный момент экспортируется)}
 frxPDFExport1.ShowProgress := False;
 {Устанавливаем, нужно ли отображать окно диалога с настройками фильтра экспорта}
 frxPDFExport1.ShowDialog := False;
 {Устанавливаем имя результирующего файла. Обратите внимание на то, что если не
 установить имя файла и отключить показ диалогового окна фильтра экспорта, то
 всё равно будет отображён диалог выбора имени файла}
 frxPDFExport1.FileName := 'C:\Output\test.pdf';
 {Заполняем соответствующие поля вкладки Information}
 frxPDFExport1.Title := 'Your Title';
 frxPDFExport1.Author := 'Your Name';
 frxPDFExport1.Subject := 'Your Subject';
 frxPDFExport1.Keywords := 'Your Keywords';
 frxPDFExport1.Creator := 'Creator Name';
 frxPDFExport1.Producer := 'Producer Name';
 {Заполняем соответствующие поля вкладки Security}
 frxPDFExport1.UserPassword := 'User Password';
 frxPDFExport1.OwnerPassword := 'Owner Password';
 frxPDFExport1.ProtectionFlags := [ePrint, eModify, eCopy, eAnnot];
 {Устанавливаем настройки просмотровщика (вкладка Viewer)}
 frxPDFExport1.HideToolbar := False;
 frxPDFExport1.HideMenubar := False;
 frxPDFExport1.HideWindowUI := False;
 frxPDFExport1.FitWindow := False;
 frxPDFExport1.CenterWindow := False;
 frxPDFExport1.PrintScaling := False;
 {Экспортируем отчёт}
 frxReport1.Export(frxPDFExport1);
end;

Пожалуйста - пользуйтесь! Тут рассмотрены функции и возможности по записи из Lazarus и Delphi в PDF FastReport VCL версии 6.6. Стоимость лицензии сопоставима (а зачастую меньше) с месячной зарплатой программиста, в то время, как только возможностей по настройке и сохранению в разные версии PDF тут - на минимум человеко-месяцы разработчика с высокой квалификацией и знанием тонкостей разных диалектов PDF. Кстати, можете даже для развлечения попробовать качество перевода в PDF на наших демо-отчётах или каких-то своих. Мы постоянно проверяем и тестируем их на соответствие стандартам PDF (есть специальные валидаторы, но, кстати, не всегда прохождение PDF-валидаторов гарантирует полное соответствие того, что вы видите, тому, что будет напечатано - про это у нас есть отдельные истории). К примеру, вы знаете, какими красивыми будут иллюстрации в вашем PDF? Вот тут подробнее: https://www.fastreport.ru/ru/blog/200/show/

20 ноября 2024

Локализация и смена языков в FastReport VCL

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

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.