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生成示例
基础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取消

效果图
img

有时候为了方便,可以显示坐标,网格

//坐标
$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,".");
    }
}

img

排版设置

一、单元格控制文本对齐

看效果
img

<?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控制内容

效果

img

源码

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

字体设置

img

设置字体

工具包自带一些字体,有些字体不支持中文,所以中文会出现乱码

关于页眉 中文 乱码  需要到  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.

图片设置

img

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

效果

image-20200813135616215

二.使用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');
});

效果

image-20200813141016886

使用注意事项

如果使用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

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

原文地址:https://www.cnblogs.com/makalochen/p/13496958.html