TCPDF是用於生成PDF文檔的類型
packages地址:https://packagist.org/packages/tecnickcom/tcpdf
github地址:https://github.com/tecnickcom/TCPDF
官方Demo地址:https://tcpdf.org/examples/
注意:目前這個庫的新版本也在開發中,但目前沒完善
新庫地址:https://github.com/tecnickcom/tc-lib-pdf
安裝
composer require tecnickcom/tcpdf
基本設置
創建對象
由於是用composer 安裝,自動導入類,所以不需require_once 如果其他方式需要導入
//創建對象
$orientation = 'P';
$unit = 'mm';
$format = 'A4';
$unicode = true;
$encoding = 'UTF-8';
$diskcache = false;
$pdfa = false;
$pdf = new TCPDF($orientation, $unit, $format, $unicode, $encoding, $diskcache, $pdfa);
參數說明
-
$orientation
紙張方向、取值有 'P':豎向、‘L’:橫向 -
$unit
計量單位 如:cm、mm 文檔制作過程中坐標單位 -
$format
文檔格式 'A4'、'A3'等 打印紙大小格式 -
$unicode
TRUE表示輸入文本為unicode(默認為TRUE)
-
$encoding
字符編碼 固定寫 'UTF-8' -
$diskcache
棄用功能
-
$pdfa
(整數)如果不是false,將文檔設置為PDF/A模式,良好版本(1或3)
設置文檔的基本參數
這些都可以不用去設置,全部為空也行
//工具
$pdf->SetCreator(PDF_CREATOR);
//作者
$pdf->SetAuthor('Potatog');
//標題
$pdf->SetTitle('基礎使用樣例');
//主題
$pdf->SetSubject('');
$pdf->SetKeywords('');
文檔保存設置
//直接瀏覽器下載
$pdf->Output('demo.pdf', 'D');
//保存到文件
$pdfcontent = $pdf->Output('demo.pdf', 'S');
Output函數參數說明:
$name
名字(輸出到瀏覽器和保存文件的名字)
$dest:
I:將文件內聯發送到瀏覽器(默認),也就是文件的字符流輸出。
D:發送到瀏覽器並強制下載一個文件名。
F:保存到本地服務器文件,文件名由名稱指定。
以字符串形式返回文檔(名稱被忽略)。
FI:相當於F + I選項
FD:相當於F + D選項
E:以base64 mime多部分郵件附件的形式返回文檔(RFC 2045)
頁面布局設置
一、頁邊距
$PDF_MARGIN_LEFT = 5;
$PDF_MARGIN_TOP = 30;//留給頁眉的空間
$PDF_MARGIN_RIGHT = 5;
$pdf->SetMargins($PDF_MARGIN_LEFT, $PDF_MARGIN_TOP, $PDF_MARGIN_RIGHT);
二、頁眉、頁腳
和設置字體一樣,頁眉頁腳設置后會對之后的所有頁有效
1、頁眉
//頁眉logo
$PDF_HEADER_LOGO = __DIR__."/image/logo.png";
//logo寬度
$PDF_HEADER_LOGO_WIDTH = 15;
//設置頁眉字體
$pdf->setHeaderFont(Array('stsongstdlight', '', '10'));
$PDF_HEADER_TITLE = "土豆剛(Potatog)";
$PDF_HEADER_STRING = "PDF生成示例\n基礎demo";
//頂部標題顏色
$headerColor = array(254,0,0);
//頁眉線條顏色
$headerLineColor = array(0,0,255);
$pdf->SetHeaderData($PDF_HEADER_LOGO, $PDF_HEADER_LOGO_WIDTH, $PDF_HEADER_TITLE, $PDF_HEADER_STRING, $headerColor, $headerLineColor);
如果不顯示頁眉
$pdf->setPrintHeader(false);
2、頁腳
//頁腳字體顏色 頁碼
$footerColor = array(254,0,0);
//頁腳線條顏色
$footerLineColor = array(0,0,255);
$pdf->setFooterData($footerColor, $footerLineColor );
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
$pdf->setPrintFooter(true); //頁面底部橫線 false取消
效果圖
有時候為了方便,可以顯示坐標,網格
//坐標
$pdf->SetFont('stsongstdlight', '', 5, '', true);
for ($x = 5;$x < 205; $x += 5)
{
$pdf->Text($x, 0,".".$x);
}
for ($y = 5;$y <= 270; $y += 5)
{
$pdf->Text(0, $y,$y.".");
}
//網格線
$pdf->SetFont('stsongstdlight', '', 5, '', true);
for ($x = 5;$x < 205; $x += 5)
{
for ($y = 5;$y <= 270; $y += 5)
{
$pdf->Text($x, $y,".");
}
}
排版設置
一、單元格控制文本對齊
看效果
<?php
//引入工具
require_once '../tcpdf/tcpdf.php';
//新建一個PDF文檔
//L 橫排 P豎排
$orientation='P';
$unit='mm';
$format='A4';
$unicode=true;
$encoding='UTF-8';
$diskcache=false;
$pdfa=false;
$pdf = new TCPDF($orientation, $unit, $format, $unicode, $encoding, $diskcache, $pdfa);
//文檔整體的邊距 頁眉與頁腳 在邊距里面
$PDF_MARGIN_LEFT = 5;
$PDF_MARGIN_TOP = 5;
$PDF_MARGIN_RIGHT = 5;
$pdf->SetMargins($PDF_MARGIN_LEFT, $PDF_MARGIN_TOP, $PDF_MARGIN_RIGHT);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->AddPage();
//坐標
$pdf->SetFont('stsongstdlight', '', 5, '', true);
for ($x = 5;$x < 205; $x += 5)
{
$pdf->Text($x, 0,".".$x);
}
for ($y = 5;$y <= 270; $y += 5)
{
$pdf->Text(0, $y,$y.".");
}
// //網格線
$pdf->SetFont('stsongstdlight', '', 5, '', true);
for ($x = 5;$x < 205; $x += 5)
{
for ($y = 5;$y <= 270; $y += 5)
{
$pdf->Text($x, $y,".");
}
}
$yahei = TCPDF_FONTS::addTTFfont(__DIR__.'/font/Microsoft Yahei.ttf', 'TrueTypeUnicode', '', 96);
$pdf->SetFont($yahei, '', 12, '', true);
$pdf->Text(10, 10,"以下cell將會以此內容坐標參考");
$pdf->Ln(10);//與上一個元素的Y坐標的距離(通常來設置那些不能設置 坐標的元素)
$w = 0;//單元格寬度,如果為0 則為100%寬度
$h = 30;//單元格的高度 如果為0 則為一行文本的高度
$txt = '這里有內這里有這里這里有內容這里有2里這里有內內4這里有內容';
$border =1;//0 無邊框 1 有邊框
$ln = 1;
$align = 'R';//單元格中的內容水平 對齊方式 對齊方式 L:左對齊 R:右對齊 C:居中垂直
$fill = false;
$link = '';
$stretch = 0;//0.如果字體超過單元格寬度,溢出。1.如果內容超過單元格寬度,則會縮小字體寬度,、2.將字體寬度縮放,以至於填滿單元格寬度,3, 字體超過單元格寬度將字體重復填寫在此行,4.是文本能填充慢一行,兩邊對齊
$ignore_min_height = false;
$calign = 'T';//單元格與上一個元素(或者坐標設定)的對齊方式 T:頂部對齊對方頂部, B:底部對齊對方底部 C中間對齊對方中間
$valign = 'B';//單元格中的內容垂直對齊方式 對齊方式 T:靠頂部 B:考底部 C:居中垂直
$pdf->Cell($w, $h, $txt, $border, $ln, $align, $fill, $link, $stretch, $ignore_min_height, $calign, $valign);
$pdf->Ln(10);//與上一個元素的Y坐標的距離(通常來設置那些不能設置 坐標的元素)
$pdf->Cell(0, 0, 'TEST CELL STRETCH: scaling', 1, 1, 'C', 0, '', 1);
$pdf->Cell(0, 0, 'TEST CELL STRETCH: scaling', 1, 1, 'C', 0, '', 1);
//直接輸入到瀏覽器
$pdf->Output('demo.pdf', 'I');
二、使用html控制內容
效果
源碼
<?php
//引入工具
require_once 'tcpdf/tcpdf.php';
//新建一個PDF文檔
//L 橫排 P豎排
$orientation='P';
$unit='mm';
$format='A4';
$unicode=true;
$encoding='UTF-8';
$diskcache=false;
$pdfa=false;
$pdf = new TCPDF($orientation, $unit, $format, $unicode, $encoding, $diskcache, $pdfa);
$pdf->AddPage();
$html = <<<EOD
<div style="background-color:#CC0000;color:#ffffff;font-size:20px;"><span>控制字體背景,控制div寬度讓文本自動換行,div背景顏色,字體大小 自動換換動換行自動換行</span><br/><a href="http://www.baidu.com" target="_blank">鏈接</a></div>
EOD;
//如果要對html指定 寬度 writeHTMLCell更方便
$pdf->writeHTMLCell(100, 0, 0, 50, $html, 0, 1, 0, true, '', true);
$html = <<<EOD
<div style="background-color:#CC00CC;color:#ffffff;font-size:20px;"><span>控制字體背景,控制div寬度讓文本自動換行,div背景顏色,字體大小 自動換換動換動換換動換動換換動換動換換動換動換換動換動換換動換行自動換行</span><br/><a href="http://www.baidu.com" target="_blank">鏈接</a></div>
EOD;
//如果要對html指定 寬度 writeHTMLCell更方便
$pdf->writeHTMLCell(100, 0, 100, 50, $html, 0, 1, 0, true, '', true);
$html = <<<EOD
<div style="border:1px solid red;background-color:#CCCC00;color:#ffffff;font-size:20px;text-align:right;">你好</div>
EOD;
//如果要對html指定 寬度 writeHTMLCell更方便
$pdf->writeHTMLCell(100, 0, 0, 120, $html, 0, 1, 0, true, '', true);
//直接輸入到瀏覽器
$pdf->Output('demo.pdf', 'I');
字體設置
設置字體
工具包自帶一些字體,有些字體不支持中文,所以中文會出現亂碼
關於頁眉 中文 亂碼 需要到 tcpdf/config/tcpdf_config.php 中配置
define ('PDF_FONT_NAME_MAIN', 'stsongstdlight');
define ('PDF_FONT_NAME_DATA', 'stsongstdlight');
或者使用 $pdf->setHeaderFont(Array('stsongstdlight', '', '10'));
讓其支持中文的字體
也可以使用,這個支持中文
$pdf->SetFont('stsongstdlight', '', 20);
如果要自定義(新增)字體
$yahei = TCPDF_FONTS::addTTFfont(__DIR__.'/font/Microsoft Yahei.ttf', 'TrueTypeUnicode', '', 96);
這樣工具包會保存這個字體,並返回一個用來引用該字體的字符串$yahei,然后就可以設置字體了
通常在使用文字時,都是需要指定文字的
字體、粗體、大小:
$pdf->SetFont($yahei, 'B', 10, '', true);
$pdf->SetFont('microsoftyahei', 'B', 10, '', true);
顏色:
$pdf->SetTextColor(255, 255, 0);
陰影:
$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.5, 'depth_h'=>0.5, 'color'=>array(0,196,196), 'opacity'=>0.
圖片設置
$file = "image/logo.png";
$x='';
$y='';
$w=50;
$h=50;
$type='';
$link='';
$align='';
$resize=false;
$dpi=300;
$palign='';
$ismask=false;
$imgmask=false;
$border=0;
$fitbox=false;
$hidden=false;
$fitonpage=false;
$alt=false;
$altimgs=array();
$pdf->Image($file, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, $ismask, $imgmask, $border, $fitbox, $hidden, $fitonpage, $alt, $altimgs);
使用Demo
一.使用html的方式輸出pdf,並訪問讓瀏覽器直接下載
中文會有問題
Route::any('pdf3', function (){
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
//設置默認的等寬字體
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
//定義左、上、右頁邊距。
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
//設置自動分頁符
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
//設置圖片比例
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
//設置字體
$pdf->SetFont('helvetica', '', 9);
//添加一個頁面
$pdf->AddPage();
// 要寫入的html內容
$html = '<h1>html test</h1><img src="/uploads/qrcode/1594350351.png"/>';
//輸出html內容
$pdf->writeHTML($html, true, 0, true, 0);
//重置指向頁碼,指向最后一頁
$pdf->lastPage();
//關閉並輸出PDF文檔
$pdf->Output('test.pdf', 'D');
});
效果
二.使用html的方式輸出pdf,並訪問讓瀏覽器直接下載(支持中文)
Route::any('pdf3', function (){
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
//設置默認的等寬字體
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
//定義左、上、右頁邊距。
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
//設置自動分頁符
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
//頁面頭部橫線 false取消
$pdf->setPrintHeader(false);
//頁面底部橫線 false取消
$pdf->setPrintFooter(true);
//設置圖片比例
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
//設置字體
//設置 東亞字體的(比如簡體/繁體中文、日文等等)
$pdf->SetFont('stsongstdlight', '', 20);
//添加一個頁面
$pdf->AddPage();
// 要寫入的html內容
$html = '<h1 style="color: red">html 中文測試 test</h1><img src="/uploads/qrcode/1594350351.png"/>';
//輸出html內容
$pdf->writeHTML($html, true, 0, true, 0);
//重置指向頁碼,指向最后一頁
$pdf->lastPage();
//關閉並輸出PDF文檔 直接數據中文會被過濾 可換種方式保存到本地,再重新用tp輸出
$pdf->Output('中文 文本test aa.pdf', 'D');
});
效果
使用注意事項
如果使用writeHTML寫入
*允許保留一些HTML格式(有限的支持)。< br / >
*重要提示:HTML必須被很好地格式化-試着在提交之前用一個像HTML- tidy這樣的應用程序清理它。
*支持的標簽有:a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul
*注意:所有HTML屬性必須用雙引號括起來。
因為tcpdf 不是所有css屬性都支持,所以如果需要高度還原html到pdf,還是使用phpwkhtmltopdf庫比較好
github:https://github.com/mikehaertl/phpwkhtmltopdf
package:https://packagist.org/packages/mikehaertl/phpwkhtmltopdf