ایجاد خروجی PDF با پشتیبانی زبان فارسی

26 فروردین 1401

ایجاد خروجی PDF با پشتیبانی زبان فارسی

برای تولید فایل پی‌دی‌اف در زبان php کتابخانه‌های زیادی را آزموده‌ام که در این میان TCPDF را مناسب‌تر می‌دانم به دلایل زیر:

پشتیبانی از زبان فارسی و امکان راست به چپ
استفاده از css و فونت‌های دلخواه
افزودن تصاویر با فرمت‌های رایج
نمایش بارکدهای یک بعدی و دو بعدی
مدیریت هدر، پاورقی و شماره صفحه
خروجی مناسب جهت گزارش‌گیری و چاپ
و البته سایر امکانات بسیار آن!

برای شروع کار نیاز دارید بسته TCPDF را از گیت‌هاب یا «دانلود» همین مقاله دریافت کرده و مسیر زیر را به پروژه خود اضافه کنید.

<?php
require_once('tcpdf.php');
?>

فهرست مثال‌ها

1) مثال «Hello World»
2) افزودن فونت
3) نمایش Html و افزودن Style
4) تنظیمات Header و Footer
5) نمایش بارکد و qrcode
6) نمایش تصویر

1) مثال «Hello World»: در خطوط زیر ساده‌ترین شکل استفاده از این کتابخانه - یعنی ایجاد فایل PDF با متن «Hello World» - را نشان داده و پس از آن به بررسی قابلیت‌های پیشرفته‌تر خواهیم پرداخت. برای دیدن نتیجه و خروجی مثال‌ها به بخش «دمو»ی این مقاله مراجعه کنید.

<?php
require_once('tcpdf.php');
$pdf = new TCPDF();
$pdf->AddPage();
$res = "Hello World";
$pdf->writeHTML($res);
$pdf->Output('output.pdf', 'I');
?>

2) افزودن فونت: برای تغییر فونت هر قسمت از فایل پی‌دی‌اف و یا نمایش زبان فارسی، ابتدا لازم است مسیر فونت دلخواه را به برنامه معرفی و توسط SetFont آن را در پروژه خود تنظیم کنیم:

<?php
require_once('tcpdf.php');

$pdf = new TCPDF();
$pdf->AddPage();

$font_path 	= 'fonts/titr.ttf';	//مسیر فونت
$font_size 	= 16;			//اندازه فونت
$fontname 	= TCPDF_FONTS::addTTFfont($font_path, 'TrueTypeUnicode');
$pdf->SetFont($fontname, '', $font_size, '', false);

$res = "سلام دنیا";
$pdf->writeHTML($res);
$pdf->Output('output.pdf', 'I');
?>

3) نمایش Html و افزودن Style: مثال زیر را بررسی می‌کنیم و به عبارت ساده Hello World استایل می‌دهیم. همان‌طور که در خطوط زیر خواهید دید در متغیر $res کلاس myClass را تعریف کرده و سپس عبارت خود را به نمایش در می‌آوریم:

<?php
require_once('tcpdf.php');

$pdf = new TCPDF();
$pdf->AddPage();

$font_path 	= 'fonts/titr.ttf';
$font_size 	= 16;
$fontname 	= TCPDF_FONTS::addTTFfont($font_path, 'TrueTypeUnicode');
$pdf->SetFont($fontname, '', $font_size, '', false);

$res = "
<style>
	.myClass {
		color: #FF0000;
		font-family: 'titr';
		font-size: 35pt;
		text-align:right;
		direction:rtl;
	}
	img {width:100px;}
</style>
<div class="myClass">
	<img src=\"https://abdollahkaviani.ir/img/ak.png\" />
	<br/>سلام دنیا Hello World
<div>";
$pdf->writeHTML($res);
$pdf->Output('output.pdf', 'I');
?>

4) تنظیمات Header و Footer: به کمک دستورات $pdf->SetPrintHeader(false); و $pdf->SetPrintFooter(false); می‌توان هدر و فوتر - که به طور پیش‌فرض نمایش داده می‌شود - را مخفی کرد اما برای این‌که بتوانیم هدر، فوتر و شماره صفحه مورد نظر خود را داشته باشیم دستورات زیر را پیاده می‌کنیم:

<?php
require_once('tcpdf.php');

class MYPDF extends TCPDF {
		
	public function Header() {

		$fontname = TCPDF_FONTS::addTTFfont('fonts/titr.ttf', 'TrueTypeUnicode');
		$this->SetFont($fontname, '', 16, '', false);

		$header = "
			<style>
			.classHeader {border-bottom:1px solid #999;font-family: 'titr';color:#ff0000}
			</style>
			<table class=\"classHeader\">
				<tr>
					<td>ساخت خروجی PDF به کمک PHP</td>
				</tr>
			</table>";
		$this->setRTL(true);
		$this->writeHTMLCell(0, 10, 10, 10, $header);
	}

	public function Footer() {

		$footer = "
			<style>
			.classFooter {border-top:1px solid #999;text-align:left}
			</style>
			<table class=\"classFooter\">
				<tr>
					<td>".$this->getAliasNumPage()."/".$this->getAliasNbPages()."</td>
				</tr>
			</table>";
		$this->writeHTMLCell(0, 10, 10, 285, $footer);
	}
}

$pdf = new MYPDF();

$fontname = TCPDF_FONTS::addTTFfont('fonts/vazir.ttf', 'TrueTypeUnicode');
$pdf->SetFont($fontname, '', 11, '', false);

$res = "
<style>
	.table {color: #003300;font-family: 'vazir';font-size: 12pt;}
	th {background-color:#4682B4;color:#fff}
	td {border:1px solid #888;}
</style>

<table class=\"table\">
	<thead>
		<tr>
			<th>ردیف</th>
			<th>شرح</th>
			<th>مبلغ</th>
			<th>تعداد</th>
		</tr>
	</thead>
	<tbody>";

for($i=1;$i<=50;$i++)
	$res .= "
		<tr>
			<td>".$i."</td>
			<td>شرح</td>
			<td>2000</td>
			<td>1</td>
		</tr>";

$res .= "		
	</tbody>	
</table>";

$pdf->SetMargins(10, 34, 10);
$pdf->SetAutoPageBreak(TRUE, 30);
$pdf->AddPage('P', 'A4');
$pdf->setRTL(true);
$pdf->WriteHTML($res);

$pdf->Output('output.pdf', 'I');
?>

در بالا همان‌طور که ملاحظه می‌فرمایید یک کلاس به نام MYPDF نوشته‌ایم. این کلاس شامل دو تابع Header و Footer است و همانند مثال‌های قبلی می‌توان در آنها فونت و استایل تعریف کرد و سپس توسط دستور WriteHTML یا writeHTMLCell به نمایش درآورد.

دو تابع getAliasNumPage و getAliasNbPages به ترتیب شماره صفحه جاری و تعداد کل صفحات را بر می‌گردانند.

گام بعدی ما این است که به جای تولید آبجکت از TCPDF یک آبجکت از کلاسMYPDF بسازیم.

دستور SetMargins: حاشیه صفحه را تعیین می‌کند؛ به ترتیب چپ، بالا و راست.

دستور SetAutoPageBreak: مشخص می‌کنیم باقیمانده متن در چه فاصله‌ای از انتهای صفحه به صفحه بعد منتقل شود.

دستور AddPage: در این قسمت می‌توانیم مشخص کرد که صفحه خروجی ما چه اندازه‌ای داشته باشد؛ مثلا A4 یا A5 باشد و همین‌طور به صورت عمودی P یا افقی L ساخته شود.

دستور setRTL: این فرمان هم تعیین می‌کند که صفحه آیا راست به چپ باشد یا خیر.

5) نمایش بارکد و qrcode: نمایش بارکد خطی و دو بعدی نیز بسیار آسان و مطابق خطوط زیر است. همان‌طور که ملاحظه می‌کنید استایل، ابعاد، موقعیت و استاندارد بارکد و qrcode توسط توابع write1DBarcode (جهت ساخت بارکد یک بعدی) و write2DBarcode (جهت ساخت بارکد دو بعدی) قابل تعیین است:

<?php
require_once('tcpdf.php');
$pdf = new TCPDF();
$pdf->AddPage('L', 'A5');

//1D barcode
$style = array(
    'position' => '',
    'align' => 'C',
    'stretch' => false,
    'fitwidth' => true,
    'cellfitalign' => '',
    'border' => true,
    'hpadding' => 'auto',
    'vpadding' => 'auto',
    'fgcolor' => array(0,0,0),
    'bgcolor' => false,
    'text' => true,
    'font' => 'helvetica',
    'fontsize' => 8,
    'stretchtext' => 4
);
$pdf->write1DBarcode('1D Barcode', 'C39', '', 30, '', 35, 0.4, $style);

//2D barcode
$style = array(
	'border' => 1,
	'vpadding' => 'auto',
	'hpadding' => 'auto',
	'fgcolor' => array(0,0,0),
	'bgcolor' => false
);
$pdf->write2DBarcode('https://abdollahkaviani.ir', 'QRCODE,L', 115, 30, 35, 35, $style);

$pdf->Output('output.pdf', 'I');
?>

6) نمایش تصویر: چنانچه تمایل نداشته باشید تصاویر را مانند مثال شماره 3 و تگ <img> به اسناد خود اضافه کنید، به کمک تابع Image می‌توان تصویر را مستقیما با ابعاد و موقعیت مورد نظر درون صفحه بارگذاری کرد:

<?php
require_once('tcpdf.php');
$pdf = new TCPDF();
$pdf->AddPage();

$pdf->Image('images/15.jpg', 15, 15, 180, 160, 'JPG', 'https://abdollahkaviani.ir');

$pdf->Output('output.pdf', 'I');
?>

در پایان باید گفت در این مقاله تنها به معرفی توابع ضروری کتابخانه و کلیت کار با آن بسنده کرده‌ام و فایل زیپ شده‌ای که در قسمت دانلود قرار داده‌ام شامل کتابخانه TCPDF و تمامی مثال‌های فوق است. کافی است آن را از حالت فشرده خارج کرده و فایل index.php را در مرورگر خود باز کنید.

دیدگاه ها

Captcha
پیوست مقاله
همچنین بخوانید
تازه ترین دیدگاه ها
x