Функции PDF. Функции PDF Создаем строки с данными


На работе появилась нужность сгенерировать pdf отчет с помощью php!
Вчера намучавшись с этим делом и наконец-то разобравшись, режил выложить все мысли по этому поводу, дабы чтобы хранилось и потом не забылось, да и может кому полезно будет!

И так!
Генерация подобного возможна с помощью двух пакетов:
1. File_PHP - пакет PEAR
2. FPDF - нечто подобное, но чуть с большим функционалом, имхо!

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

Проблема же встает, когда возникает нужда писать русскими буковками!
Для начала, нужно превратить из шрифта TrueType в метрический шрифт, который и юзает Adobe.
Это делается с помощью программки ttf2pt1 . Скачать ее можно легко в инете! Программа работает из командной строки! Чтобы сгенерировать метрический шрифт с расширением amf в командной стоке набираем ttf2pt1 -A шрифт.ttf имяшрифтагенерируемого . Появляется файлик с раширением afm. В моем случае я работал со шрифтом arial. Посему команда была такая ttf2pt1 -A arial.ttf arial

PHP:
MakeFont (string fontfile , string afmfile [, string enc [, array patch [, string type ]]])
font>

Где:
fontfile - шрифт TrueType
afmfile - сгенерированный вами afm шрифт
enc - кодировка (в данном случае указываем кириллицу cp1251)
patch - опциональное изменение кодировки (не указываем)
type - тип шрифта (по умлочанию TrueType, по-этому можно не указывать)

Так вот, создаем скриптик, в который инклудим файл makefont/makefont.php в директории, скажем font, следующего вида:

PHP:
MakeFont ("arial.ttf" , "arial.afm" , "cp1251" ) ;
font>

И запускаем его! После чего происходит генерация двух файлов, описывающих скрипт!
Это arial.php и arial.z
В данном случае ключевым файлом для нашей работы является arial.php, в котором есть много чего интересного!

Все это дело оставляем на сервере, где у нас будут работать скрипты!
С помощью команд FPDF (с коими можно ознакомиться в документации) создаем pdf файл, но чтобы подключить к нему созданные нами шрифты, нужно вызвать функцию FPDF addfont().

А именно так:

PHP:
$pdf = new FPDF ();
$pdf -> addfont ("arial" , "" , "font/arial.php" );
font>

Как вы уже поняли, первый аргумент функции - имя шрифта, третий - это путь до сгенерированного нами пхп файла! Второй аргумент - это стиль шрифта(жирный, курсив и т.д.). Однако для его использования нужно повторить операции по созданию шрифта соотвественно для жирного, курсива и т.д.!

Пишем какой-нибудь русский текст, выводим его в пдф! И опля! Шрифт русский у нас отображается, но некрасиво! Расстояние между буквами разное, все очень криво и неровно! А все из-за того, что как то некоректно сгенерировался файл arial.php с описанием скрипта!
Посмотрим, что в нем есть:
А в нем есть массив $cw, который имеет вид ключ=>значение = символ=>размерсимвола! И если внимательно приглядеться, что для латиницы для каждой буквы стоит разный размер, а вот для кириллицы одинаковы 750! Можно вручную изменять эти размеры, добиваясь красоты вида!

Но я пожалуй размещу уже исправленную карту размеров для arial regular!

Всем спасибо за внимание!
Сорри за корявость изложения!
Но надеюсь на полезность содержания!

  • Перевод

Большинство web-сервисов экспортируют данные в разных форматах для дальнейшего использования. Данная статья о том, как экспортировать данные в pdf-формате.
Хотя многие знают как это делать, я опишу кратко для тех кто не знает.

PHP позволяет нам генерировать файлы в формате pdf налету. FPDF - это бесплатный код на языке php, позволяющий создавать документы в формате pdf и производить с ними различные манипуляции.

PDFlib
PHP API содержит большое количество функций для работы с PDF, реализованных на базе PDFlib . Несмотря на это, данная библиотека не является бесплатной для коммерческого использования. Бесплатная версия называется PDFlib Lite и бесплатная для персонального использования, однако она ограничена в функциональности. Для того чтобы использовать полную библиотеку PDFlib необходимо купить лицензию.

Почему FPDF?
Альтернатива - это использование FPDF, бесплатный класс содержащий большое количество функций для создания и манипулирования PDF-документами. Ключевое слово для данного момента - это ее бесплатность. Вы можете скачать, использовать и модифицировать данный класс как вам заблагорассудится. В дополнение к бесплатности, эта библиотека намного проще, чем PDFlib. Для использования PDFlib необходимо установить ее как расширение к PHP, в то время как FPDF может быть подключена в программу напрямую.

Создание документов PDF
Для того чтобы начать, необходимо скачать код FPDF с сайта FPDF Web site и включить в программу. Например, вот так


Ниже пример использования библиотеки для генерации простого PDF.
Мы создадим новый объект FPDF:

Конструктор FPDF принимает следующие параметры
  • Ориентация страницы (P or L) книжная или альбомная
  • Размерность (pt,mm,cm или in)
  • Размер документа (A3, A4, A5, Letter and Legal)
Далее мы установим некоторые свойства документа
$pdf->SetAuthor("Lana Kovacevic");
$pdf->SetTitle("FPDF tutorial");

Так как в данном примере мы используем одинаковый шрифт для всего документа, мы устанавливаем его до создания страницы
$pdf->SetFont("Helvetica","B",20);
$pdf->SetTextColor(50,60,100);

У функции SetFont 3 параметра; название шрифта, стиль и размер. Мы используем Helvetica, жирный и 20 пунктов, мы будем использовать его для заголовка документа.
Вы можете использовать любой другой шрифт, используя функцию AddFont.
Используя функцию SetTextColor, мы устанавливаем цвет шрифта для всего документа. Цвет может быть представлен в RGB или grey scale. В данном примере мы используем RGB-значения.
Теперь когда главное сделано, приступим к созданию страниц.
$pdf->AddPage("P");
$pdf->SetDisplayMode("real","default");

В функцию AddPage () можно передать параметры «P» или «L» для указания ориентации страницы. Функция SetDisplayMode определяет как будет отображена страница. Вы можете определить параметры увеличения и разметки. В примере мы используем 100% увеличение и разметку по умолчанию, определенную в программе, используемой для просмотра.

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

$pdf->Image("/logo.svg?1",10,20,33,0," ","http://www.fpdf.org/");

Для того чтобы добавить ссылку воспользуемся следующей командой
$pdf->Link(10, 20, 33,33, "http://www.fpdf.org/");

Сейчас созададим заголовок с рамкой
$pdf->SetXY(50,20);
$pdf->SetDrawColor(50,60,100);
$pdf->Cell(100,10,"FPDF Tutorial",1,0,"C",0);

Функция SetXY устанавливает x и y координаты точки, в которой мы хотим вывести заголовок. SetDrawColor устанавливает цвет границы, используя значения RGB. После этого мы вызываем функцию Cell для вывода прямоугольника с текстом нашего заголовка. Мы передаем в функцию следующие параметры: ширина, высота, текст, граница, ln, выравнивание и заполнение. Значение границы 0 - отсутствие границы или 1 для наличия границы. Для ln мы используем значение по умолчанию 0, «C» - выравнивание текста по цуентру и 0 для параметра заполнение. Если мы бы установили последний паараметр в 1 наш прямоугольник был бы закрашен, значение 0 оставит его прозрачным.
Теперь мы хотим написать маленький текст в наш документ
$pdf->SetXY(10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,"Congratulations! You have generated a PDF. ");

Итак снова мы устанавливаем координаты вывода текста x и y, но теперь мы уменьшим размер шрифта, используя SetFontSize. Функция Write напечатает текст в наш документ. Параметр 5 устанавливает высоту, он имеет смысл только тогда когда у нас есть много строк в нашем тексте.
В конце мы выведен наш результат, используя функцию Output.
$pdf->Output("example1.pdf","I");

Здесь мы указали имя файла и параметры вывода, в данном случае «I». «I»-параметр выведет результат в браузер.

Итак полный текст:

require("fpdf.php");
//create a FPDF object
$pdf=new FPDF();
//set document properties
$pdf->SetAuthor("Lana Kovacevic");
$pdf->SetTitle("FPDF tutorial");
//set font for the entire document
$pdf->SetFont("Helvetica","B",20);
$pdf->SetTextColor(50,60,100);
//set up a page
$pdf->AddPage("P");
$pdf->SetDisplayMode(real,"default");
//insert an image and make it a link
$pdf->Image("/logo.svg?1",10,20,33,0," ","http://www.fpdf.org/");
//display the title with a border around it
$pdf->SetXY(50,20);
$pdf->SetDrawColor(50,60,100);
$pdf->Cell(100,10,"FPDF Tutorial",1,0,"C",0);
//Set x and y position for the main text, reduce font size and write content
$pdf->SetXY (10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,"Congratulations! You have generated a PDF.");
//Output the document
$pdf->Output("example1.pdf","I");

Сейчас когда мы научились создавать документы, посмотрим что еще можно сделать, используя FPDF. Пример ниже показывает нам как создать верх и низ (хедер и футер:-)) нашего документа.

require("fpdf.php");
class PDF extends FPDF
{
function Header()
{
$this->Image("/logo.svg?1",10,8,33);
$this->SetFont("Helvetica","B",15);
$this->SetXY(50, 10);
$this->Cell(0,10,"This is a header",1,0,"C");
}
function Footer()
{
$this->SetXY(100,-15);
$this->SetFont("Helvetica","I",10);
$this->Write (5, "This is a footer");
}
}
$pdf=new PDF();
$pdf->AddPage();
$pdf->Output("example2.pdf","D");

Как вы видите мы создали дочерний класс, используя наследование и создания функций Header и Footer. Затем мы создали новый объект и добавили страницу в документ. Функция AddPage автоматически вызовет функции Header и Footer. В конце мы вывели полученную информацию в файл с названием example2.pdf, используя значение «D». В этом случае браузер предложит сохранить данный файл.

Итак, мы изучили основы создания PDF-документов, для более подробной информации используйте

У меня есть большой файл PDF, который представляет собой карту пола для здания. Он имеет слои для всей офисной мебели, включая текстовые окна с местом расположения сиденья.

Есть ли способ сделать это через PHP? (Или даже Ruby или Python, если это то, что необходимо)

ваш первоначальный запрос: «У меня большой PDF-файл, который представляет собой карту пола для здания».

Я боюсь сказать вам, что это может быть сложнее, чем вы предполагаете.

Причина, по которой последнее известное использование lib используется для анализа pdf, - это smalot, и, как известно, проблема связана с большим файлом.

Здесь также Lookig для реального php lib для синтаксического анализа pdf, без пика памяти, которому нужна конфигурация php, чтобы отключить ограничение памяти, как это делает множество «разработчиков» (что, на мой взгляд, действительно нецелесообразно).

см. это сообщение для получения дополнительной информации о производительности smalot: https://github.com/smalot/pdfparser/issues/163

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

Другая возможная библиотека - TCPDF: http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf

Обновить, чтобы добавить более современную библиотеку: PDF Parser

Хм... не точно php, но вы можете вызвать программу из php, чтобы преобразовать pdf в временный html-файл, а затем проанализировать полученный файл с помощью php. Я сделал что-то подобное для моего проекта, и это программа, которую я использовал:

Что круто о программе, так это то, что она будет выплевывать текстовые элементы в тегах

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

Функции PDF

Введение

Функции PDF в PHP могут создавать PDF-файлы с использованием библиотеки PDFlib, автор Thomas Merz .

Документация этого раздела является обзором функций библиотеки PDFlib и не может считаться исчерпывающим справочником. Консультируйтесь в сопровождающей документации дистрибутива PDFlib. Там содержится полноценный обзор возможностей функций библиотеки PDFlib и самая свежая информация обо всех функциях.

В библиотеке PDFlib и в модуле PHP все функции и параметры имеют идентичные имена. Вам необходимо разобраться в некоторых основных понятиях PDF и PostScript, чтобы эффективно использовать это расширение.
Все размеры и координаты измеряются в пунктах PostScript. Обычно имеется 72 PostScript-пункта на дюйм, но это зависит от разрешающей способности на выводе. См. в PDFlib-документации, включённой в дистрибутив PDFlib, объяснение используемой системы координат.

Обратите внимание, что большинство функций PDF требуют pdf object в качестве первого параметра. См. примеры далее.

Примечание: Имеется альтернативный модуль PHP для создания PDF-документов на базе FastIO"s ClibPDF. См. раздел ClibPDF . Обратите внимание, что ClibPDF имеет несколько иной API по сравнению с PDFlib.

Требования

PDFlib доступна для скачивания на http://www.pdflib.com/products/pdflib/index.html , но требует платной лицензии на коммерческое использование. Библиотеки JPEG и TIFF требуются при компиляции данного расширения.

Для использования данных функций в PHP

Когда вы используете версию 3.x PDFlib, вы должны сконфигурировать PDFlib с опцией --enable-shared-pdflib .

В PHP 4.3.9, Вы должны установить это расширение через PEAR , используя следующую команду: pear install pdflib .

Конфликты со старыми версиями PDFlib

Начиная с PHP 4.0.5, PHP-расширение для PDFlib официально поддерживается компанией PDFlib GmbH. Это означает, что все функции, описанные в учебнике PDFlib (V3.00 или выше), поддерживаются в PHP 4 с точно теми же значениями и параметрами. Только return-значения могут отличаться от учебника PDFlib, так как используется соглашение PHP по возвращению FALSE . Из соображений совместимости эта привязка к PDFlib всё ещё поддерживает старые функции, но они должны быть заменены их новыми версиями. PDFlib GmbH не будет рассматривать проблемы, возникающие при использовании этих старых функций.

Старая функция Замена
pdf_put_image() Больше не нужна.
pdf_execute_image() Больше не нужна.
pdf_get_annotation() pdf_get_bookmark() с использованием тех же параметров.
pdf_get_font() pdf_get_value() с передачей "font" в качестве второго параметра.
pdf_get_fontsize() pdf_get_value() с передачей "fontsize" в качестве второго параметра.
pdf_get_fontname() pdf_get_parameter() с передачей "fontname" в качестве второго параметра.
pdf_set_info_creator() pdf_set_info() с передачей "Creator" в качестве второго параметра.
pdf_set_info_title() pdf_set_info() с передачей "Title" в качестве второго параметра.
pdf_set_info_subject() pdf_set_info() с передачей "Subject" в качестве второго параметра.
pdf_set_info_author() pdf_set_info() с передачей "Author" в качестве второго параметра.
pdf_set_info_keywords() pdf_set_info() с передачей "Keywords" в качестве второго параметра.
pdf_set_leading() pdf_set_value() с передачей "leading" в качестве второго параметра.
pdf_set_text_rendering() pdf_set_value() с передачей "textrendering" в качестве второго параметра.
pdf_set_text_rise() pdf_set_value() с передачей "textrise" в качестве второго параметра.
pdf_set_horiz_scaling() pdf_set_value() с передачей "horizscaling" в качестве второго параметра.
pdf_set_text_matrix() Больше не доступна.
pdf_set_char_spacing() pdf_set_value() с передачей "charspacing" в качестве второго параметра.
pdf_set_word_spacing() pdf_set_value() с передачей "wordspacing" в качестве второго параметра.
pdf_set_transition() pdf_set_parameter() с передачей "transition" в качестве второго параметра.
pdf_open() pdf_new() плюс последующий вызов pdf_open_file()
pdf_set_font() pdf_findfont() плюс последующий вызов pdf_setfont()
pdf_set_duration() pdf_set_value() с передачей "duration" в качестве второго параметра.
pdf_open_gif() pdf_open_image_file() с передачей "gif" в качестве второго параметра.
pdf_open_jpeg() pdf_open_image_file() с передачей "jpeg" в качестве второго параметра.
pdf_open_tiff() pdf_open_image_file() с передачей "tiff" в качестве второго параметра.
pdf_open_png() pdf_open_image_file() с передачей "png" в качестве второго параметра.
pdf_get_image_width() pdf_get_value() с передачей "imagewidth" в качестве второго параметра и изображения в качестве третьего параметра.
pdf_get_image_height() pdf_get_value() с передачей "imageheight" в качестве второго параметра и изображения в качестве третьего параметра.

Подсказки по установке PDFlib 3.x

При использовании версии 3.x библиотеки PDFlib вы должны сконфигурировать PDFlib с опцией
--enable-shared-pdflib .

Вопросы по старым версиям PDFlib

PDFlib 3.0 или выше поддерживается в PHP 3.0.19 и позднее.

Примеры

Большинство функций довольно легко использовать. Самое трудное это, пожалуй, создание очень простого PDF-документа. Следующий пример должен помочь начать. Он создаёт test.pdf из одной страницы. Эта страница содержит текст "Times Roman outlined" шрифтом outlined 30pt. Текст также подчёркнут.

Пример 1. Создание PDF-документа с помощью PDFlib

$pdf = pdf_new ();
pdf_open_file ($pdf , "test.pdf" );

pdf_set_info ($pdf , "Title" , "Test for PHP wrapper of PDFlib 2.0" );
pdf_set_info ($pdf , "Creator" , "See Author" );
pdf_set_info ($pdf , "Subject" , "Testing" );
pdf_begin_page ($pdf , 595 , 842 );
pdf_add_outline ($pdf , "Page 1" );
$font = pdf_findfont ($pdf , "Times New Roman" , "winansi" , 1 );
pdf_setfont ($pdf , $font , 10 );
pdf_set_value ($pdf , "textrendering" , 1 );
pdf_show_xy ($pdf , "Times Roman outlined" , 50 , 750 );
pdf_moveto ($pdf , 50 , 740 );
pdf_lineto ($pdf , 330 , 740 );
pdf_stroke ($pdf );
pdf_end_page ($pdf );
pdf_close ($pdf );
pdf_delete ($pdf );
echo "finished" ;
?>

Скрипт getpdf.php возвращает pdf-документ:

$len = filesize ($filename );
header ();

header ();
readfile ($filename );
?>

Дистрибутив PDFlib содержит более сложный пример, где создаётся страница с аналоговыми часами. Здесь мы используем возможность PDFlib создания в памяти, чтобы не использовать временные файлы. Этот пример, конвертированный в PHP из примера PDFlib, таков: (Такой же пример имеется в документации CLibPDF .)

Пример 2. pdfclock из дистрибутива PDFlib

$radius = 200 ;
$margin = 20 ;
$pagecount = 10 ;$pdf = pdf_new ();pdf_open_file ($pdf , "" )) {
echo error ;
exit;
};pdf_set_parameter ($pdf , "warning" , "true" );pdf_set_info ($pdf , "Creator" , "pdf_clock.php" );
pdf_set_info ($pdf , "Author" , "Uwe Steinmann" );
pdf_set_info ($pdf , "Title" , "Analog Clock" );$pagecount -- > 0 ) {
pdf_begin_page ($pdf , 2 * ($radius + $margin ), 2 * ($radius + $margin ));pdf_set_parameter ($pdf , "transition" , "wipe" );
pdf_set_value ($pdf , "duration" , 0.5 );pdf_translate ($pdf , $radius + $margin , $radius + $margin );
pdf_save ($pdf );
pdf_setrgbcolor ($pdf , 0.0 , 0.0 , 1.0 );/* minute strokes */
pdf_setlinewidth ($pdf , 2.0 );
for ($alpha = 0 ; $alpha < 360 ; $alpha += 6 ) {
pdf_rotate ($pdf , 6.0 );

pdf_lineto ($pdf , $radius - $margin / 3 , 0.0 );
pdf_stroke ($pdf );
}pdf_restore ($pdf );
pdf_save ($pdf );/* 5 minute strokes */
pdf_setlinewidth ($pdf , 3.0 );
for ($alpha = 0 ; $alpha < 360 ; $alpha += 30 ) {
pdf_rotate ($pdf , 30.0 );
pdf_moveto ($pdf , $radius , 0.0 );
pdf_lineto ($pdf , $radius - $margin , 0.0 );
pdf_stroke ($pdf );
}$ltime = getdate ();/* draw hour hand */
pdf_save ($pdf );
pdf_rotate ($pdf ,-(($ltime [ "minutes" ]/ 60.0 )+ $ltime [ "hours" ]- 3.0 )* 30.0 );

pdf_lineto ($pdf , $radius / 2 , 0.0 );

pdf_closepath ($pdf );
pdf_fill ($pdf );
pdf_restore ($pdf );/* draw minute hand */
pdf_save ($pdf );
pdf_rotate ($pdf ,-(($ltime [ "seconds" ]/ 60.0 )+ $ltime [ "minutes" ]- 15.0 )* 6.0 );
pdf_moveto ($pdf , - $radius / 10 , - $radius / 20 );
pdf_lineto ($pdf , $radius * 0.8 , 0.0 );
pdf_lineto ($pdf , - $radius / 10 , $radius / 20 );
pdf_closepath ($pdf );
pdf_fill ($pdf );
pdf_restore ($pdf );/* draw second hand */
pdf_setrgbcolor ($pdf , 1.0 , 0.0 , 0.0 );
pdf_setlinewidth ($pdf , 2 );
pdf_save ($pdf );
pdf_rotate ($pdf , -(($ltime [ "seconds" ] - 15.0 ) * 6.0 ));
pdf_moveto ($pdf , - $radius / 5 , 0.0 );
pdf_lineto ($pdf , $radius , 0.0 );
pdf_stroke ($pdf );
pdf_restore ($pdf );/* draw little circle at center */
pdf_circle ($pdf , 0 , 0 , $radius / 30 );
pdf_fill ($pdf );pdf_restore ($pdf );pdf_end_page ($pdf );# to see some difference
sleep (1 );
}pdf_close ($pdf );$buf = pdf_get_buffer ($pdf );
$len = strlen ($buf );header ("Content-type: application/pdf" );
header ("Content-Length: $len" );
header ("Content-Disposition: inline; filename=foo.pdf" );
echo $buf ;pdf_delete ($pdf );
?>
Содержание

pdf_add_annotation - не рекомендуется: добавляет аннотацию pdf_add_bookmark - добавляет закладку на текущей странице pdf_add_launchlink - добавляет запускающую аннотацию на текущей странице pdf_add_locallink - добавляет аннотацию-ссылку на текущей странице pdf_add_note - добавляет аннотацию-заметку на текущей странице pdf_add_outline - не рекомендуется: добавляет закладку на текущей странице pdf_add_pdflink - добавляет ссылку-аннотацию на файл на текущей странице pdf_add_thumbnail - добавляет уменьшенную версию/thumbnail на текущей странице pdf_add_weblink - добавляет web-ссылку на текущей странице pdf_arc - рисует дугу (против часовой стрелки) pdf_arcn - рисует дугу (по часовой стрелке) pdf_attach_file - добавляет присоединение файла на текущей странице pdf_begin_page - начинает новую страницу pdf_begin_pattern - начинает новый патэрн pdf_begin_template - начинает новый шаблон pdf_circle - рисует круг pdf_clip - обрезает до текущего пути/path pdf_close_image - закрывает изображение pdf_close_pdi_page - закрывает дескриптор страницы pdf_close_pdi - закрывает ввод PDF-документа pdf_close - закрывает pdf-объект pdf_closepath_fill_stroke - закрывает, заполняет и очерчивает текущий путь