专栏首页LNMP开发那些事使用PHP将HTML转换成PDF文件的方法以及常见问题解决方法

使用PHP将HTML转换成PDF文件的方法以及常见问题解决方法

公司的某项业务需要与用户线上签订协议,即用户在线手写一个签名,后台将公司公章信息和用户的签名以及合同信息生成一份PDF文件,供用户查看和下载。

比对了一些插件,我们最终决定使用dompdf这个插件,插件的github在这里:https://github.com/dompdf/dompdf

1. 使用方法

  • 安装可以使用composer或者直接下载源代码,使用require或者include引入。
  • 具体的使用方式,可以参考以下示例代码。
// 引入命名空间
use Dompdf\Dompdf;
// 初始化dompdf对象
$dompdf = new Dompdf();
// 加载html文档内容
$dompdf->loadHtml('hello world');
// 设置纸张类型和方向
$dompdf->setPaper('A4', 'landscape');
// 渲染HTML为PDF
$dompdf->render();
// 流输出
$dompdf->stream();

2. 常见问题和解决办法

2.1 中文乱码的问题

插件对于字体和编码问题是这样形容的:

PDF documents internally support the following fonts: Helvetica, Times-Roman, Courier, Zapf-Dingbats, & Symbol. These fonts only support Windows ANSI encoding. In order for a PDF to display characters that are not available in Windows ANSI, you must supply an external font. Dompdf will embed any referenced font in the PDF so long as it has been pre-loaded or is accessible to dompdf and reference in CSS @font-face rules. See the font overview for more information on how to use fonts. The DejaVu TrueType fonts have been pre-installed to give dompdf decent Unicode character coverage by default. To use the DejaVu fonts reference the font in your stylesheet, e.g. body { font-family: DejaVu Sans; } (for DejaVu Sans). The following DejaVu 2.34 fonts are available: DejaVu Sans, DejaVu Serif, and DejaVu Sans Mono.

尝试了一下,默认带的字体是无法渲染中文的,使用CSS的@font-face引入会报错(也可能是我打开方式不对)。这样就只好自己引入一个字体了。

插件给了一个安装语言文件的工具,地址再这里:https://github.com/dompdf/utils

使用步骤:

  • 下载或者复制load_font.php文件,放到dompdf文件夹内,与src和test文件夹同级
  • 修改load_font.php文件中引入的autoload.php为项目实际的位置
  • 在命令行中执行php load_font.php simkai /path/to/simkai.ttf

这样,我们就可以在html文档的css中使用font-family属性来指定字体了。

html {
    font-family: simkai;
}

2.2 图片无法展示

插件应该是无法直接显示网络图片,所以需要将图片转换为BASE64格式才能显示。 将HTML文档中的所有图片转换为BASE64的方式:

function imgToBase64($html) {
    $html = preg_replace_callback('/<img(?:.*?)src="(.*?)"(?:.*?)\/?>/', function($matches) {
            $imageInfo = getimagesize($matches[1]);
            $base64 = "" . chunk_split(base64_encode(file_get_contents($matches[1])));
            $base64_image = 'data:' . $imageInfo['mime'] . ';base64,' . $base64;
            return str_replace($matches[1], $base64_image, $matches[0]);
        }, $html);
    return $html;
}

这样转换其实性能影响挺大的,感觉性能不太好可以加一下缓存。

以上就是使用PHP转换HTML为PDF文档的方法以及常见问题解决办法,有没有帮到你呢~~

文章作者ianzhi,原文地址:https://www.dnote.cn/users/ianzhi/posts/shiyongPHPjiangHTMLzhuanhuanchengPDFwenjian%EF%BC%8Cjiejuewufashiyongchajiandewenti

文章版权归作者所有,转载请保留此声明。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 编译安装php的swoole扩展

    操作系统 linux Debian PHP版本 7.3.6 swoole版本 4.3.5

    ianzhi
  • 硬刚苹果微软?!谷歌发布x86二合一平板电脑—Pixel Slate

    1. 外观方面,Pixel Slate采用深蓝配色,机身使用铝材,厚度仅7毫米左右,极致超薄,重量约为725克。

    ianzhi
  • 安装插件 - 集成 - 构建文档 - ckeditor5中文文档

    CKEditor 5插件通过npm包分发,并以模块化方式实现,这意味着单个插件可能包含多个JavaScript文件。

    ianzhi
  • Netty 源码阅读入门实战(三)-服务端启动

    JavaEdge
  • 零基础学编程036:快速编写一个GUI程序

    在《零基础学编程035:群发邮件并不难》里,我们学会了发邮件,我用于向shenlongbin@sync.omnigroup.com发送一封邮件,就可以实现GTD...

    申龙斌
  • 镁光公司计划向AI初创公司投资1亿美元

    镁光(Micron)于周三表示,计划为从事AI技术的初创公司投资1亿美元,包括自动驾驶汽车,工厂自动化和其他发展领域。

    AiTechYun
  • 简单使用babel

    要使用babel,首先需要了解用的东西?它是一个用来进行ES6转化到ES5的转码器,从而在现有环境中进行执行。 一、配置文件.babelrc(搬运下) Babe...

    用户1148881
  • Python实现单博主微博文本、图片及热评爬取

    慕白
  • Linux 命令(136)—— curl 命令

    curl 命令是一个利用 URL 规则在 Shell 终端命令行下工作的文件传输工具;它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为...

    Dabelv
  • SAP Analytics Cloud里如何基于一个已有的model创建Story

    选择Story的用途,这里我选择创建Story然后添加Responsive Page:

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券