0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как прочитать многостраничные документы pdf в делфи. Очерк по поводу создания PDF-файлов

Как прочитать многостраничные документы pdf в делфи. Очерк по поводу создания PDF-файлов

Ответ очень простой: это последовательность объектов, описание которых как и хедера представлены в текстовом виде.

Каждый объект это текстовой фрагмент с порядковым номером в имени например «4 0 obj»

  • 4 это порядковый номер объекта
  • это номер (ре)генерации файла то есть когда файл обновляется (редактируется ) то данный номер увеличивается
  • obj это кодовое слово означающее что в теле документа нам встретился объект

Все объекты делятся на косвенные и прямые. Все косвенные, и их большинство, после слова obj имеют в своем теле делиметер » >» и кодовое слово endobj

Прямые объекты не должны иметь в своем теле открывающих и закрывающих делиметеров » >» Все косвенные объекты доступны через cross-reference table. В ней представлены ссылки в виде смещения от начала файла до начала объекта (Данные (строки) в объекте разделяются #13#10 либо #13)

Тип «самого главного» объекта в теле PDF файла носит гордое имя «/Catalog»

На самом деле в теле минимального PDF файла типа «Hello world» должно быть 3 «главных» объекта. Давайте я их перечислю по типам:

  • «/Catalog» содержит в себе ссылку : на дерево страниц (/Pages)
  • «/Pages» содержит в себе ссылку на группу страниц документа
  • «/Page» содержит в себе ссылку на объекты относящиеся к конкретной странице.

И несколько «второстепенных»

Разберем объект страница:

  • /Rotate поле показывающее на сколько градусов изображение страницы должно быть повернуто при отображение в программе
  • /MediaBox и /CropBox поля описывающие размер страницы
  • /Parent ссылка на родительский объект «/Pages»
  • /Resources это поле описывает какой фонт должен быть использован при отображении страницы (фонт это отдельный объект) и установку ProcSet эта установка показывает какое содержимое потока данных данной страницы (тоже может быть определен как объект, а не как поле)
  • /Contents Самое интересное поле в объекте «страница», дает ссылку на объект содержимого данной страницы, причем : если это поле отсутствует в объекте «страница» значит страница пустая

Содержимое страницы:
Объект «stream» /Length 305 это поле показыввающее сколько байт от слова stream до слова endstream

Самый простой вариант — это некодированный и несжатый поток данных в объекте stream. Он ограничивается операторами BT и ET

/F12 9 Tf

  • /F12 это кодовое имя объекта который характеризует фонт используемый на данной странице
  • 9 это размер фонта
  • Tf это оператор который характеризует что данная строка в объекте steam есть установка фонта и размера

10 782 TD это цифры откуда начинается данная строка (отсчет производиться от левого верхнего угла) Tj это оператор перевода на новую строку Ну а в круглых скобках наш текст

Кодированный поток я сдесь не объясняю. Он основан на алгоритмах RC4, RC5, MD5.

Что такое объект Font

  • /Type /Font Естественно название типа
  • /Subtype /Type1 название подтипа
  • /Name /F7 F7 это кодовое имя

PDF поддерживает несколько видов фонтов. Они перечисленны ниже

  • Type 1, including subsets and Multiple Master «snapshots»
  • Type 3
  • TrueType, including subsets
  • Type 0

Честно говоря, я не разбирался с Type 3, TrueType, including subsets, Type 0 ничего по ним сказать не могу
А Type 1 — это следующие фонты

Это объект с названиями кодовых имен для фонтов первого типа. По этому кодовому имени можно легко получить сам объект фонт.

ВСЕ: то есть минимальное Состоит из следующих объектов: «catalog» , «pages», «page», «Resources» (опиционально может присутствовать, как поле в объекте страница), нетипизированный объект «stream», группа объектов «font»

Что такое ? На самом деле это обычная текстовая таблица, она начинается со слова xref и своем теле имеет ссылки на все косвенные объекты в документе. Вот пример 0 27 Эти цифры обозначают следующее :

  • 0 — первый object number в таблице
  • 27 — количество элементов таблицы

Первый элемент таблицы всегда иммет вид «XXXXXXXXXX 65535 f» где X это цифра, а 65535 это значение по умолчанию для первого элемента в таблице. Символ «f» обозначает «free«, то есть объект не используется

Ссылки на объекты, которые используются, в конце имеют символ «n«

Разберем элемент данной таблицы.

  • Первые 10 цифр — это смещение от начала файла до начала объекта.
  • 0000000016 означает что через 16 байт от начала файла Вас встретит первое упоминание об объекте то есть, например, 4 0 obj

Вторые пять цифр — это номер генерации файла. Если файл только что создан, то они всегда нули. Если файл модифицируется, то это число увеличивается на единицу. То есть, 0000000024 00001 f

Канонический, только что созданный PDF файл, имеет только одну таблицу. Но, если файл редактируется, то таких таблиц может быть очень много.

Взаимосвязь таблиц осуществляется при помощи последнего элемента

Канонический, только что созданный PDF файл, имеет только одну таблицу, после таблицы идет элемент trailer А после трайлера идет кодовое слово startxref, указывающее на смещение от начала файла до начала таблицы, вот пример. Это значит, что через 173 байта от начала документа, будет присутствовать кодовое слово xref. Но, если файл был отредактирован, то последний в файле трайлер будет иметь вид: Но, если мы обратимся к таблице, куда указывает ссылка startxref 173, то мы найдем следующую таблицу, а за ней трайлер, который будет иметь поле /Prev 3896

Данное поле /Prev 3896 указывает нам на предыдущую таблицу, а ссылка startxref 567 указывает на следующую таблицу и так практически до бесконечности, пока в очередном поле startxref мы не увидим . Это значит, мы прочитали все таблицы.

В данном очерке, конечно, не хватает исходного кода. Вот и он: представлены два модуля основной «PDFDocument» и вспомогательный «PDFBaseFonts«

Обсуждение материала [ 31-07-2006 06:33 ] 7 сообщений

Как работать с PDF-документами (книгами) на Delphi

Хочу поделиться с вами примером, как создавать pdf-файлы в программе Delphi.

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

Предлагаю немного остановиться на этих компонентах и понять для чего они служат. Кстати о них я вычил информацию из пару книг которые приобрел progbook.ru. Поэтому если хотите приобрести достойные книги по Delphi, то милости прошу в данный магазин.

Итак, первым у нас идет компонент TRvNDRWriter. Этот компонент необходим нам для записи в pdf-файл информации, не важно какой, текстовой или графической, через поток.

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

Но не будем сильно разглагольствовать, а перейдем сразу к интересующей нас теме, а именно к программированию 🙂

Для начала нам необходимо создать обычный пустой pdf-файл и разместить его в корневой папке нашей программы.

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

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

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

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

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

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

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

Дополнительная информация по теме

Как правильно и грамотно работать с сессиями в PHP — подробное описание с примером

Несколько способов монетизации собственного ресурса, анализ способов заработка существующих интернет-гигантов

Что такое производительность труда, уровень ее показателей для развитых и развивающихся стран, влияние производительности труда на заработок человека

Описание нескольких методов, как можно узнать тариф у мобильного оператора «Мегафон»

Обзор: 5 решений для создания и работы с PDF в Delphi.

Пообещал я на днях одному многоуважаемому человеку, что на выходных гляну исходник клиента для DelphiFeeds.ru в плане сборки этого приложения под iOS в Delphi XE4. Собственно, глянуть-то я его глянул, но толкового решения в плане безболезненного переноса по iOS так и не нашел (и переделывание интерфейса оказалась не такой уж и большой проблемой в сравнении с другими). Вообще, перенос проектов FireMonkey с Delphi XE3 на Delphi XE4 -заслуживает отдельного поста, но, в целях соблюдения политкорректности, я оставляю эту тему кому-нибудь другому. Зато обнаружил, что сервис по созданию PDF-файлов из HTML-страниц успешно “загнулся” и теперь в клиенте создаются только mht-файлы. Это обстоятельство и привело к написанию этого небольшого обзора компонентов и решений для создания PDF-файлов в Delphi.

Помня некоторые из замечаний по поводу обзора “23 решения для локализации и интернационализации приложений“, сразу оговорюсь:

  1. Вся информация относительно цены, лицензии, поддерживаемых версий Delphi берётся исключительно с официальных сайтов разработчиков на момент написания этого обзора. Дата обзора 10 июня 2013 года .
  2. Если Вы сейчас читаете этот пост и точно знаете, что какой-либо компонент из обзора прекрасно поддерживает работу в XE6/7/8 и т.д., а в обзоре сказано только про XE3, то сегодня точно не 2013 год и, следовательно, см. п.1.
  3. Работа всех компонентов проверялась на Delphi XE3 и только на Delphi XE3

1. Synopse PDF Engine

  • Стоимость: Free
  • Лицензия: MPL/GPL/LGPL tri-license.
  • Поддерживаемые версии Delphi: 5-XE3
  • Страница загрузки: http://synopse.info/fossil/wiki?name=PDF+Engine

Возможности, заявленные разработчиками:

  1. Чистый Delphi-код без использования сторонних DLL
  2. Маленький размер, создаваемых pdf-файлов
  3. Быстрая генерация pdf с минимальным использованием памяти
  4. Доступ к TCanvas для рисования линий, кривых, текста и т.д.
  5. Поддержка Unicode
  6. Создание PDF/A-1 файлов.

При работе с Synopse PDF Engine ничего устанавливать не требуется – достаточно указать в проекте путь к модулям Synopse и подключить модуль synpdf.pas в uses.

В результате выполнения этого кода у меня получился PDF-документ вот с таким содержимым:

Как видно на рисунке, при вводе в PDF юникодного текста возможно появление каких-то непонятных символов.

Что касается печати PDF из HTML-страниц, то, судя по описанию возможностей Synopse PDF Engine на официальном сайте, сделать это возможно, но с использованием других компонентов из набора Synopse. Поэтому я отложил Synopse PDF Engine в сторонку (может потом пригодиться) и начал искать другие решения.

2. PowerPDF

  • Стоимость: Free
  • Лицензия: Mozilla Public License 1.1 (MPL 1.1).
  • Поддерживаемые версии Delphi: 2007-XE3
  • Страница загрузки: http://sourceforge.net/projects/powerpdf/

PowerPDF представляет собой набор визуальных компонентов для создания PDF-документов. В набор входит несколько компонентов, таких как TPDFImage, TPDFText, TPDFAnnotation и т.д. После установки компонентов на палитре появится закладка PowerPDF с которой нам и предстоит в дальнейшем работать.

В zip-архиве с библиотекой PowerPDF Вы также найдете массу различных примеров использования PowerPDF, в т.ч. создания PDF-файлов с картинками, различные способы работы с текстом, шрифтами, выгрузка данных из БД и т.д.

В целом PowerPDF выглядит довольно презентабельно и серьезно, но для решения моей задачи мало подходит, т.к. мне необходим именно невизуальный компонент для создания PDF из web-странички. Если же Вам нужны бесплатные компоненты для создания отчетов в PDF-формате, то посмотрите PowerPDF – вполне возможно, что эти компоненты Вам подойдут.

Пример PDF-документа, созданного с помощью PowerPDF

3. HotPDF

Стоимость: от 110 до 300$
Поддерживаемые версии Delphi: 7-XE4
Страница загрузки trial-версии: http://www.loslab.com/HotPDF.html

Возможности компонента, заявленные разработчиками:

  • Поддержка векторной и растровой графики в PDF-документах
  • Защита PDF-документов паролем
  • Поддержки AcroForms/PDF-форм
  • Водяные знаки
  • Генерация PDF документов с внутренними и внешними ссылками, веб-ссылками и закладками
  • Полная поддержка Unicode
  • Поддержка различных шрифтов, форматирование текста, расположение текста в несколько столбцов
  • Поддержка TCanvas
  • Встроенный архиватор для сжатия текстовой и графической информации в документе
  • Преобразование TIFF в PDF

В качестве примера, я решил собрать демонстрационное приложение, идущее в комплекте вместе с компонентом THotPDF. Приложение довольно простенькое – генерирует PDF-ку с двумя ссылками и простым текстом. Код тоже простой и понятный:

Даже не вдаваясь в тонкости работы компонента можно понять, что и как происходит в этом демонстрационном примере. Запускаем, смотрим на внешний вид сгенерированного документа:

Документ, созданные с помощью THotPDF

Вот эти два синих прямоугольника в документе – ссылки на две страниц…а простого текста “Click the link to navigate” вообще не наблюдается нигде. Хотя, надо отдать должное, при клике по прямоугольнику ссылка действительно открывается. В общем, то ли разработчики поторопились заявить поддержку Delphi вплоть до XE3, то ли это так интересно работает trial-версия, но после запуска этого демонстрационного примера у меня как-то отпало желание использовать THotPDF даже за бесплатно. Двигаемся далее.

4. PDF Creator Pilot

Стоимость: от 450$ без исходников до 9950$ (. ) с исходниками
Поддерживаемые версии Delphi: 5-XE4
Страница загрузки trial-версии: http://www.colorpilot.com/pdflibrary.html#download

Библиотека стоимостью почти как Delphi XE3 Professional…Ну да ладно, посмотрим, что представляет из себя эта библиотечка.

Возможности, заявленные разработчиками:

  • Расширенный набор методов и свойств для легкого создания PDF;
  • Чтение и слияние существующих PDF-документов;
  • Добавление и удаление страниц PDF-документа;
  • Поддержка юникода;
  • Создание водяных знаков для каждой страницы;
  • Добавление эскизов для PDF-документа;
  • Использование и встраивание шрифтов (TrueType, OpenType, Type1 и т.д.);
  • Создание интерактивных PDF-документов, используя JavaScript и гиперссылки;
  • Поддержка интерактивных элементов AcroForm: текстовые поля ввода, кнопки, радио-кнопки, выпадающие списки, флажки;
  • шифрование и защита паролем созданных PDF-документов;
  • Создания и управление содержанием документа;
  • Доступ к HDC для рисования на PDF-страницах с помощью WinAPI функций.
  • Использование изображений в различных форматах (JPEG, TIFF, PNG, BMP, GIF);
  • Создание и использование аннотаций;
  • Создание PDF-документов на диске или в памяти;
  • Извлечения текста из PDF документов;

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

После установки запускаем Delphi (в моем случае – это Delphi XE3) и переходим в меню:

Component – Import Component – Import Type Library

В списке ищем библиотеку PDFCreatorPilot:

Импортируем, создаем новый проект и подключаем в uses модуль PDFCreatorPilotLib_TLB.

Теперь можем протестировать работу библиотеки на каком-нибудь живом примере. Вначале попробуем сгенерировать документ с простым текстом:

Читать еще:  Сони иксперия ха 1. Обзор Sony Xperia XA1 — среднее между нормально и плохо
Ссылка на основную публикацию
Статьи c упоминанием слов:

Adblock
detector