php实现将HTML页面转换成word并且保存的方法
本文实例讲述了php实现将HTML页面转换成word并且保存的方法。分享给大家供大家参考,具体如下:
这里用使用到一个PHP的工具叫:PHPWord。
生成Word的原理是,将堆规定好了的xml压缩成一个zip包,并且把后缀名改成doc或者docx即可。
所以使用PHPWord,需要你的PHP环境安装zip.dll压缩扩展,我写了一个demo.
功能说明:
20150507—HTML中的<p>标签和<ol>列表标签的获取
20150508—新增获取文章中的图片功能
20150509—新增行间距,并且过滤一下错误图片
20150514—新增表格处理,并且将代码改成面向对象
20150519—新增GD库处理网络图片
require_once'PHPWord.php';
require_once'SimpleHtmlDom.class.php';
classWord{
private$url;
private$LinetextArr=array();
public$CurrentDir;
public$error=array();//错误数组
public$filename=null;
public$Allowtag="p,ol,ul,table";
/**数据统计**/
public$DownImg=0;
public$expendTime=0;
public$HttpRequestTime=0;
public$ContentLen=0;
public$HttpRequestArr=array();
public$expendmemory=0;
publicfunction__construct($url)
{
$startTime=$this->_Time();
$startMemory=$this->_memory();
$this->url=$url;
$UrlArr=parse_url($this->url);
$this->host=$UrlArr["scheme"]."://".$UrlArr['host'];
$this->CurrentDir=getcwd();
$this->LinetextArr["table"]=array();
$html=newsimple_html_dom($this->url);
$this->HttpRequestArr[]=$this->url;
$this->HttpRequestTime++;
foreach($html->find($this->Allowtag)as$key=>$value)
{
if($value->tag=="table")
{
$this->ParseTable($value,0,$this->LinetextArr["table"]);
}
else
{
$this->AnalysisHtmlDom($value);
}
$this->error[]=error_get_last();
}
$endTime=$this->_Time();
$endMemory=$this->_memory();
$this->expendTime=round(($endTime-$startTime),2);//微秒
$this->expendmemory=round(($endMemory-$startMemory)/1000,2);//bytes
$this->CreateWordDom();
}
privatefunction_Time()
{
returnarray_sum(explode("",microtime()));
}
privatefunction_memory()
{
returnmemory_get_usage();
}
/**
*解析HTML中的Table,这里考虑到多层table嵌套的情况
*@param$valueHTMLDOM
*@param$i遍历层级
***/
privatefunctionParseTable($value,$i,$Arr)
{
if($value->firstChild()&&in_array($value->firstChild()->tag,array("table","tbody","thead","tfoot","tr")))
{
foreach($value->childrenas$k=>$v)
{
$this->ParseTable($v,$i++,$Arr);
}
}
else
{
foreach($value->childrenas$k=>$v)
{
if($v->firstChild()&&$v->firstChild()->tag!="table")
{
$Arr[$i][]=array("tag"=>$v->tag,"text"=>trim($v->plaintext));
}
if(!$v->firstChild())
{
$Arr[$i][]=array("tag"=>$v->tag,"text"=>trim($v->plaintext));
}
}
}
}
/**
*解析HTML里面的表情
*@param$valueHTMLDOM
***/
privatefunctionAnalysisHtmlDom($value)
{
$tmp=array();
if($value->has_child())
{
foreach($value->childrenas$k=>$v)
{
$this->AnalysisHtmlDom($v);
}
}
else
{
if($value->tag=="a")
{
$tmp=array("tag"=>$value->tag,"href"=>$value->href,"text"=>$value->innertext);
}
elseif($value->tag=="img")
{
$src=$this->unescape($value->src);
$UrlArr=parse_url($src);
if(!isset($UrlArr['host']))
{
$src=$this->host.$value->src;
$UrlArr=parse_url($src);
}
$src=$this->getImageFromNet($src,$UrlArr);//表示有网络图片,需要下载
if($src)
{
$imgsArr=$this->GD($src);
$tmp=array("tag"=>$value->tag,"src"=>$src,"text"=>$value->alt,"width"=>$imgsArr['width'],"height"=>$imgsArr['height']);}
}
else
{
$tmp=array("tag"=>$value->tag,"text"=>strip_tags($value->innertext));
}
$this->LinetextArr[]=$tmp;
}
}
/**
*根据GD库来获取图片的如果太多,进行比例压缩
***/
privatefunctionGD($src)
{
list($width,$height,$type,$attr)=getimagesize($src);
if($width>800||$height>800)
{
$width=$width/2;
$height=$height/2;
}
returnarray("width"=>$width,"height"=>$height);
}
/**
*将Uincode编码转移回原来的字符
***/
publicfunctionunescape($str){
$str=rawurldecode($str);
preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
$ar=$r[0];
foreach($aras$k=>$v){
if(substr($v,0,2)=="%u"){
$ar[$k]=iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4)));
}
elseif(substr($v,0,3)=="&#x"){
$ar[$k]=iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1)));
}
elseif(substr($v,0,2)=="&#"){
$ar[$k]=iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1)));
}
}
returnjoin("",$ar);
}
/**
*图片下载
*@param$Src目标资源
*@param$UrlArr目标URL对应的数组
***/
privatefunctiongetImageFromNet($Src,$UrlArr)
{
$file=basename($UrlArr['path']);
$ext=explode('.',$file);
$this->ImgDir=$this->CurrentDir."/".$UrlArr['host'];
$_supportedImageTypes=array('jpg','jpeg','gif','png','bmp','tif','tiff');
if(isset($ext['1'])&&in_array($ext['1'],$_supportedImageTypes))
{
$file=file_get_contents($Src);
$this->HttpRequestArr[]=$Src;
$this->HttpRequestTime++;
$this->_mkdir();//创建目录,或者收集错误
$imgName=md5($UrlArr['path']).".".$ext['1'];
file_put_contents($this->ImgDir."/".$imgName,$file);
$this->DownImg++;
return$UrlArr['host']."/".$imgName;
}
returnfalse;
}
/**
*创建目录
***/
privatefunction_mkdir()
{
if(!is_dir($this->ImgDir))
{
if(!mkdir($this->ImgDir,"7777"))
{
$this->error[]=error_get_last();
}
}
}
/**
*构造WordDom
***/
privatefunctionCreateWordDom()
{
$PHPWord=newPHPWord();
$PHPWord->setDefaultFontName('宋体');
$PHPWord->setDefaultFontSize("11");
$styleTable=array('borderSize'=>6,'borderColor'=>'006699','cellMargin'=>120);
//Newportraitsection
$section=$PHPWord->createSection();
$section->addText($this->Details(),array(),array('spacing'=>120));
//数据进行处理
foreach($this->LinetextArras$key=>$lineArr)
{
if(isset($lineArr['tag']))
{
if($lineArr['tag']=="li")
{
$section->addListItem($lineArr['text'],0,"","",array('spacing'=>120));
}
elseif($lineArr['tag']=="img")
{
$section->addImage($lineArr['src'],array('width'=>$lineArr['width'],'height'=>$lineArr['height'],'align'=>'center'));
}
elseif($lineArr['tag']=="p")
{
$section->addText($lineArr['text'],array(),array('spacing'=>120));
}
}
elseif($key=="table")
{
$PHPWord->addTableStyle('myOwnTableStyle',$styleTable);
$table=$section->addTable("myOwnTableStyle");
foreach($lineArras$key=>$tr)
{
$table->addRow();
foreach($tras$ky=>$td)
{
$table->addCell(2000)->addText($td['text']);
}
}
}
}
$this->downFile($PHPWord);
}
publicfunctionDetails()
{
$msg="一共请求:{$this->HttpRequestTime}次,共下载的图片有{$this->DownImg}张,并且下载完成大约使用时间:{$this->expendTime}秒,整个程序执行大约消耗内存是:{$this->expendmemory}KB,";
return$msg;
}
publicfunctiondownFile($PHPWord)
{
if(empty($this->filename))
{
$UrlArr=parse_url($this->url);
$this->filename=$UrlArr['host'].".docx";
}
//SaveFile
$objWriter=PHPWord_IOFactory::createWriter($PHPWord,'Word2007');
$objWriter->save($this->filename);
header("Pragma:public");
header("Expires:0");
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header("Cache-Control:public");
header("Content-Description:FileTransfer");
//Usetheswitch-generatedContent-Type
header('Content-type:application/msword');//输出的类型
//Forcethedownload
$header="Content-Disposition:attachment;filename=".$this->filename.";";
header($header);
@readfile($this->filename);
}
}
上面的代码重点感觉不是word生成,而是Simplehtmldom的使用,这是一个开源的HTML解析器,之前有提到,这几天在看他的代码,
引出了两个学习方向
①正在表达式
②这个扩展的函数整理
看源代码的收获:
PHP的异常是可以捕获的,而且PHP的错误也是可以捕获的。
error_get_last()//用这个函数可以捕获页面中的PHP错误,不谢。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php操作office文档技巧总结(包括word,excel,access,ppt)》、《PHP数组(Array)操作技巧大全》、《php排序算法总结》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php正则表达式用法总结》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。