Довольно часто надо получить 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 любой сколь угодно сложный отчёт! Давайте попробуем!
Добавляем с вкладки "FastReport" на форму компоненты TfrxReport, TfrxPDFExport и TButton.
Делаем двойной клик на TfrxReport, входим в FR Designer. Создаём новый отчёт (File - > New report). Добавляем TfrxMemoView c текстом "Test text" на MasterData1
Устанавливаем 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- конвертер!
Можем выбрать, какие страницы нашего документа отправить в PDF, какую версию PDF использовать, сжатие уменьшит размер результирующего файла, встраивание шрифтов позволяет сохранять внешний вид документа на любом стороннем устройстве. Пойдёт ли в PDF-документ подложка. PDF можно оптимизировать для печати (качество изображений будет лучше, но и размер больше) или же только для экранного представления), будет ли результирующий PDF содержать выносное оглавление, как в исходном отчёте (в моём примере его нет, потому и выбрать его тоже нет возможности), прозрачность, степень сжатия растровых картинок.
Кстати, одна из важных особенностей FastReport VCL 6.6 - векторные изображения попадут в PDF-файл в векторном виде, то есть без потерь - особенно заметно это будет на 2D-штрих-кодах и картах. Ещё одна особенность - все тексты, в том числе RTF, будут при сохранении в PDF векторизованы, т.е. качество не потеряется, при этом сохранится возможность скопировать участок текста из PDF (если вы не запретите копирование соответствующей опцией, про которую скажу ниже).
Куда именно мы отправим наш 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 тоже имеет несколько версий (и вы можете выбрать, в какую сохранять)
Служебная информация, которая также пойдёт в PDF-файл: Название, автор, тема, ключевые слова (вы можете выкладывать PDF в веб, они отлично индексируются), средство создания PDF, производитель документа.
Безопасность - защита паролем документа от открытия (используется RC4). Возможность установить запрет на печать документа, изменение документа, копирование текста или графики, добавление или изменение текстовых заметок.
Настройка просмотрщика PDF в момент открытия документа: Скрыть панель инструментов, скрыть меню, скрыть окно пользовательского интерфейса, распахнуть окно просмотра, центрировать окно, растянуть под размер печати. Обычно при экспорте я использую параметры, выставленные разработчиками по умолчанию, но в этот раз пробежался по всем параметрам. Итак, если нам или нашим пользователям не нужно всё это богатство визуальное, то можно сразу
сохраняем в 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/