1. 程式人生 > 實用技巧 >tp5.1 使用 tcpdf庫 生成pdf

tp5.1 使用 tcpdf庫 生成pdf

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');
});

效果

參考:https://www.kancloud.cn/potatog/tcpdf/1358501