PDF + PHP — создание графиков. Часть 2
X
Заказать сайт
Заказать сайт

PDF + PHP - создание графиков. Часть 2

За счет библиотеки FPDF на PHP можно создавать не только простые документы с картинками, таблицами и текстом, но и целые графики. Конечно, график можно сделать в виде картинки и вставить его в PDF, но что, если вам требуется брать данные из БД и график всегда будет разным? Здесь не обойтись без инструментов pdf php.

В этом примере я приведу код, который частично использует методы со старого урока. Поэтому, если вам что-то не ясно, рекомендую ознакомиться с ним. Скачать полностью готовый пример, можно по ссылке ниже. Там же вы найдет полную документацию по всем свойствам и методам PDF библиотеки. Архив примера можете разархивировать в корне вашего сайта и запустить командой: вашсайт.ру/demo1.php.

Код PDF графика

<?php
require_once( "fpdf181/fpdf.php" );
define('FPDF_FONTPATH', 'fpdf181/font/');

//Настройки
$chartYPos = 180; //положение графика (отступ сверху)
$chartWidth = 190; //ширина всего графика
$chartHeight = 80; //максимальная высота самого большого столбца
$chartYStep = 5000; //шаг деления по оси Y

//цвета столбиков
$chartColours = array(
array( 255, 100, 100 ),
array( 100, 255, 100 ),
array( 100, 100, 255 ),
array( 255, 255, 100 ),
array( 225, 155, 60 ),
);

//Создаем титульную страницу
$pdf = new FPDF( 'P', 'mm', 'A4' ); //P - книга, L - альбомный лист
$pdf->SetTextColor(0, 0, 0); //цвет шрифта ставим по умолчанию черным

//шрифт по умолчанию
$pdf->AddFont('TahomaMy','','tahoma.php'); //подключаем русский шрифт
$pdf->AddFont('TahomaMyBold','B','tahoma_bold.php');
$pdf->SetFont('TahomaMy','',12); //размер шрифта по умолчанию 12 точек

//создаем 1-ю страницу
$pdf->AddPage('P');

$pdf->SetTextColor(100, 100, 100); //серый
$pdf->SetFontSize(17);
$pdf->Cell( 0, 15, "2018 Создание PDF графика", 0, 0, 'C' );

$pdf->SetTextColor(0, 0, 0); //черный
$pdf->SetFontSize(20);
$pdf->Write( 19, "В этом году была проделана хорошая работа" );

$pdf->Ln(16);
$pdf->SetFontSize(12);
$pdf->Write( 5, "Абсолютно весь синтаксис по созданию PDF файла из PHP рекомендую посмотреть в документации, которая находится в скачанном архиве сайта blogprogram.ru - там описаны в понятном языке методы и свойства работы с PDF." );
$pdf->Ln( 12 );
$pdf->SetTextColor(0, 0, 0); //черный
$pdf->Write( 5, "Для вывода текста хорошие методы Write и по хуже Cell (зато его можно ставить по центру)" );

// Создаем строку заголовков
$pdf->SetFont( 'TahomaMyBold', 'B', 15 );

//Значения каждого столбца
$data = array(
array(7840),
array(19310),
array(15110),
array(20650),
array(12650)
);

//Названия столбцов
$rowLabels = array( "Phantom 3", "Spark", "Mavic Pro", "Osmo", "Phantom 4" );

//Вычисляем масштаб по оси X
$xScale = count($rowLabels) / ( $chartWidth - 40 );

//Вычисляем масштаб по оси Y
$maxTotal = 0;

foreach ( $data as $dataRow ) {
$totalSales = 0;
foreach ( $dataRow as $dataCell ) $totalSales += $dataCell;
$maxTotal = ( $totalSales > $maxTotal ) ? $totalSales : $maxTotal;
}

//Вычисляем максимальный ограничитель по высоте Y оси
//остаток от деления, например 0.23
//$maxTotalY1 = $maxTotal/$chartYStep - floor($maxTotal/$chartYStep);
//if($maxTotalY1 > 0) { $maxTotalY = floor($maxTotal/$chartYStep)*$chartYStep + $chartYStep; }
//else { $maxTotalY = floor($maxTotal/$chartYStep)*$chartYStep; }

$yScale = $maxTotal / $chartHeight;

// Вычисляем ширину столбца
$barWidth = ( 1 / $xScale ) / 1.5;

// Добавляем оси:
$pdf->SetFont( 'TahomaMy', '', 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' );
}

// Ось 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 );
}

//Добавляем подписи осей
$pdf->SetFont( 'TahomaMyBold', 'B', 12 );
$pdf->SetXY( $chartWidth / 2 + 20, $chartYPos + 8 );
$pdf->Cell( 30, 10, 'Товары', 0, 0, 'C' );
$pdf->SetXY( $chartXPos + 7, $chartYPos - $chartHeight - 12 );
$pdf->Cell( 20, 10, 'Цена', 0, 0, 'R' );

//Создаем столбцы графика
$xPos = $chartXPos + 40;
$bar = 0;

//Вычисляем суммарное значение для продукта
foreach ( $data as $dataRow ) {
$totalSales = 0;
foreach ( $dataRow as $dataCell ) $totalSales += $dataCell;

//Выводим каждый столбец
$colourIndex = $bar % count( $chartColours );
$pdf->SetFillColor( $chartColours[$colourIndex][0], $chartColours[$colourIndex][1], $chartColours[$colourIndex][2] );
$pdf->Rect( $xPos, $chartYPos - ( $totalSales / $yScale ), $barWidth, $totalSales / $yScale, 'DF' );
$xPos += ( 1 / $xScale );
$bar++;
}

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

Код достаточно сложный для понимания, но я постарался его упростить, подписав выше настройки для построения графика. Если вы будете разбираться со скриптом, в течении часа должны разобраться, как все устроено.

Чтобы создать новый столбец на графике, надо в массиве $data добавить новый массив, а в $rowLabels еще одну подпись. Удаление столбцов осуществляется в обратной последовательности.

Последнее, на что я хотел бы обратить внимание - это работа с таблицами в PDF. Для этого я создал отдельную тему с использованием специального плагина.

| | PDF + PHP - создание графиков. Часть 2 | За счет библиотеки FPDF на PHP можно создавать не только простые документы с картинками, таблицами и текстом, но и целые графики. Конечно, график можн | https://blogprogram.ru/wp-content/uploads/2018/01/877-131x131.jpg