Порівняння способів генерації pdf із html. Ще один спосіб генерації PDF PDF24 Creator – безкоштовний генератор PDF

PDF24 Creator це безкоштовний PDF генератор для вашого ПК. Генерація PDF файлів неймовірно просте завдання з цією програмою. Комбінація додаткових можливостей разом із створенням PDF файлів робить цей інструмент однією з найвизнаніших безкоштовних програм. Як альтернатива ви також можете генерувати PDF онлайн. Прочитайте нижче, як це працює.

PDF24 Creator – безкоштовний PDF генератор

PDF24 Creator це безкоштовний PDF генератор для Windows. Генерація PDF файлів реалізована за допомогою PDF-принтера. Після інсталяції у Windows з'явиться новий віртуальний PDF принтер. Просто друкуйте через цей принтер все, що хочете перетворити на PDF. PDF-принтер, це єдиний шлях створення PDF. Програма включає широкий спектр можливостей, які допоможуть вам у генерації PDF. Ця програма безкоштовна. Ви можете завантажити свіжу версію цього сайту.

PDF24 Онлайн PDF Генератор – Генерація PDF файлів онлайн

Онлайн PDF Генератор, це корисний інструмент, якщо ви хочете перетворити документи на формат PDF. Просто оберіть документ або надішліть документ поштою в Онлайн PDF Генератор і через кілька секунд ваш PDF файл буде доступний для скачування або відправлений вам назад.

Email інтерфейс для цього PDF генератор також доступний. Потрібно надіслати файли генератору і дочекатися листа у відповідь, в якому будуть файли, сконвертовані в PDF

Безліч інших генераторів PDF в інструментарії PDF24

Онлайн утиліти від PDF24 вирішують багато проблем, пов'язаних з PDF, досить просто, швидко та безкоштовно. Багато цих інструментів генерують PDF файли. Ви ще не знайомі з онлайн утилітами PDF24? Подивіться, чи ви зможете використовувати всі ці інструменти.

Однією з найважливіших частин будь-якої системи управління проектами є можливість зробити звіт про поточний стан справ. Це дає змогу точніше оцінювати поточний стан справ. Для користувачів такий звіт може бути не тільки аналітикою, яка потрібна для роботи, але й своєрідною формою звітності. Тому в компанії Revizto приділяють велику увагу техніці генерації звітів.

У окремих клієнтів звіти являють собою великі PDF на десятки тисяч сторінок. Звісно ж такі звіти важать гігабайти і генерація їх займає тривалий час. Зіткнувшись із черговим зростанням розміру звіту, ми вирішили проаналізувати нашу архітектуру генерації pdf.

Традиційно в Інтернеті генерація pdf складається з двох етапів:

  1. Генерація html сторінки, яка потім стане pdf
  2. Переклад html у pdf

Перший етап у нашому випадку займав досить мало часу, а ось другий міг тривати більше години. Тому ми зробили невелике порівняння, які існують опенсорсні можливості по генерації pdf:

    Перейти до часу: "phantomjs --ssl-protocol=any ./capture.js 1.html 1.pdf" User time (seconds): 2240.56 System time (seconds): 6.96 Percent of CPU this job got: 83% Elapsed ( wall clock) Час (h:mm:ss або m:ss): 44:35.89 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes ): 0 Maximum resident set set (kbytes): 1821840 Average resident set set (kbytes): 0 Major (requiring I/O) page faults: 28 Minor (reclaiming a frame) page faults: 489364 Voluntary context : 31797 Swaps: 0 File system inputs: 4576 File system outputs: 233848 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0

    Command being timed: "/usr/bin/google-chrome-stable --headless --disable-gpu --print-to-pdf 1.html" User time (seconds): 54.22 System time (seconds): 7.32 Percent of CPU цей робочий стіл: 5% Натиснувши (wall clock) час (h:mm:ss або m:ss): 18:49.74 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size ( kbytes): 0 Average total size (kbytes): 0 Maximum resident set set (kbytes): 951796 Average resident set set (kbytes): 0 Major (requiring I/O) page faults: 2 Minor (reclaiming a frame) page faults: 938614 Voluntary context switches: 184497 Involuntary context switches: 37463 Swaps: 0 File system inputs: 368 File system outputs: 174352 Socket messages Повідомити про: 0

  1. Wkhtmltopdf Підписано з 1 до 10:00 1 Command being timed: "wkhtmltopdf 1.html 1.pdf" часу (h:mm:ss або m:ss): 56:21.54 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set set size (kbytes): 3457744 Average resident set set size (kbytes): 0 Major (requiring I/O) page faults: 8 Minor (reclaiming a frame) page faults: 977440 : 0 File system inputs: 1240 File system outputs: 197480 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 1

З наведеного тесту видно, що найкращий результат виходить у chrome, потім вдвічі гірше phantomJs, а потім ще значно гірше Wkhtmltopdf. Цей результат перегукується з проблемами розробки phantomJs

З іншого боку chrome залежить від X11, так що на сервері питань з ним буде значно більше, ніж з phantomJs.

Якщо робити невеликий висновок, то для тестування машини з десктопом chrome безумовний переможець. На сервері його розумно використовувати, якщо не боятися поставити туди X11, інакше phantomJs буде оптимальним варіантом

Онлайн чи офлайн?

Створюйте PDF-файли з будь-якої програми. Працюйте в режимі онлайн, використовуючи наш онлайн-додаток, або в режимі онлайн, завантаживши настільний додаток Soda PDF на свій комп'ютер.

Створіть файл

Якщо ви вирішили створити PDF-файл за допомогою онлайн-програми, завантажте наявний файл зі свого комп'ютера або з хмарного сховища, такого як Google Drive або Dropbox.

Надішліть поштою

Коли PDF-файл буде створено, ви можете надіслати його на свою адресу електронної пошти або завантажити на свій комп'ютер і переглянути його у своєму браузері.

ЧИ ЗНАЄТЕ ВИ?

Є новий, екологічний спосіб друку документів!

Немає необхідності використовувати папір, коли ви можете використовувати віртуальний друк. Коли ви завантажите програму Soda PDF для настільного ПК, вона встановить віртуальний принтер Soda PDF на ваш комп'ютер. Потім ви можете вибрати принтер Soda PDF з будь-якої програми, щоб перетворити будь-який документ у формат PDF, не відкриваючи настільну програму Soda PDF! Коли ви готові надрукувати свій документ, просто виберіть принтер Soda PDF з меню принтерів, і тоді буде створено копію документа у форматі PDF. За допомогою Soda PDF можна створювати PDF-файли з файлів більш ніж 300 форматів.

ДОДАТКОВА ІНФОРМАЦІЯ ПРО СТВОРЕННЯ PDF

Формат PDF

Формат PDF був створений компанією Adobe Systems у 1993 році. У 2008 році він був стандартизований як відкритий формат, розвитком якого став займатися незалежний комітет ISO.

PDF 2.0

Формат PDF значно еволюціонував із моменту свого створення. Останньою версією є версія PDF 2.0, стандарт якої був опублікований 28 липня 2017 р.

Інші можливості

Якщо ви хочете створити PDF-файл шляхом об'єднання декількох файлів, використовуйте наш безкоштовний онлайн-інструмент "Об'єднати PDF". Ви навіть можете вибрати порядок проходження окремих файлів у загальному файлі.

Де це може стати в нагоді?При необхідності генерації готових до друку файлів у web-додатку за вже наявним довільним жорстким шаблоном: сертифікати, бейджі, пропуски та інше.

Чому PDF?Формат PDF дозволяє створювати документи з цілою низкою незаперечних переваг: відкритість, кросплатформеність, поширеність і, що дуже важливо, точністю та незмінністю передачі даних по ланцюжку створення, перегляд та друк.

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

Які переваги?Можливість створення та швидкого редагування дуже складних шаблонів у звичних векторних редакторах, таких як Adobe Illustrator, Corel Draw або Inkscape. Простота програмування та використання лише безкоштовних програмних засобів. Ще однією важливою перевагою є можливість прозоро використовувати UTF-8 для текстів, що вставляються.

Що для цього потрібно?Для використання даного методу потрібен виділений сервер з можливістю встановлення своїх програм (Inkscape та GhostScript) та виконанням system-команд. При цьому все буде працювати як на платформі Windows, так і на Linux.

Думаю, короткий FAQ висвітлив основні питання щодо даного методу, тому відразу приступимо до розбору його суті.

Як відомо, формат векторної графіки SVG фактично є XML-файлом, тому вже створений файл досить просто редагувати найпростішими засобами програмування. У разі використання SVG файлу як жорсткого шаблону процес спрощується в рази, т.к. нам немає потреби змінювати структуру документа, а потрібно лише зробити підстановку потрібних текстових значень або кодованих у base64 растрових зображень.

Створити початковий шаблон можна в будь-якому векторному редакторі, який підтримує експорт у svg: Adobe Illustrator, Corel Draw або в самому Inkscape'і. Використання останнього бажано, хоча б на останній, доводочній стадії, тому що, зрештою, саме йому належить виробляти необхідне нам перетворення.

При використанні растру в шаблоні, можна використовувати два методи, зберігати растр в окремому зовнішньому файлі або вбудованим в сам SVG файл. За необхідності міняти в шаблоні растровий малюнок у першому випадку можна перед генерацією міняти файл. При зберіганні малюнка вбудованим у файл слід у властивості URL об'єкта малюнка прописати рядок:

де (IMAGE) – це поле для вставки шаблонизатором base64 кодованого зображення.

Для прикладу намалюємо простенький шаблон бейджа, думаю ви пробачте мені за кривість, я не художник, а для реального використання, ви можете замовити у вашого дизайнера векторний макет.


Я не став використовувати змінне растрове зображення, залишивши це на домашнє завдання, а обмежився лише текстовими полями, що змінюються.

Думаю, ви вже звернули увагу, що в місцях передбачуваного тексту вставлені теги шаблонизатора (в даному прикладі використовувався ). Саме використання XML сумісних тегів дає можливість прописувати їх у самому векторному редакторі, не вдаючись до додаткового редагування.

Ми маємо шаблон, і вже без проблем зможемо вставити необхідні нам дані, але як ми власне будемо проводити перетворення? Для цього скористаємося інтерфейсом командного рядка Inkscape:

#перетворення на PDF-файл
inkscape -A

Використовуючи ключ « -A» ми відразу отримаємо PDF файл, але, на жаль, створюваний напрямок PDF має дуже великі розміри. Для вирішення цієї проблеми можна піти в обхід. А саме, використовувати експорт SVG не на пряму в PDF, а по ланцюжку SVG->PS->PDF. Використовуючи для кінцевого формування PDF файлу утиліту ps2pdf із комплекту Ghost Script, ми можемо зменшити розміри фінального файлу в десятки разів.
#перетворення на PostScript-файл
inkscape -P
#перетворення на PostScript-файла на PDF
ps2pdf

Єдиний мінус у тому, що в цьому випадку ми втратимо всі ефекти прозорості, оскільки формат PostScript не підтримує.

Для повної переносимості згенерованих документів можна додати Inscape'у опцію « -T» перетворення всього тексту на криві. Цим самим ми зможемо позбавитися проблем наявністю шрифтів на клієнтській машині, а також проблем з кодуваннями.

Тепер у нас є все необхідне: SVG шаблон і команди перетворень. Напишемо php-скрипт, який видавав pdf-файл згенерований з шаблону.

/* ****************************************************************************************
* Скрипт формування pdf-файлу пропуску за допомогою послідовного перетворення
* шаблону в svg файл, після чого той перетворюється на PostScript файл програмою Inkscape,
* і останній перетворюється на pdf за допомогою утиліти ps2pdf.
*
* Автор: Шебастюк В.В. a.k.a. JStingo
* **************************************************************************************** */

/* параметри скрипта */

//Шлях до папки з тимчасовими файлами
//(якщо не вказано, файли будуть зберігатися в системній тимчасовій папці)
$tmp_dir = ""; //генеруємо шляхи до тимчасових svg, ps та pdf файлів
$tmp_svg_file = tempnam ($tmp_dir, "");
$tmp_ps_file = tempnam ($tmp_dir, "");
$tmp_pdf_file = tempnam ($tmp_dir, ""); /* Шаблонізатор FastTemplate */
include( "include/cls_fast_template.php");
$tpl = new FastTemplate («templates» );try ( /* Блок із отриманими для шаблонізації даними */
/* ........................... */
$user_name = "JStingo";
$register_date = "28/09/2007" ;
/* ........................... */
/* формуємо ім'я результуючого файлу у вигляді User_name.pdf */
$pdf_file_name = $user_name. ".pdf"; /* обробка шаблону та отримання результуючого файлу */$tpl -> define (array("svg" => «template.svg»));
$tpl -> assign (array("USER_NAME" => $user_name ,
"R_DATE" => $register_date
));
$tpl -> parse ("SVG", "svg"); //збереження отриманий svg файл
$tpl -> FastWrite ("SVG", $tmp_svg_file); //робимо конвертацію svg-файлу засобами inkscape"а в ps-файл
//Ключі
// -T - служить перетворення тексту в криві (для нормальної підтримки шрифтів)
// -P - вказує на необхідність перетворення на PostScript-файл
system ( "inkscape -T $tmp_svg_file -P $tmp_ps_file", $success );if($success != 0 )
throw new Exception ( "Помилка формування ps-файлу.");//перетворюємо ps-файл у pdf за допомогою утиліти ps2pdf

//Ключі
// -dUseFlateCompression=true - встановлює використання компресії
// -dPDFSETTINGS=/printer - встановлює оптимізацію для друку

system ( "ps2pdf -dUseFlateCompression=true -dPDFSETTINGS=/printer $tmp_ps_file $tmp_pdf_file", $ success ); //у разі невдалого виконання перетворення формуємо виняток
if($success != 0 )
throw new Exception ( "Помилка формування pdf-файлу.");//заголовок про те, що будемо надсилати pdf-файл
header ( "Content-type: application/pdf");// Називатися буде як $pdf_file_name
header ( "Content-Disposition: attachment; filename="". $pdf_file_name. """); // передаємо згенерований файл
readfile ($tmp_pdf_file); //видаляємо тимчасові файли
@unlink ($tmp_svg);
@unlink ($tmp_ps_file);
@unlink ($tmp_pdf_file); catch (Exception $e) (
/* Якщо десь сталася помилка, то повідомляємо про це */
$tpl -> define (array("error" => "error.tpl"));
$tpl -> assign ("ERROR", $e -> getMessage ()); $tpl -> parse ("ERROR", "error");
$tpl -> FastPrint ("ERROR");
}
?>

Думаю, всім не складе особливих труднощів переписати скрипт іншою мовою програмування.

Тепер можна додати назву звіту. Об'єкт FPDF використовує концепцію "поточна позиція", куди вставляється наступна частина тексту або інший елемент. Оскільки потрібно, щоб назва звіту розташовувалась у середині сторінки, необхідно пересунути поточну позицію вниз до даної точки, яка знаходиться на відстані 160мм від верху сторінки (значення зберігається в конфігураційній змінній $reportNameYPos). Для цього використовується метод FPDF Ln() , який додає переклад рядка на вказану відстань:

$pdf->Ln($reportNameYPos);

Якщо не вказати висоту перекладу рядка, то використовуватиметься висота останнього виведеного осередку.

Тепер додамо назву звіту. Існує кілька способів додати текст за допомогою FPDF. У нашому випадку використовуємо метод Cell() , який, крім іншого, дозволяє легко центрувати текст.

Cell() приймає такі аргументи (усі опціональні):

  • Висота та ширина осередку.За замовчуванням ширина розтягується до правого поля, а висота встановлюється 0.
  • Рядок тексту для виведення.За замовчуванням "" .
  • Вказівка ​​для відображення рамки навколо комірки.Це може бути або число (0 = немає рамки, 1 = малюємо рамку), або рядок з одним або декількома параметрами з наступного списку: "L" (ліворуч), "T" (зверху), "R" (праворуч), та "B" (внизу). Значення за замовчуванням: 0 .
  • Куди поміщати поточну позицію після виведення осередку.Значення може бути 0 (праворуч від комірки), 1 (початок наступного рядка), або 2 (нижче). Значення за замовчуванням: 0 .
  • Вирівнювання тексту. Можливі значення: "L" (вирівнювання з лівого краю), "C" (вирівнювання по центру), або "R" (вирівнювання з правого краю). Значення за промовчанням: "L" .
  • Чи потрібно заливати фон осередку кольором. true = заливаємо кольором, false = залишаємо прозорим фон. Значення за промовчанням: false .
  • URL-адреса посилання.Якщо заданий, то осередок із текстом стає робочим посиланням інший ресурс.

Тепер за допомогою методу Cell() вставимо назву звіту та вирівняємо його по центру:

$pdf->

Створюємо колонтитул сторінки та вступний текст

Отже, титульна сторінка готова. Тепер треба створити сторінку, на якій є колонтитул, заголовок і деякий вступний текст, за яким слідує таблиця та графік.

Зробимо колонтитул сторінки. Додамо нову сторінку, потім виведемо текст колонтитула, який містить назву звіту, вирівняний по центру сторінки та використовує шрифт Arial розміром 17. Використовуємо змінну конфігурації $headerColour для встановлення кольору тексту:

$pdf->AddPage(); $pdf->SetTextColor($headerColour, $headerColour, $headerColour); $pdf->SetFont("Arial", "", 17); $pdf->Cell(0, 15, $reportName, 0, 0, "C");

Тепер перейдемо до тексту. Спочатку виведемо заголовок у звичайному кольорі і шрифтом Arial розміром 20. Оскільки нам не потрібно центрувати текст, можна використовувати простий метод Write() , передавши йому висоту рядка та текст для виведення (як опція можна також передати адресу URL для формування посилання):

$pdf->SetTextColor($textColour, $textColour, $textColour); $pdf->SetFont("Arial", "", 20); $pdf->Write(19, "2009 Was A Good Year");

Тепер можна вивести текст введення шрифтом Arial розміром 12. Тут є пропуски 16 мм першого абзацу і 12 мм між параграфами. Задаємо для кожного рядка висоту 6 мм:

$pdf->Ln(16); $pdf->SetFont("Arial", "", 12); $pdf->Write(6, "Усунути економічне становище, WidgetCo had на багато років. ."); $pdf->Ln(12); $pdf->Write(6, "2010 expected to see increased sales growth as we expand into other countries.");

Метод Write() автоматично переводить текст на наступний рядок, коли він досягає правої сторони сторінки.

Додаємо дані

Тепер потрібно додати таблицю із даними нижче тексту. спочатку встановимо колір рамки таблиці. Метод SetDrawColor() встановлює колір, який використовується для рамок та інших ліній, тому ми можемо використовувати його для встановлення кольору для рамок осередків таблиці. Потім поточну позицію опускаємо вниз на 15мм для створення пробілу між текстом та таблицею:

$pdf->SetDrawColor($tableBorderColour, $tableBorderColour, $tableBorderColour); $pdf->Ln(15);

Створюємо рядок заголовків таблиці

Таблиця має рядок, який містить у комірках заголовки стовпців "PRODUCT", "Q1, "Q2", "Q3", і "Q4". Осередок "PRODUCT" використовує відмінний від інших заголовків колір тексту та фону.

Ми вже використовували метод SetTextColor() для встановлення кольору тексту. Для встановлення кольору фону треба використовувати метод SetFillColor(), який має такі ж аргументи як SetTextColor().

Для створення комірки таблиці використовується метод Cell() , якому задаються ширина і висота комірки, зміст та вирівнювання. Також передається 1 як 4-й аргумент для установки рамки, і true як 7-й аргумент для заповнення фону встановленим кольором.

Нижче наведено код для створення рядка заголовків. Спочатку встановлюється напівжирний шрифт. Потім створюється комірка "PRODUCT" з відповідним текстом та тлом. Потім встановлюється колір для 4 осередків заголовків, що залишилися, і виконується цикл за елементами масиву $columnLabels для виведення осередків з вирівнюванням тексту в них по центру:

// Створюємо рядок заголовків таблиці $pdf-> SetFont ("Arial", "B", 15); // Осередок "PRODUCT" $pdf->SetTextColor($tableHeaderTopProductTextColour, $tableHeaderTopProductTextColour, $tableHeaderTopProductText Colour); $pdf->SetFillColor($tableHeaderTopProductFillColour, $tableHeaderTopProductFillColour, $tableHeaderTopProductFill Colour); $pdf->Cell(46, 12, "PRODUCT", 1, 0, "L", true); // Інші осередки заголовків $pdf->SetTextColor($tableHeaderTopTextColour, $tableHeaderTopTextColour, $tableHeaderTopTextColour); $pdf->SetFillColor($tableHeaderTopFillColour, $tableHeaderTopFillColour, $tableHeaderTopFillColour); for ($i=0; $i Cell(36, 12, $columnLabels[$i], 1, 0, "C", true); ) $ pdf-> Ln (12);

Пробіл на початку вмісту осередку "PRODUCT" допомагає сформувати відступ у осередку таблиці від лівої межі. Такий же трюк буде використовуватися для найменувань продуктів у крайньому лівому стовпці (на жаль, поки що немає способу контролювати відступ у осередках за допомогою FPDF).

Створюємо рядки з даними

Інша таблиця складається з 4 рядків з даними продажів (по одному рядку на товар) для 4-х кварталів. Спочатку визначимо пару змінних:

// Створюємо рядки з даними $fill=false; $row = 0;

Змінні служать для:

    $fill: Заповнювати фон осередку кольором чи ні. Ми перемикатимемо це значення після виведення кожного рядка для отримання ефекту зебри в таблиці.

    $row: Поточний номер рядка. Вона дозволяє виводити відповідний номер кожного рядка при переміщенні по таблиці.

Тепер можна організувати цикл за елементами масиву $data за допомогою foreach для виведення рядків Для кожного рядка створюємо ліву комірку, яка містить назву продукту, і чотири комірки з даними. Встановлюємо відповідні кольори для тескту та фону для кожного осередку.

Для виведення осередків даних використовується цикл для проходу по чотирьох елементному масиву з даними, а для виведення даних у форматі з поділом тисяч викликаємо функцію PHP number_format() .

Після виведення рядка збільшуємо змінну $row, перемикаємо змінну $fill, і використовуємо Ln() для початку наступного рядка.

Ось код всього циклу:

Foreach ($data as $dataRow) ( // Створюємо ліву комірку із заголовком рядка $pdf->SetFont("Arial", "B", 15); $pdf->SetTextColor($tableHeaderLeftTextColour, $tableHeaderLeftTextColour, $tableHeader; $pdf->SetFillColor($tableHeaderLeftFillColour, $tableHeaderLeftFillColour, $tableHeaderLeftFillColour); $pdf->Cell(46, 12, " " . Створюємо комірки з даними $pdf->SetTextColor($textColour, $textColour, $textColour); ), for ($i=0; $i Cell(36, 12, ("$" . number_format($dataRow[$i])), 1, 0, "C", $fill); ) $ row++; $fill = !$fill; $pdf->Ln(12); )

Створюємо графік

Останнім елементом у нашому звіті є стовпчиковий графік, що відображає зведену інформацію щодо чотирьох продуктів за весь рік.

Обчислення масштабу та ширини стовпчика

Спочатку треба обчислити масштаб для осей X і Y. Для масштабу по осі X обчислення полягають у простому розподілі кількості продуктів на бажану ширину графіка (потрібно врахувати невеликі відступи ліворуч і праворуч для кращого виду):

/*** Створюємо графік ***/ // Обчислюємо масштаб по осі X $ xScale = count ($ rowLabels) / ($ chartWidth - 40);

Для обчислення масштабу по осі Y потрібно знайти загальне значення кожного продукту і потім визначити серед них максимальне значення. Потім максимум можна буде розділити на бажану висоту графіка для отримання масштабу значення по осі Y:

// Обчислюємо масштаб по осі Y $ maxTotal = 0; foreach ($data as $dataRow) ( $totalSales = 0; foreach ($dataRow as $dataCell) $totalSales += $dataCell; $maxTotal = ($totalSales > $maxTotal) ? $totalSales: $maxTotal; ) $yScale = $maxTotal / $chartHeight;

Тепер, знаючи масштаб по осі X, можна обчислити ширину (мм) кожного стовпця графіка. Це інверсоване значення масштабу по осі X, зменшене у півтора рази для організації відстані між стовпцями:

// Обчислюємо ширину стовпців $barWidth = (1/$xScale)/1.5;

Додаємо лінії осей та мітки на них

Тепер можна додати лінії осей X і Y, мітки даних та мітки осей. Використовуємо шрифт Arial з розміром 10 для позначок даних.

Для виведення лінії FDPF використовується метод Line() , які приймає чотири аргументи: координати X і Y початку лінії, і координати X і Y кінця лінії.

Для осі X виводимо горизонтальну лінію вздовж низу графіка, залишаючи 30 мм для міток по осі Y зліва. Потім виводимо кожне ім'я продукту в масиві $rowLabels як текстове осередок у відповідну точку:

// Додаємо осі: $pdf->SetFont("Arial", "", 10); // Вісь X $pdf->Line($chartXPos + 30, $chartYPos, $chartXPos + $chartWidth, $chartYPos); for ($i=0; $i< count($rowLabels); $i++) { $pdf->SetXY($chartXPos + 40 + $i / $xScale, $chartYPos); $pdf->Cell($barWidth, 10, $rowLabels[$i], 0, 0, "C"); )

Метод SetXY() дозволяє встановлювати поточну позицію у потрібне місце на сторінці.

Для осі Y виводимо вертикальну лінію зліва від графіка, залишаючи 30 мм для міток даних по осі Y. Лінію осі робимо на 8 мм більше бажаної висоти графіка для того, щоб було місце для виведення мітки осі. Потім організуємо цикл від нуля до максимального значення даних $maxTotal, яке було визначено раніше. Розмір кроку встановлено у змінній $chartYStep (20,000). На кожному кроці виводимо поточне значення вирівняної вправо та коротку мітку:

// Вісь Y $pdf->Line($chartXPos + 30, $chartYPos, $chartXPos + 30, $chartYPos - $chartHeight - 8); for ($i=0; $i<= $maxTotal; $i += $chartYStep) { $pdf->SetXY($chartXPos + 7, $chartYPos - 5 - $i / $yScale); $pdf->Cell(20, 10, "$" . number_format($i), 0, 0, "R"); $pdf->Line($chartXPos + 28, $chartYPos - $i / $yScale, $chartXPos + 30, $chartYPos - $i / $yScale); )

Тепер можна додати позначки осей. Використовуємо шрифт Arial напівжирний з розміром 12. Розміщуємо мітку осі X нижче за мітки даних, а мітку осі Y - нагорі осі Y:

// Додаємо позначки осей $pdf->SetFont("Arial", "B", 12); $pdf->SetXY($chartWidth / 2 + 20, $chartYPos + 8); $pdf->Cell(30, 10, $chartXLabel, 0, 0, "C"); $pdf->SetXY($chartXPos + 7, $chartYPos - $chartHeight - 12); $pdf->Cell(20, 10, $chartYLabel, 0, 0, "R");

Виводимо стовпці графіка

Завершальною стадією є створення графіка. Для виведення стовпців використовується метод FPDF Rect(), який виводить прямокутник. Метод використовує такі аргументи:

  • Координати X та Y верхнього лівого кута прямокутника.
  • Ширина та висота прямокутника.
  • Стиль прямокутника.Може мати значення "D" або "" (виводимо обведення), "F" (заповнюємо поточним кольором фону), або "DF" / "FD" (обведення та заповнення).

Тепер виводимо стовпці. Встановимо змінну $xPos, яка служить для відстеження поточної позиції по X. Задамо їй значення 40 мм з урахуванням відстані для міток по осі Y та відступу для першого стовпця. Тепер створимо змінну $bar, яка міститиме номер поточного стовпця. Вона буде використовуватися для встановлення кольору для стовпця:

// Створюємо стовпчики $xPos = $chartXPos + 40; $ bar = 0;

Тепер проходимо циклом по масиву $ data, обчислюємо сумарне значення для кожного рядка і виводимо стовпець від осі X до цього значення, масштабованого за допомогою $ yScale. Колір для кожного стовпця змінюється за допомогою лічильника $bar, який є індексом у масиві $chartColours. Після виведення поточного стовпця переміщуємо позицію X на початок наступного, збільшуємо лічильник $bar і продовжуємо цикл:

Foreach ($data as $dataRow) ( // Обчислюємо сумарне значення за рядком даних для продукту $totalSales = 0; foreach ($dataRow as $dataCell) $totalSales += $dataCell; // Створюємо стовпець $colourIndex = $bar % count ($chartColours), $pdf->SetFillColor($chartColours[$colourIndex], $chartColours[$colourIndex], $chartColours[$colourIndex]); yScale), $barWidth, $totalSales / $yScale, "DF");

У коді використовується оператор PHP розподіл за модулем (%) для повтору кольору стовпця, якщо кількість стовпців перевищує кількість елементів у масиві $chartColours.

Відправляємо PDF-документ браузеру

Документ PDF готовий! Залишилося лише надіслати його браузеру, щоб користувач міг переглянути його або завантажити.

Для цього використовується метод FPDF Output(). Він приймає два аргументи: ймовірне ім'я для PDF-файлу і прапор призначення. Цей прапор може приймати такі значення:

    I: Виводити PDF на екран, якщо така функція підтримується браузером, інакше завантажувати.

    D: Завантажте PDF.

    F: Зберігати файл у папці на сервері.

    S: Повернути дані PDF як рядок.

Для нашого прикладу використовується опція I для виведення PDF на екран, якщо це можливо:

/*** Виводимо PDF ***/ $pdf->Output("report.pdf", "I"); ?>

Output() автоматично надсилає заголовок HTTP "Content-type: application/pdf" , який сигналізує браузеру про те, що слід очікувати PDF-файл.

Ви готові протестувати скрипт. Відкривайте браузер і переходьте на URL-адресу, де розташований скрипт, наприклад, www.example.com/report.php . Ви повинні побачити PDF у вікні браузера. Або буде виведено діалогове вікно, в якому вам буде запропоновано зберегти PDF-файл на жорсткому диску. Ви можете потім відкрити PDF файл у програмі для перегляду PDF, наприклад Acrobat Reader або Preview.

Для створення PDF документа потрібен лише PHP та FPDF.

Висновок

У цьому уроці ви дізналися, як використовувати PHP з бібліотекою FPDF для генерації звіту у форматі PDF. Були продемонстровані методи бібліотеки FPDF для створення тексту, таблиць та графіків.

Однак бібліотека FPDF може багато чого ще, наприклад, створювати верхній та нижній колонтитули для сторінок, використовувати автоматичний перехід на нову сторінку тощо. Перегляньте документацію по бібліотеці на сайті FPDF.

2021 wisemotors.ru. Як це працює. Залізо. Майнінг. Криптовалюта.