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

5年以前  |  阅读数:856 次  |  编程语言:PHP 

本文实例讲述了php实现将HTML页面转换成word并且保存的方法。分享给大家供大家参考,具体如下:

这里用使用到一个PHP的工具叫:PHPWord

生成Word的原理是,将堆规定好了的xml压缩成一个zip包,并且把后缀名改成doc或者docx即可。

所以使用PHPWord,需要你的PHP环境安装zip.dll压缩扩展,我写了一个demo.

功能说明:

20150507 ― HTML中的

标签和

    列表标签的获取
    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})|&#
 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例