当前位置: 首页 > 编程笔记 >

php实现将HTML页面转换成word并且保存的方法

苏季同
2023-03-14
本文向大家介绍php实现将HTML页面转换成word并且保存的方法,包括了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';
class Word{
 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;
 public function __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 = new simple_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();
 }
 private function _Time()
 {
 return array_sum(explode(" ", microtime()));
 }
 private function _memory()
 {
 return memory_get_usage();
 }
 /**
 * 解析HTML中的Table,这里考虑到多层table嵌套的情况
 * @param $value HTMLDOM
 * @param $i 遍历层级
 * **/
 private function ParseTable($value,$i,$Arr)
 {
 if($value->firstChild() && in_array($value->firstChild()->tag,array("table","tbody","thead","tfoot","tr")))
 {
 foreach($value->children as $k=>$v)
 {
 $this->ParseTable($v,$i++,$Arr);
 }
 }
 else
 {
 foreach($value->children as $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 $value HTMLDOM
 * **/
 private function AnalysisHtmlDom($value)
 {
 $tmp = array();
 if($value->has_child())
 {
 foreach($value->children as $k=>$v)
 {
 $this->AnalysisHtmlDom($v);
 }
 }
 else
 {
 if($value->tag == "a")
 {
 $tmp = array("tag"=>$value->tag,"href"=>$value->href,"text"=>$value->innertext);
 }
 else if($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库来获取图片的如果太多,进行比例压缩
 * **/
 private function GD($src)
 {
 list($width, $height, $type, $attr) = getimagesize($src);
 if($width > 800 || $height > 800 )
 {
 $width = $width/2;
 $height = $height/2;
 }
 return array("width"=>$width,"height"=>$height);
 }
 /**
 * 将Uincode编码转移回原来的字符
 * **/
 public function unescape($str) {
 $str = rawurldecode($str);
 preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
 $ar = $r[0];
 foreach($ar as $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)));
 }
 }
 return join("",$ar);
}
 /**
 * 图片下载
 * @param $Src 目标资源
 * @param $UrlArr 目标URL对应的数组
 * **/
 private function getImageFromNet($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;
 }
 return false;
 }
 /**
 * 创建目录
 * **/
 private function _mkdir()
 {
 if(!is_dir($this->ImgDir))
 {
 if(!mkdir($this->ImgDir,"7777"))
 {
 $this->error[] = error_get_last();
 }
 }
 }
 /**
 * 构造WordDom
 * **/
 private function CreateWordDom()
 {
 $PHPWord = new PHPWord();
 $PHPWord->setDefaultFontName('宋体');
 $PHPWord->setDefaultFontSize("11");
 $styleTable = array('borderSize'=>6, 'borderColor'=>'006699', 'cellMargin'=>120);
 // New portrait section
 $section = $PHPWord->createSection();
 $section->addText($this->Details(),array(),array('spacing'=>120));
 //数据进行处理
 foreach($this->LinetextArr as $key=>$lineArr)
 {
 if(isset($lineArr['tag']))
 {
 if($lineArr['tag'] == "li")
 {
 $section->addListItem($lineArr['text'],0,"","",array('spacing'=>120));
 }
 else if($lineArr['tag'] == "img")
 {
 $section->addImage($lineArr['src'],array('width'=>$lineArr['width'], 'height'=>$lineArr['height'], 'align'=>'center'));
 }
 else if($lineArr['tag'] == "p")
 {
 $section->addText($lineArr['text'],array(),array('spacing'=>120));
 }
 }
 else if($key == "table")
 {
 $PHPWord->addTableStyle('myOwnTableStyle', $styleTable);
 $table = $section->addTable("myOwnTableStyle");
 foreach($lineArr as $key=>$tr)
 {
 $table->addRow();
 foreach($tr as $ky=>$td)
 {
 $table->addCell(2000)->addText($td['text']);
 }
 }
 }
 }
 $this->downFile($PHPWord);
 }
 public function Details()
 {
 $msg = "一共请求:{$this->HttpRequestTime}次,共下载的图片有{$this->DownImg}张,并且下载完成大约使用时间:{$this->expendTime}秒,整个程序执行大约消耗内存是:{$this->expendmemory}KB,";
 return $msg;
 }
 public function downFile($PHPWord)
 {
 if(empty($this->filename))
 {
 $UrlArr = parse_url($this->url);
 $this->filename = $UrlArr['host'].".docx";
 }
 // Save File
 $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: File Transfer");
 //Use the switch-generated Content-Type
 header('Content-type: application/msword');//输出的类型
 //Force the download
 $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程序设计有所帮助。

 类似资料:
  • 本文向大家介绍php实现将上传word文件转为html的方法,包括了php实现将上传word文件转为html的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现将上传word文件转为html的方法。分享给大家供大家参考。具体实现方法如下: 上传页面: 接收页面: 希望本文所述对大家的php程序设计有所帮助。

  • 本文向大家介绍Asp.net中将Word文件转换成HTML的方法,包括了Asp.net中将Word文件转换成HTML的方法的使用技巧和注意事项,需要的朋友参考一下 本文所述为一个Asp.net实现将Word转换为HTML的功能,其关键代码如下: 上述代码,在.net framework4.0 中,可能会出一编译错误,如下所示: 无法嵌入互操作类型“……”,请改用适用的接口。 经过查阅资料,找到解决

  • 本文向大家介绍C#实现将PPT转换成HTML的方法,包括了C#实现将PPT转换成HTML的方法的使用技巧和注意事项,需要的朋友参考一下 本文是一个C#的小程序,主要实现将ppt转换成html的功能,方法很多,此处与大家分享一下,希望能对大家的项目开发起到一定的借鉴作用。 主要功能代码如下: 以上程序是使用C# 先创建一个ppt 文件并向里面写入了文字,然后再把此ppt 转换成html  ,对于上面

  • 本文向大家介绍php实现将wav文件转换成图像文件并在页面中显示的方法,包括了php实现将wav文件转换成图像文件并在页面中显示的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现将wav文件转换成图像文件并在页面中显示的方法。分享给大家供大家参考。具体分析如下: 需求:将wav文件转换成png文件并且显示出来。 Wav_To_Png.php: 效果图如下: 希望本文所述对大家

  • 本文向大家介绍jsp实现将动态网页转换成静态页面的方法,包括了jsp实现将动态网页转换成静态页面的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jsp实现将动态网页转换成静态页面的方法。分享给大家供大家参考。具体如下: 如果我可以将jsp动态网页转换成静态页面,那么访问的时候就不需要频繁的访问数据库了。 jsp 显示内容缓存技巧 前段时间做自己社区的论坛,在jive 的基础上做一个页

  • Java+Selenium如何实现将HTML页面转换成图片? 对于页面总高度比较小的页面,可以直接给Dimension设置一个比较大的高度,一次性截取;但是对于页面总高度比较大的页面,即使给Dimension设置一个非常大的高度,也无法截取完整的页面. 因为上述原因,我使用window.scrollBy(0,X)来滑动页面,想每次截高度X的内容,然后向下移动X,然后重新截图.但从结果来看,并不符合