您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
uniapp、php生成pdf
发布时间:2024-01-10 23:03:25编辑:雪饮阅读()
-
这是一个伪命题,为什么是uniapp、php生成pdf?
- 接下来是咱的服务端生产环境ubuntu22:
- 整合php:
主要是因为这两个我都有权动,只不过这样反而导致目标不明确,大概浏览下uniapp相关资料,发现其实现不太符合咱的需求。咱的需求是不想看到网页页面,但是又是将网页转换为pdf给app端打开的。
那么选择了后端php生成,找了tcpdf、mpdf这两个库,或多或少有一些问题。即便能生成pdf,css的兼容性也是问题,样式变的是一塌糊涂。
后来想着我如果能直接给网页截图,尝试了wkhtmltopdf。仍然是有样式问题,无论截图还是直接生成pdf,wkhtmltopdf,这家伙既能截图也能生成pdf。
再次回到mpdf,主要是mpdf虽然也是不行,但就目前比较来说,更接近期待的目标。于是细看其文档。
文档中有这么一句话,提醒了我:
If you are looking for state of the art CSS support, mirroring existing HTML pages to PDF, use headless Chrome.
mPDF will still be updated to enhance some internal capabilities and to support newer versions of PHP, but better and/or newer CSS support will most likely not be implemented.
也就是说,它也不是最佳的,但是有更佳的,但确不是php的。并且推荐用chrome的命令行版本(即headless Chrome)。
(1)我首先在我的本地虚拟机centos7.6上的实践:
安装chrome:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum install google-chrome-stable_current_x86_64.rpm
安装字体解决中文乱码问题:
yum -y groupinstall Fonts
生成pdf:
google-chrome --headless --no-pdf-header-footer --disable-gpu --no-sandbox --pprint-to-pdf-no-header --print-to-pdf=/opt/1.pdf http://horse.admin.com/common/OrderInvoice/show?id=167
实际效果:
sudo dpkg -i google-chrome-stable_current_amd64.deb
如果有依赖问题的报错,则运行下行命令,然后再次重试:
sudo apt-get install -f
sudo dpkg -i google-chrome-stable_current_amd64.deb
同样的,解决中文乱码问题:
sudo apt-get install ttf-wqy*
$data = $this->request->param();
$fileUrl=$_SERVER["DOCUMENT_ROOT"]."/invoice/".$data["id"].".pdf";
@unlink($fileUrl);
$viewUrl=$_SERVER["REQUEST_SCHEME"]."://".$_SERVER["HTTP_HOST"]."/invoice/".$data["id"].".pdf";
if(is_file($fileUrl)){
$this->success("success",["orderInvoice"=>$viewUrl]);
}
$execErrorMessage="";
try{
$pdfHtmlUrl=$_SERVER["REQUEST_SCHEME"]."://".$_SERVER["HTTP_HOST"]."/common/OrderInvoice/show?id=".intval($data["id"]);
$command = 'google-chrome --headless --no-pdf-header-footer --disable-gpu --no-sandbox --pprint-to-pdf-no-header --print-to-pdf='.$fileUrl.' '.$pdfHtmlUrl." 2>&1";
$output = array();
\exec($command, $output, $return_var);
if($return_var!=0){
$execErrorMessage=$output[0];
}
}
catch(\Exception $e){
$this->error($e->getMessage());
}
if($execErrorMessage!=""){
Log::write('InvoiceToPdfByHeadlessChrome 错误:'.$execErrorMessage,'notice');
$this->error("fail");
}
if(is_file($fileUrl)){
$this->success("success",["orderInvoice"=>$viewUrl]);
}
else {
$this->error("fail");
}
}
关键在于exec这个函数,是php里面比较危险的函数,一般安全建议是禁用,另外一个是要开放/tmp这个目录给web服务进程所属用户(例如www)的可写权限。
基于此,建议是单独开一个docker运行。
关键字词:uniapp,php,pdf