Часть полного текста документа:Очерк по поводу создания PDF-файлов Максим Фокин, "Королевство Delphi" В последнее время на просторах интернета обнаружилось очень много PDF converter'ов, reader'ов и write'ов. И подавляющее большинство из них предлагается за деньги. Сама программа от 10$ до 300$. А уж исходный код за гораздо большие деньги цена начинается от 200$ а в одном месте (заинтересовавшись этим полазил по инету) аж за 900 евро. Данная проблемма меня заинтересовала в плане программирования и вот результаты довожу до вашего сведения. (Данные результаты получены мною при изучении внутренностей PDF файла, когда открываешь его в total commander через F3) Обычный PDF файл состоит из четырех частей := Что такое такое ? Это обычное упоминание о версии PDF specification. Которое присутствует в первой строке PDF файла. Например "%PDF-1.3" В седьмой версии акробата которая вышла где то в начале лета этого года, этот номер "%PDF-1.7", но это не версия продукта, это версия именно спецификации. Второй строкой PDF идет небольшая аброкадабра (видимо предназначена для дальнейшего использования) " %вгПУ" Все с первой частью PDF разобрались. Что из себя представляет вторая часть которая называется ? Ответ очень простой: это последовательность объектов, описание которых как и хедера представлены в текстовом виде. Каждый объект это текстовой фрагмент с порядковым номером в имени например "4 0 obj" 4 это порядковый номер объекта 0 это номер (ре)генерации файла то есть когда файл обновляется (редактируется ) то данный номер увеличивается obj это кодовое слово означающее что в теле документа нам встретился объект Все объекты делятся на косвенные и прямые. Все косвенные, и их большинство, после слова obj имеют в своем теле делиметер "" и кодовое слово endobj Прямые объекты не должны иметь в своем теле открывающих и закрывающих делиметеров "" Все косвенные объекты доступны через cross-reference table. В ней представлены ссылки в виде смещения от начала файла до начала объекта (Данные (строки) в объекте разделяются #13#10 либо #13) Тип "самого главного" объекта в теле PDF файла носит гордое имя "/Catalog" 4 0 obj > endobj На самом деле в теле минимального PDF файла типа "Hello world" должно быть 3 "главных" объекта. Давайте я их перечислю по типам: "/Catalog" содержит в себе ссылку : на дерево страниц (/Pages) "/Pages" содержит в себе ссылку на группу страниц документа (Например 2 0 obj > endobj ) "/Page" содержит в себе ссылку на объекты относящиеся к конкретной странице. (Например 3 0 obj /Rotate 0 >> ) И несколько "второстепенных" Разберем объект страница: /Rotate поле показывающее на сколько градусов изображение страницы должно быть повернуто при отображение в программе /MediaBox и /CropBox поля описывающие размер страницы /Parent ссылка на родительский объект "/Pages" /Resources это поле описывает какой фонт должен быть использован при отображении страницы (фонт это отдельный объект) и установку ProcSet эта установка показывает какое содержимое потока данных данной страницы (тоже может быть определен как объект, а не как поле) /Contents Самое интересное поле в объекте "страница", дает ссылку на объект содержимого данной страницы, причем : если это поле отсутствует в объекте "страница" значит страница пустая Содержимое страницы: Объект "stream" 4 0 obj > stream BT /F12 9 Tf 10 782 TD 0 -12.5 TD ( Max Fokin) Tj 0 -12.5 TD ( mnb) Tj 0 -12.5 TD () Tj 0 -12.5 TD (Max Privet) Tj 0 -12.5 TD ( 1) Tj 0 -12.5 TD (1) Tj 0 -12.5 TD (2) Tj 0 -12.5 TD (3) Tj 0 -12.5 TD (45) Tj ET endstream endobj /Length 305 - это поле показыввающее сколько байт от слова stream до слова endstream Самый простой вариант - это некодированный и несжатый поток данных в объекте stream. ............ |