需求描述:根据订单通过模板合同生成新的PDF合同通过e签宝签约后转为图片给用户下载。

  需求整理:

    1.如何生成PDF文件:使用TCPDF扩展生成。思考:

      ⑴为了方便将模板中的固定占位符替换为订单中的内容,使用静态html页面保存合同模板的方式保存

      ⑵使用TCPDF将html转换为pdf文档,可以尽量保证合同格式的一致性

    2.将生成的PDF合同通过e签宝的签约流程进行图章签署。具体流程忽略:对比e签宝签约流程

    3.将签约后的新PDF合同转换为图片。思考:

      ⑴使用php的Imagick扩展实现(坑之所在)

  实现流程:

    1.安装TCPDF扩展,这个都是原生的PHP代码库比较简单,依赖composer。在要安装的目录命令行直接敲:

  1. composer require smalot/pdfparser

    2.安装Imagick扩展,这个流程比较多。可以参考下面链接(感谢感谢):

    https://www.cnblogs.com/jinxiblog/p/8053008.html  --windows环境安装(我是windows开发环境,使用这个没毛病)

    https://www.osyunwei.com/archives/5327.html    --linux环境安装(没测试过,留给以后测试)

    https://blog.csdn.net/webben/article/details/64125470    --linux环境安装(没测试过,留给以后测试)

    3.第一个坑,Imagick装好就行了吗?并不然,网上找了很多资料后表面Imagick的运行机制大概是php通过Imagick扩展调用本机安装的Imagemagic提供的接口来处理图片,另外如果你要readImage的是一个PDF文件那么还有一个前提就是Imagemagic应用本身还会调用ghostscript这个玩意。

因为我们的需求是将PDF转换为图片而不是普通的图片文件处理,所以ghostscript也是我们必须要安装的。linux下同理。如果没安装的话会出现诸如下面的错误:

  1. Postscript delegate failed `/Uploads/Download/2016-09/57d0fb5b3612d.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/664

  看看Imagick下面官方说明:

    4.安装ghostscript,官网上根据自己的环境下载不同安装包,如果phpinfo()中的php是X86的话记得要选32位的安装包下载,装完后记得重启。本人重启了n次才突然间成功

    https://www.ghostscript.com/download.html    --下载链接

    5.到这里基本的依赖已经安装完毕,贴下本地实验代码如下:

  1. require_once 'vendor/autoload.php';

  2. //PDF文件生成
  3. $tcpdf = new TCPDF();
  4. $tcpdf->SetCreator('Hello');
  5. $tcpdf->SetAuthor('walter');
  6. $tcpdf->SetTitle('test pdf');
  7. $tcpdf->SetSubject('subject');
  8. $tcpdf->SetKeywords('walter,pdf,php');
  9.  
  10. $tcpdf->setHeaderData('logo_example.png',20,'标题','子标题',array(0,64,255),array(0,64,128));
  11. $tcpdf->setFooterData(array(0,64,0),array(0,64,128));
  12.  
  13. $tcpdf->setHeaderFont(['stsongstdlight', '', '10']);    //设置字体
  14. $tcpdf->setFooterFont(['helvetica', '', '8']);       //设置字体 
  15.  
  16. $tcpdf->SetDefaultMonospacedFont('courier');        //设置字体
  17.  
  18. $tcpdf->SetMargins(15,27,15);
  19. $tcpdf->setHeaderMargin(5);
  20. $tcpdf->setFooterMargin(10);
  21.  
  22. $tcpdf->SetAutoPageBreak(true,25);
  23.  
  24. $tcpdf->setImageScale(1.25);
  25.  
  26. $tcpdf->setFontSubsetting(true);
  27.  
  28. $tcpdf->SetFont('stsongstdlight','',14);    //设置字体
  29. //
  30. $tcpdf->AddPage();
  31.  
  32. $html = file_get_contents('contract.html');
  33.  
  34. $tcpdf->writeHTMLCell(0,0,'','',$html,0,1,0,true,'',true);    //写入html
  35. $tcpdf->Output(__DIR__.DIRECTORY_SEPARATOR.'contract.pdf','F');  //生成pdf文件并保存到本地
  36.  
  37. //pdf合并转换一张图片
  38. function pdf2png($from_path,$target_path){
  39. try{
  40. $img = new Imagick();
  41. $img->setCompressionQuality(100);
  42. $img->setResolution(120,120);
  43. $img->readImage($from_path);
  44.  
  45. $canvas = new Imagick();
  46. $imgNum = $img->getNumberImages();
  47.  
  48. foreach ($img as $k => $sub){
  49. $sub->setImageFormat('png');
  50. $sub->stripImage();
  51. $sub->trimImage(0);
  52. $width = $sub->getImageWidth() + 10;
  53. $height = $sub->getImageHeight() + 10;
  54. if ($k + 1 == $imgNum) $height += 10;
  55. $canvas->newImage($width,$height,new ImagickPixel('white'));
  56. $canvas->compositeImage($sub,Imagick::COMPOSITE_DEFAULT,5,5);
  57. }
  58.  
  59. $canvas->resetIterator();
  60.  
  61. $canvas->appendImages(true)->writeImage($target_path);
  62. return true;
  63. }catch (Exception $e){
  64. echo $e->getMessage();
  65. echo $e->getTraceAsString();
  66. return false;
  67. }
  68.  
  69. //pdf文件转换为一张图片
  70. $pdf_path = __DIR__.DIRECTORY_SEPARATOR.'contract.pdf';
  71.  
  72. if (is_file($pdf_path)){
  73. var_dump(pdf2png($pdf_path,__DIR__.DIRECTORY_SEPARATOR.'contract.png'));
  74. }else{
  75. echo 'file not exist';
  76. }

  

    至此本地测试没毛病一切OK

             PDF文件                                  生成的图片         

    

    6.正式服务器上测试(最大的坑来了),生成PDF文件一切OK,到了转换图片的时候就:

      

    一遍空白!!!!!!神坑

    一遍度娘乱七八糟的资料后发现根本没有这方面的资料。偶尔在百度提问里面看到有人又类似说法是,Imagick->readImage的时候中文编码的问题。虽然不太对但是在万能的stackoverflow有人提过类似的问题

    

    经过不停的踩坑发现是ghostscript这个坑货的问题,在linux下安装ghostscript的时候没有对应生成cidfmap文件来支持各种字体,在windows环境安装的时候已经在lib目录下面生成了这个配置文件。所以需要在linux环境下新建一个cidfmap文件并且将我们要支持的字体放到linux下来:

    http://www.voidcn.com/article/p-fdqtdali-rx.html    --参考链接

    这样就行了吗?还没有.......看看代码里面我生成pdf时设置了什么字体?这些是adobe公司默认的字体,但是比较不统一。你代码里面要设什么字体就得把对应的ttf字体文件放到linux下重新对应cidfmap的字体格式设置一遍。

  1. $tcpdf->SetFont('stsongstdlight','',14);
  2. $tcpdf->setHeaderFont(['stsongstdlight', '', '10']);
  3. $tcpdf->setFooterFont(['helvetica', '', '8']);
  4.  
  5. $tcpdf->SetDefaultMonospacedFont('courier');

  为了避免麻烦我在windows的字体库里面拿了一个simhei字体(简体字)放到linux下配置好,最后发现这个字体不是TCPDF扩展内置的(坑)。还好tcpdf库提供了一个添加字体的脚本,具体路径如下:

    把要新增的simhei字体放进来命令行输入如下命令:

  1. #\tools>php ./tcpdf_addfont.php -b -i simhei.ttf
  2.  
  3. >>> Converting fonts for TCPDF:
  4. *** Output dir set to D:\phpStudy2016\WWW\mugua\muguaadmin\public\task\pdf\vendo
  5. r\tecnickcom\tcpdf/fonts/
  6. +++ OK : D:\phpStudy2016\WWW\mugua\muguaadmin\public\task\pdf\vendor\tecnickco
  7. m\tcpdf\tools\simhei.ttf added as simhei
  8. >>> Process successfully completed!

 

恭喜你,爬坑完毕字体终于可以正常使用,生成的图片再也不是空白了

PHP生成PDF并转换成图片爬过的坑的更多相关文章

  1. Ghostscript 将PDF文件转换成PNG图片 问题一二

    由于项目需求,需要将原来的PDF文档转换成图片文件,在网上找了一些PDF转图片的方法:测试了几个后,都有这样或那样的问题 1.PDFLibNet.dll,这个类型最初还是挺好用的,能转图片和HTML, ...

  2. 批量将网页转换成图片或PDF文档技巧分享

    工作中我们有时要将一些批量的网页转换成图片或者PDF文档格式,尽管多数浏览器具有滚动截屏或者打印输出PDF文档功能.可是假设有几十上百张网页须要处理,那也是要人命的.所以我一直想找一款可以批量处理该工 ...

  3. C#技术分享【PDF转换成图片——13种方案】(2013-07-25重新整理)

    原文:C#技术分享[PDF转换成图片--13种方案](2013-07-25重新整理) 重要说明:本博已迁移到 石佳劼的博客,有疑问请到 文章新地址 留言!!! 写在最前面:为了节约大家时间,撸主把最常 ...

  4. C#技术分享【PDF转换成图片——11种方案】

    1.[iTextSharp.dll],C# 开源PDF处理工具,可以任意操作PDF,并可以提取PDF中的文字和图片,但不能直接将PDF转换成图片. DLL和源码 下载地址:http://downloa ...

  5. 如何用ABBYY把PDF如何转换成HTML

    将PDF转换成HTML网页格式,是快速打造专业级网站的方法之一.当用户找到了非常详实的PDF资料,打算将之制作成为网页格式时,如果重新开发往往需要耗费大量的时间,可是又不知道怎么样才可以将PDF文件转 ...

  6. Gson字符串编码,字符串转换成图片保存,二进制转换成图片保存

    import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import ...

  7. Android View转换成图片保存

    package zhangphil.viewtoimage; import java.io.File;import java.io.FileOutputStream; import android.o ...

  8. 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件

    PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...

  9. 怎样将PDF文件转换成Excel表格

    PDF文件怎样转换成Excel表格呢?因为很多的数据信息现在都是通过PDF文件进行传输的,所以很多时候,信息的接受者都需要将这些PDF文件所传输的数据信息转换成Excel表格来进行整理,但是我们应该怎 ...

随机推荐

  1. Python 创建递归文件夹

    # 创建递归文件夹 def createfiles(filepathname): try: os.makedirs(filepathname) except Exception as err: pri ...

  2. BBS论坛(十二)

    12.1.图形验证码生成 (1)utils/captcha/init.py import random import string # Image:一个画布 # ImageDraw:一个画笔 # Im ...

  3. Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥

    文/沉默王二 曹操在<短歌行>中为杜康酒打过一个价值一亿个亿的广告——“何以解忧,唯有杜康”,我替曹操感到惋惜的是他本人并不会收到这笔不菲的代言费.想一想,要是三国时期的明星人物们有这个代 ...

  4. 死磕 java集合之TreeMap源码分析(一)- 内含红黑树分析全过程

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历. 继承体系 Tr ...

  5. linux系统安全设置策略

    1.检查是否设置口令长度至少8位,并包括数字,小写字符.大写字符和特殊符号4类中至少2类. 在文件/etc/login.defs中设置 PASS_MIN_LEN 不小于标准值 修改/etc/pam.d ...

  6. Java基础8:深入理解内部类

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  7. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境

    写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...

  8. IDEA搭建Spring Boot项目

    所需工具 新建项目 创建一个login控制器 写入两个注释 import导入项会自动添加@RestController@RequestMapping(value = "/login" ...

  9. 简单的SQL注入之3

    Topic Link http://ctf5.shiyanbar.com/web/index_3.php 1)测试正确值submit:1 测试目标和对象要明确: 2)单引号测试(判断存在字符型注入&a ...

  10. Spring Boot 2.x(九):遇到跨域不再慌

    什么是跨域 首先,我们需要了解一下一个URL是怎么组成的: // 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 http: + // + www.baidu.com + :8080/ ...