php中网页生成图片的方式
在网上找了很多方法,发现与自己最初的思路也是大同小异,那就是HTML——》PDF——》JPG。从上午9点钟一直搞到下午6点钟,代码方面其实很简单,更多的还是环境和PHP拓展上面,忙了一天的成果有必要分享一下。
第一步:HTML——》PDF
1、利用html2fpdf将html转成pdf
require('html2fpdf/html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
// yourfile.html 你要转化的HTML文件
$yourfile_html = "index.html";
// yourfile.pdf 转化成功后的pdf文件名
$yourfile_pdf = "yourfile.pdf";
$fp = fopen($yourfile_html,"r");
$strContent = fread($fp, filesize($yourfile_html));
fclose($fp);
$pdf->WriteHTML($strContent);
$pdf->Output($yourfile_pdf );
html2fpdf类库网上都可以下载到,这个方法的一个缺点就是会出现中文乱码,所以我后来又找到了下面这种方法:
2、利用mpdf将html转成pdf
基本解决了中文(以及日语、韩语及东南亚和全球语言)乱码的问题,在Windows/Linux开发环境下测试可用,不需要安装别的组件支持
这里是官方下载地址是:http://www.mpdf1.com/,已经更新到6.0版,不过我不建议下载6.0版本,原因有两个:相比其他版本要大很多;再就是我第一次用的就是这个版本,里面报各种错误(这才是主要原因),后来换成5.7就没问题了。
代码如下:
include('mpdf/mpdf.php');
$mpdf=new mPDF('UTF-8','A4','','',0,0,0,0);//设置编码、页面大小,以及在pdf上面的顶点坐标
$mpdf->useAdobeCJK = true;
$mpdf->SetAutoFont(AUTOFONT_ALL);
$mpdf->SetDisplayMode('fullpage');
//$mpdf->watermark_font = 'GB';
//$mpdf->SetWatermarkText('中国水印',0.1);
$url = 'index.html';
$strContent =file_get_contents($url);
//print_r($strContent);die;
$mpdf->showWatermarkText = true;
$mpdf->SetAutoFont();
//$mpdf->SetHTMLHeader( '头部' );
//$mpdf->SetHTMLFooter( '底部' );
$mpdf->WriteHTML($strContent);
$mpdf->Output('ss.pdf');
//$mpdf->Output('tmp.pdf',true);
//$mpdf->Output('tmp.pdf','d');
//$mpdf->Output();
这个方法看起来都要比第一种高大上,编码,水印,纸张大小什么的都能设置。
第二步:PDF——》JPG
这一步才是整个功能最麻烦的地方,麻烦在什么地方?麻烦在imagick系统环境的安装和php动态链接库,动态链接库必须和操作系统版本、php版本一致,否则无法使用。也是悲催,我自己在windows下试了几个小时,换了几台电脑都没成功,一换到linux环境,按照网上的方法一装,跑得好好的。不管怎么样方法还是提供一下吧,万一你运气好一下就装好了也说不定呢!
本地windows开发环境,安装过程:
1、下载ImageMagick
我下载的是ImageMagick-6.8.6-9-Q16-x86-dll.exe版本
http://vdisk.weibo.com/s/uJehmAky5Zlib?sudaref=www.baidu.com
2. 安装 ImageMagick
安装 ImageMagick 到 PC 上。安装路径不能出现空格,否则无法使用。安装时,记得选中第二个选项把执行路径添加到 path 上,否则你就得手动去添加 path 路径了。
3. 测试安装
打开windows 命令行窗口,输入convert,回车。会出现convert的帮助文档,如果没有出现,说明没有安装成功,或没有把安装目录添加到环境变量 path 中。
添加到环境变量:
我的电脑 -> 右键点击 -> 高级系统设置 -> 高级 -> 环境变量 -> 系统变量 -> path -> 选择并编辑 -> 把你的安装目录,添加到其中
4. 下载 php扩展 php_imagick.dll
更新自己的php版本和系统环境下载相对应的dll。下载地址 http://www.peewit.fr/imagick/
5. 把dll文件重命名为php_imagick.dll,并放到php 扩展文件目录 php/ext 中。
6. 在 php.ini 配置文件中添加,extension=php_imagick.dll。
7. 重启电脑,只重启apache不管用的情况下,重启下PC。因为扩展底层使用的是imageMagic软件,所以软件重启电脑,重新加载软件,并刷新path路径。
8. 重启后,打开 phpinfo页面,查看,扩展已经安装成功。如果还未安装成功,极有可能imagemagick软件版本过高,请选择更低一级的版本安装。
Linux安装ImageMagick
1. 依次运行以下命令
yum install ImageMagick
yum install ImageMagick-devel
yum install php-pear [for PECL]
安装php-pear是为了使用pecl 中的 phpize
yum -y install php-devel
2. 安装C编译器
yum install gcc
如果装不了gcc就用这个命令:
yum install gcc gcc-c++ autoconf automake
3. 安装imagick
pecl install imagick
4. 加载imagick到php
在/etc/php.ini 加上extension=imagick.so
5. 重启service httpd restart
6. 使用 phpinfo() 或运行 php -m | grep imagick 来查看是否安装成功
好了,环境安装完了,下面就是代码实现了(用下面的代码也可以测试环境是否真的安装成功,windows环境下php_imagick扩展已经有了但还是报imagick错误,弄好久也没解决我也很绝望)
简单一点的代码如下:
$pdfpath="yourfile.pdf";
$im = new Imagick();
$im->readImage($pdfpath);
$im -> resetIterator();
$imgs = $im->appendImages(true);
$imgs->setImageFormat( "jpg" );
$img_name ="123.jpg";
$imgs->writeImage($img_name);
$imgs->clear();
$imgs->destroy();
$im->clear();
$im->destroy();
封装好的代码如下:
/**
* PDF2PNG
* @param $pdf 待处理的PDF文件
* @param $path 待保存的图片路径
* @param $page 待导出的页面 -1为全部 0为第一页 1为第二页
* @return 保存好的图片路径和文件名
*/
function pdf2png($pdf,$path,$page=-1)
{
if(!extension_loaded('imagick'))
{
return false;
}
if(!file_exists($pdf))
{
return false;
} $im = new Imagick();
$im->setResolution(500,500);//设置图像分辨率
$im->setCompressionQuality(100);//设置默认的压缩质量
if($page==-1)
$im->readImage($pdf);
else
$im->readImage($pdf.'['.$page.']');
foreach ($im as $Key => $Var)
{
$Var->setImageFormat('jpg');
$filename = $path.'/'. md5($Key.time()).'.jpg';
if($Var->writeImage($filename) == true)
{
$Return[] = $filename;
}
}
return $Return;
}
$path='images';//请确保当前目录下有这个文件夹PHP Fatal error: Uncaught exception 'ImagickException' with message 'PostscriptDelegateFailed `test.pdf': No such file or directory'
$s=pdf2png('123.pdf',$path); $scount=count($s); for($i=0;$i<$scount;$i++)
{
echo '<div align=center><font color=red>Page '.($i+1).'</font><br><a href=\''.$s[$i].'\' target=_blank><img border=3 height=400 width=300 src=\''.$s[$i].'\'></a></div><p>';
}
如果出现下面的报错,那就需要安装GhostScript了
PHP Fatal error: Uncaught exception 'ImagickException' with message 'PostscriptDelegateFailed `test.pdf': No such file or directory'
linux安装方法如下:
yum install ghostscript
最后附上整个代码:https://git.coding.net/fallstar/htmltojpg.git
好了,这就是整个的实现过程,经过测试转一些简单的网页是没有问题的,但要是一些复杂的网页就没办法执行了,其实整个功能的代码还可以进行封装一下的,这里就不实现了。虽然整个的过程比较艰辛,中间也试了很多其他的方法,效果不怎么样就舍弃了,每个功能都是要一步步完善才能做到更加完美的,总得来说收获还是很大的。
php中网页生成图片的方式的更多相关文章
- php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL
php在apache中一共有三种工作方式:CGI模式.FastCGI .FastCGI是什么? FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行 为是将CGI解释器进程保持在内存中并因 ...
- html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结
Day27 html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...
- JavaScript中定义类的方式详解
本文实例讲述了JavaScript中定义类的方式.分享给大家供大家参考,具体如下: Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的exte ...
- HTML+JS中网页跳转的写法
1.html中使用meta中跳转,通过meta可以设置跳转时间和页面 <head> <!--只是刷新不跳转到其他页面 --> <meta http-equiv=" ...
- opengl es中不同的绘制方式
opengl es中不同的绘制方式 转载请保留出处:http://xiaxveliang.blog.163.com/blog/static/297080342013467344263/ 1. GL_P ...
- 程序中保存状态的方式之Cookies
程序中保存状态的方式之 Cookies,之前写过一篇关于ViewState的.现在继续总结Cookies方式的 新建的测试页面login <%@ Page Language="C#&q ...
- iOS中的数据持久化方式
iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...
- VS中附加进程的方式调试IIS页面,以及设置断点无效问题解决
以前调试网站的时候都习惯是直接在解决方案中右键调试——启动新实例,后来发现这样的缺点有: 1.启动比较慢: 2.一些浏览器的request参数无法带入: 3.不特殊指定启动url的话,VS会将页面加载 ...
- WCF中常用的binding方式
WCF中常用的binding方式: BasicHttpBinding: 用于把 WCF 服务当作 ASMX Web 服务.用于兼容旧的Web ASMX 服务.WSHttpBinding: 比 Basi ...
随机推荐
- HashMap详谈以及实现原理
(一).HashMap 基于哈希表的 Map 接口的实现 允许使用 null 值和 null 键 HashMap不是线程安全,想要线程安全,Collections类的静态方法synchronizedM ...
- js和jq实现全选反选
在前端中用到全选反选的案例并不少,在这里呢我就实现这个功能给大家参考参考. 这里呢就先贴上我的html和css代码 <div class="wrap"> <tab ...
- Installing JDK7 on Ubuntu
1. # sudo add-apt-repository ppa:webupd8team/java 2. # sudo apt-get update 3. # sudo apt-get insta ...
- async和await关键词用于定义原生的协程
#python为了将语义变得更加明确,就引入了async和await关键词用于定义原生的协程 # async def downloader(url): # return "xxxx" ...
- Jenkenis报错:该jenkins实例似乎已离线[转]
解决方法: 安装插件那个页面,就是提示你offline的那个页面,不要动.然后打开一个新的tab,输入网址http://localhost:8080/pluginManager/advanced. 这 ...
- 获取数据源数据的实现---Architecting Android
UserRepository,这个接口,描述了Repository提供给用户的功能就是getUsers,getUser(ID).用户只管使用,其它细节无需理会. /** * Interface tha ...
- 【BZOJ】1954: Pku3764 The xor-longest Path
[算法]trie树+xor路径 [题解] 套路1:统计从根到每个点的xor路径和,由于xor的自反性,两个点到根的xor路径和异或起来就得到两点间路径和. 然后问题就是找到n个值中异或值最大的两个值, ...
- MSSQL DBcheck
--1.创建数据库. --create database MyDatabase; --删除数据库 --drop database MyDatabase; ----------------------- ...
- js中三种定义变量 const, var, let 的区别
js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...
- new操作符(翻译自mozilla.org)
翻译自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new new操作符可以实例化一个用户自 ...