php 抓取网页生成图片(php中网页转图片开源的转换工具是可行的吗)
优采云 发布时间: 2022-03-21 15:17php 抓取网页生成图片(php中网页转图片开源的转换工具是可行的吗)
在java中有开源的转换工具,可以将网页转换成图片,比较简单。php中将网页转换为图片的开源工具很少,少则一个半成品(只能通过命令行调用,不能使用php代码生成)html2image(),没办法,以前在代码中直接使用纯语言代码,于是继续google,然后找到了解决方案:html“pdf”图片(来源:用php想搞定。
本来打算直接用他的开源方案,但是在申请过程中发现一个问题:没有中文字体,加上中文字体后,图片中只显示网页中的一行中文,其他内容无法显示显示。
这是逼我去研究他的开源代码,不过好在这个开源项目的意义在于确认html>pdf>image方案是可行的。
我反汇编了他的代码,发现问题出在html网页的pdf生成阶段。因为作者重写了tcpdf方案形成了html2pdf开源包,但是重写的不好,对中文的支持也不够,所以放弃了作者的开源包。框架,直接使用 stable tcpdf 和 imagick 将 html 转为 pdf 再转为图像。
这个过程有点难(php没有正式研究过,一般就是接项目开始工作,用来查什么),从中午一直持续到晚上2点,整整14个小时,我的天哪,我觉得有必要总结一下,以免下次忘记同样的场景。
让我们现在开始:
1.项目采用的成熟开源方案:tcpdf()、imagick(php的一个库,类似于gd库,库文件需要在操作系统级别安装,动态链接库需要添加到 php.ini 中)。
2. 首先需要从html生成pdf:这里要注意的是中文的处理。中国乱码出现在无数地方。需要确保的一件事是所有数据交换都使用 utf8 字符集。这里html使用fckeditor传递Post提交,首先需要设置web服务器接收字符为utf8,其次new tcpdf时需要设置编码为中文,
3.tcpdf默认不收录中文字体(中文要崛起了,他们要做一些世界级的大项目,然后就不会有日文、德文等字体了,哈哈),有很多中文字体可用,Droid Sans Fallback 字体是互联网上使用最多的字体,所以我使用 Droid Sans Fallback 字体库。可以直接下载tcpdf版本的字体(三个文件),也可以下载ttf字体,然后使用tcpdf工具生成三个文件,见
4.字体准备好了,编码正确,准备开始了,但是官方只有一个案例,没有文档,而且大部分案例都是多段html代码写入tcpdf对象little一点一点,我需要的是直接写一段html,然后生成pdf文档,所以需要参考案例简化代码
5.html生成pdf时设置字体需要注意。字体设置不当会影响后面从pdf生成图片的过程。在这个改造项目中,它已经困扰了4个小时。Droid Sans 是一个字体集。有两种使用 pdf 字体的方法。一种是只将字体描述信息写入pdf文档。pdf阅读工具在解析的时候会从工具自带的字体库或者系统中导入对应的字体来显示文档,所以pdf文档会比较小。,此时设置字体为'stsongstdlight';另一种设置字体的方法是将字体文件同时保存到pdf文档中,即使pdf阅读工具或者系统没有字体,仍然可以解析显示文档,所以文档会更大,此时,字体设置为'droidsansfallback';因为一开始字体设置为'stsongstdlight',所以在使用imagick从pdf生成图片时永远无法生成;然后各种控制变量方法,一步一步找原因,最后定位到字体位置,字体'stsongstdlight'不能生成图片。完成google guide后,发现设置Droid Sans字体有两种方式。然后我尝试了两种设置字体的方法,发现只能生成字体设置为'droidsansfallback'时生成的pdf文档。图片【这里感觉服务器上缺少Droid Sans字体库。如果服务器上安装了Droid Sans字体库,是否也可以生成图片?由于项目很晚才结束,
6.写入tcpdf对象的html代码必须无错误且符合html规范,否则tcpdf会报错,通常fckeditor生成的html代码会转义双引号,会导致"变成\",这个转义不能被tcpdf识别,所以需要去掉转义字符\
7.图片版权:生成图片需要添加产品水印,可以在pdf生成图片中添加,也可以在html生成pdf阶段添加。我个人认为添加pdf创建阶段会更容易。在这个项目中由于时间关系,我只是简单的在html的末尾加了一个网站标记(因为pdf是html格式生成的,所以可以修改html格式,使生成的pdf更加美观,水印更合适)。