当前位置: 首页 > 后端技术 > PHP

PHP--------wkhtmltopdf的使用方法

时间:2023-03-29 16:58:09 PHP

1.问题描述需要用php将html生成pdf。找到了一个php扩展,HTML2PDF,只能生成一些简单的HTML代码,复杂的HTML+css无法生成。在网上找到了强大的wkhtmltopdf。2、wkhtmltopdf简介工具全称是“wkhtmltopdf”;它是一个命令行工具,使用QtWebKit引擎进行渲染,可以将html文档转换成pdf文档或图片(image)。(强调:是一个“命令行工具”)支持多平台,可以在win、linux、osx等系统下运行。3、wkhtmltopdf安装(linux环境)安装步骤很简单,这里不再赘述,具体请参考(https://blog.csdn.net/assasin...://blog.csdn.net/qq_26562641/article/details/72875344),里面写的很详细问题一:测试后发现生成的pdf文件不支持中文(老外写的软件,这个没办法)?答:自己下载中文字体,安装到linux的字体库中。具体方法可以参考(https://yq.aliyun.com/ziliao/269854),字体可以在本站下载(http://www.font5.com.cn/font_download.php?id=150&part=1237886897)***下面是重点场景!!!!!!!***三。php运行wkhtmltopdf方法:1.一种是exec执行2.扩展包运行(推荐,本文介绍这种方法,由于我们使用php语言开发,所以选择了composer包中的mikehaertl/phpwkhtmltopdf)4.具体使用mikehaertl/phpwkhtmltopdf包1、包安装(composer很方便)2、具体使用请参考包的使用说明书3、使用中的问题:q.测试在本地环境下可以正常下载,但是在linux环境下不行?需要删除a.php.ini中禁用的函数proc_open()。如果不行(去掉disabled函数)去掉q.php.ini中的disabled函数后,还是不行。更糟糕的是无法访问服务器(解决方案:清除浏览器缓存)?A。说到这个问题,科普一下proc_open()---php的内置函数proc_open():执行一条命令,打开文件指针进行输入/输出。wkhtmltopdf使用该命令生成&写入pdf文件(生成&写入是基于管道命令),所以如果输入&输出其中一个出现问题,会导致管道无法关闭,导致管道堵塞,从而导致停机。查看代码(取自:vendor/mikehaertl/php-shellcommand/Command.php文件总的执行方法片段):$process=proc_open($command,$descriptors,$pipes,$this->procCwd,$this->procEnv,$this->procOptions);if(is_resource($process)){if($this->_stdIn!==null){if(is_resource($this->_stdIn)&&in_array(get_resource_type($this->_stdIn),array('文件','stream'),true)){stream_copy_to_stream($this->_stdIn,$pipes[0]);}else{fwrite($pipes[0],$this->_stdIn);}fclose($pipes[0]);}$this->_stdOut=stream_get_contents($pipes[1]);$this->_stdErr=stream_get_contents($pipes[2]);fclose($管道[1]);fclose($管道[2]);$this->_exitCode=proc_close($process);如果($this->_exitCode!==0){$this->;_error=$this->_stdErr?$this->_stdErr:“失败且没有错误消息:$command”;返回假;}}else{$this->_error="无法运行命令$command";返回假;}代码中的$descriptors指定包含要发送给流程的管道的描述信息。第一个元素是描述符类型,第二个元素是描述符的选项。有效类型是:管道(第二个元素可以是:r将管道的读取端传递给进程,w将管道的写入端传递给进程)和文件(第二个元素是文件名)。表示实际文件描述符的流资源类型(例如:打开的文件、套接字端口、STDIN)。但是我在实际调试中发现,我在本地调试时,参数的写入端是w,而linux中的写入端是r,这就是宕机的罪魁祸首。代码分析:$descriptors=array(1=>array('pipe','w'),2=>array('pipe',$this->getIsWindows()?'a':'w'),);publicfunctiongetIsWindows(){returnstrncasecmp(PHP_OS,'WIN',3)===0;}put2=>array('pipe',$this->getIsWindows()?'a':'w'),="改为2=>array('pipe','a'),问题解决.