Tcpdf不使用css来实现线上合同和签章,图片悬浮

2019-05-07 00:04:04

参考链接 Tcpdf不使用css来实现线上合同和签章,图片悬浮

前言:以前虽然有了解过Tcpdf的用法,但是没有实际的应用过,最近在用tcpdf的时候发现对css支持很有限,使的如果想实现类似html的种种效果都很难,而我这次要做的就是

图片悬浮在文字上方形成类似水印或者盖章的效果。


由于Tcpdf是由歪果仁写的,所以中文的手册也没有,导致虽然这个工具好多年前就不更新了,国内网上目前类似的资料依然不是很多,

还好英语阅读水平比较过关,又响应开源精神,所以做一下分享,但是我希望大家不要做一个伸手党。另外请支持每个人的原创。下面进入正题


步骤一:下载tcpdf

    这里我就不给梯子了,自行百度,然后下载软件,布置好之后可以自己先看看里面给的例子,也许就能找到你想要的效果。这里省略部署,

不论你是tp还是yii或者别的什么请自行部署

步骤二:生成文件

    生成中文文件不乱码的解决方法网上很多我就不赘述了。这里需要注意几点

    1.生成的文件最好用css比较老的属性,而且最好图片不要用浮动等控制,很多效果都没有作用,

    2.文件如果是很长的文档,则需要手动进行断行,也就是</br>,原因是:因为生成pdf排版的时候出现如果文字刚好够一行多一点,Tcpdf会把整个行的一大部分放到

下一行,而不是最后几个字放到下一行(这里Tcpdf判断换行的逻辑很怪,如果你想看看效果你可以不加换行标签测试一下,一定惊喜)而出现如下图的效果:


    这里是一部分内容(未满行)

这里是另一部分内容。


步骤三:生成pdf预览

这里需要注意的是,

$pdf->Output($name, 'I');

其中如果输出为页面查看方式则为‘I’,如果想要直接下载则为:‘D’,如果想保存文件则为:‘F’

<?php

function review_pdf($html,$title) {

 

    vendor('Tcpdf.tcpdf');

    $pdf = new \Tcpdf(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

    // 设置打印模式

    $pdf->SetCreator(PDF_CREATOR);

    $pdf->SetAuthor('Nicola Asuni');

    $pdf->SetTitle($title);

    $pdf->SetSubject('TCPDF Tutorial');

    $pdf->SetKeywords('TCPDF, PDF, example, test, guide');

 

 

 

    // 是否显示页眉

    $pdf->setPrintHeader(false);

    // 设置页眉显示的内容

    $pdf->SetHeaderData('logo.png', 60, 'jr.fccfae.com', $title, array(0, 64, 255), array(0, 64, 128));

    // 设置页眉字体

    $pdf->setHeaderFont(Array('dejavusans', '', '12'));

    // 页眉距离顶部的距离

    $pdf->SetHeaderMargin('5');

    // 是否显示页脚

    $pdf->setPrintFooter(true);

    // 设置页脚显示的内容

    $pdf->setFooterData(array(0, 64, 0), array(0, 64, 128));

    // 设置页脚的字体

    $pdf->setFooterFont(Array('dejavusans', '', '10'));

    // 设置页脚距离底部的距离

    $pdf->SetFooterMargin('10');

    // 设置默认等宽字体

    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

    // 设置行高

    $pdf->setCellHeightRatio(1.2);

    // 设置左、上、右的间距

    $pdf->SetMargins('8', '8', '8');

    // 设置是否自动分页  距离底部多少距离时分页

    $pdf->SetAutoPageBreak(TRUE, '15');

    // 设置图像比例因子  1.3可以

    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

 

 

 

    if (@file_exists(dirname(__FILE__) . '/lang/eng.php')) {

        require_once(dirname(__FILE__) . '/lang/eng.php');

        $pdf->setLanguageArray($l);

    }

    $pdf->setFontSubsetting(true);

    $pdf->AddPage();

 

 

 

 

 

    $pdf->SetFont('STSongStdLight', '', 12, '', true);

 

//    $pdf->SetFont('helvetica', '', 14, true);

 

 

    $pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);

    //$pdf->MultiCell(0, 5, $html, 0, 'J', 0, 2, '', '', true, 0, false);

    $pdf->setPage(1);

    $pdf->Image('img/image_with_alpha.png', 50, 50, 100, '', '', 'http://www.tcpdf.org', '', false, 300);

    $name = time() . ".pdf";

 

 

    $pdf->Output($name, 'I');

}

?>

这里有两点比较重要 

1.如果要加图片,图片如果在下面就先调用

$pdf->Image();

如果是想要图片悬浮,则需要

先调用$pdf->writeHTMLCell();或者其他的比如MultiCell()    后调用$pdf->Image();

 

2.如果文件为多页,如果想要控制在某一页加图片,则需要在加图片前调用

$pdf->setPage(1); 

里面的1为第一页,按自己的需要添加。


  • 2019-08-14 14:27:35

    计算密集型和IO密集型

    在进行I/O操作的时候,是将任务交给DMA来处理,请求发出后CPU就不管了,在DMA处理完后通过中断通知CPU处理完成了。I/O操作消耗的cpu时间很少.

  • 2019-08-14 14:29:12

    浅谈nodejs和php

    现在,Web开发公司和开发人员可以选择多种技术栈来构建Web应用程序。早期网络发展,不同的技术被用于前端和后端开发。但是,随着Node.js的发布,布局发生了变化,因为它允许开发人员使用 JavaScript 编写后端代码。这最终催生了MEAN(MongoDB + Express +AngularJS + NodeJS )堆栈 web 开发框架,从前端到后端甚至是数据库(MongoDB -JSON)都使用 JavaScript。在 Node.js 之前,Web 开发通常是在 PHP 的帮助下完成的,因为它很容易与 HTML 集成,帮助开发人员立即构建动态网站。在这篇文章中,我们将比较 Node.js 和 PHP,看哪一个最适合当前的行业需求。

  • 2019-08-15 13:32:18

    Node.js是如何解决服务器高性能瓶颈问题的

    在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。要让Web应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件成本当然就上升了。

  • 2019-08-15 13:33:53

    nodejs的10个性能优化技巧

    在我接触JavaScript(无论浏览器还是NodeJS)的时间里,总是遇到有朋友有多线程的需求。而在NodeJS方面,有朋友甚至直接说到,NodeJS是单线程的,无法很好的利用多核CPU。那么我们在使用过程中,就要非常注意性能优化了

  • 2019-08-16 13:18:48

    使用ffmpeg进行ts切片并AES-128加密

    由于解密的key文件都是公开的,所以并不能算上完全加密,用户只要把你的key+m3u8里的ts切片文件全部下载,用ffmpeg还是能解,这时就要考虑url的key防止用户直接下载和盗链。 ​

  • 2019-08-18 22:22:54

    Error:error: unable to remove file: Permission denied

    JNI里写的C++增加了函数或修改了,如果此时是Debug模式下,而且还没退出程序,就出现这个Permission denied的提示。解决也很简单:就是退出App即可。如果退出无响应,直接拔usb,重新插上也可以

  • 2019-08-19 10:24:29

    浅析Express中的路由与应用模式

    Express是一个基于Node.js的轻量级web开发框架,具有体积小,使用灵活等特点。查看Express的源码,如果不计供使用的中间件,主体框架只有一千余行代码,非常简练。

  • 2019-08-19 15:50:17

    记录PHP的进程和线程理解

    线程是进程的一个执行流,线程不能分配系统资源,它是进程的一部分,比进程更小的独立运行的单位。 解释一下:进程有两个特性:一是资源的所有权,一个是调度执行(指令集),线程是调度执行中的一部分,是指进程执行过程的路径,也叫程序执行流。线程有时候也叫轻量级进程。