Maison > développement back-end > tutoriel php > Comment convertir une page HTML en Word en utilisant php et l'enregistrer

Comment convertir une page HTML en Word en utilisant php et l'enregistrer

墨辰丷
Libérer: 2023-03-28 19:26:02
original
2817 Les gens l'ont consulté

Cet article présente principalement la méthode de conversion des pages HTML en Word et de leur enregistrement en PHP. Il analyse les fonctions et l'utilisation de l'outil PHPWord sous forme d'exemples. Il a une certaine valeur de référence. it

L'exemple de cet article décrit comment PHP convertit les pages HTML en Word et les enregistre. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Un outil PHP est utilisé ici appelé : PHPWord.

Le principe de la génération de Word est de compresser le fichier XML spécifié dans un package zip et de changer le nom du suffixe en doc ou docx.

Donc, pour utiliser PHPWord, vous devez installer l'extension de compression zip.dll dans votre environnement PHP. J'ai écrit une démo.

Description de la fonction :

<.>20150507 — Obtention des balises

et des balises de liste

    en HTML

    20150508 — Ajout de la fonction d'obtention d'images dans les articles
    20150509 — Ajout de l'espacement des lignes et des images d'erreur filtrées
    20150514 — Ajout traitement des tables et changement du code en orienté objet
    20150519 — Ajout de la bibliothèque GD pour traiter les images réseau

    require_once &#39;PHPWord.php&#39;;
    require_once &#39;SimpleHtmlDom.class.php&#39;;
    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[&#39;host&#39;];
     $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[&#39;host&#39;]))
     {
     $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[&#39;width&#39;],"height"=>$imgsArr[&#39;height&#39;]); }
     }
     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})|.{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) == ""){
     $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[&#39;path&#39;]);
     $ext = explode(&#39;.&#39;,$file);
     $this->ImgDir = $this->CurrentDir."/".$UrlArr[&#39;host&#39;];
     $_supportedImageTypes = array(&#39;jpg&#39;, &#39;jpeg&#39;, &#39;gif&#39;, &#39;png&#39;, &#39;bmp&#39;, &#39;tif&#39;, &#39;tiff&#39;);
     if(isset($ext[&#39;1&#39;]) && in_array($ext[&#39;1&#39;],$_supportedImageTypes))
     {
     $file = file_get_contents($Src);
     $this->HttpRequestArr[] = $Src;
     $this->HttpRequestTime++;
     $this->_mkdir(); //创建目录,或者收集错误
     $imgName = md5($UrlArr[&#39;path&#39;]).".".$ext[&#39;1&#39;];
     file_put_contents($this->ImgDir."/".$imgName,$file);
     $this->DownImg++;
     return $UrlArr[&#39;host&#39;]."/".$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(&#39;宋体&#39;);
     $PHPWord->setDefaultFontSize("11");
     $styleTable = array(&#39;borderSize&#39;=>6, &#39;borderColor&#39;=>&#39;006699&#39;, &#39;cellMargin&#39;=>120);
     // New portrait section
     $section = $PHPWord->createSection();
     $section->addText($this->Details(),array(),array(&#39;spacing&#39;=>120));
     //数据进行处理
     foreach($this->LinetextArr as $key=>$lineArr)
     {
     if(isset($lineArr[&#39;tag&#39;]))
     {
     if($lineArr[&#39;tag&#39;] == "li")
     {
     $section->addListItem($lineArr[&#39;text&#39;],0,"","",array(&#39;spacing&#39;=>120));
     }
     else if($lineArr[&#39;tag&#39;] == "img")
     {
     $section->addImage($lineArr[&#39;src&#39;],array(&#39;width&#39;=>$lineArr[&#39;width&#39;], &#39;height&#39;=>$lineArr[&#39;height&#39;], &#39;align&#39;=>&#39;center&#39;));
     }
     else if($lineArr[&#39;tag&#39;] == "p")
     {
     $section->addText($lineArr[&#39;text&#39;],array(),array(&#39;spacing&#39;=>120));
     }
     }
     else if($key == "table")
     {
     $PHPWord->addTableStyle(&#39;myOwnTableStyle&#39;, $styleTable);
     $table = $section->addTable("myOwnTableStyle");
     foreach($lineArr as $key=>$tr)
     {
     $table->addRow();
     foreach($tr as $ky=>$td)
     {
     $table->addCell(2000)->addText($td[&#39;text&#39;]);
     }
     }
     }
     }
     $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[&#39;host&#39;].".docx";
     }
     // Save File
     $objWriter = PHPWord_IOFactory::createWriter($PHPWord, &#39;Word2007&#39;);
     $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(&#39;Content-type: application/msword&#39;);//输出的类型
     //Force the download
     $header="Content-Disposition: attachment; filename=".$this->filename.";";
     header($header);
     @readfile($this->filename);
     }
    }
    Copier après la connexion

    Points clés du code ci-dessus on dirait qu'il ne s'agit pas de génération de mots, mais de l'utilisation de Simplehtmldom, qui est un analyseur HTML open source. Comme mentionné précédemment, j'ai examiné son code ces jours-ci, et

    a conduit à deux directions d'apprentissage<. 🎜>

    ① Exprimer

    ② Cette fonction étendue est organisée

    Ce que vous obtenez en regardant le code source :

    Les exceptions PHP peuvent être détectées et les erreurs PHP peut également être attrapé capturé.

    error_get_last() //用这个函数可以捕获页面中的PHP错误,不谢。
    Copier après la connexion

    Résumé : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

    Recommandations associées :

    php-fpm exemple d'ajout de service service

    php-Méthode de script de démarrage du service Fpm

    Conversion du type de données PHP (caractère en nombre, nombre en caractère)


    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal