HTML to Doc Conversion

This sections will contains code regarding different PHP & MySQL features and contains help about php/mysql issues.

HTML to Doc Conversion

Postby MT Shahzad on April 15th, 2008, 12:31 pm

If you want to convert a HTML file into a MS Word (*.doc) file, then this is possible now. The below class enables you to create a doc file from a HTML page or form a URL.

html-to-doc.php
Code: Select all
<?php
   /**
    * Convert HTML to MS Word file
    * @version 1.0.0
    * @name HTML_TO_DOC
    */

   class HTML_TO_DOC
   {
      var $docFile="";
      var $title="";
      var $htmlHead="";
      var $htmlBody="";


      /**
       * Constructor
       *
       * @return void
       */
      function HTML_TO_DOC()
      {
         $this->title="Untitled Document";
         $this->htmlHead="";
         $this->htmlBody="";
      }

      /**
       * Set the document file name
       *
       * @param String $docfile
       */

      function setDocFileName($docfile)
      {
         $this->docFile=$docfile;
         if(!preg_match("/\.doc$/i",$this->docFile))
            $this->docFile.=".doc";
         return;
      }

      function setTitle($title)
      {
         $this->title=$title;
      }

      /**
       * Return header of MS Doc
       *
       * @return String
       */
      function getHeader()
      {
         $return  = <<<EOH
          <html xmlns:v="urn:schemas-microsoft-com:vml"
         xmlns:o="urn:schemas-microsoft-com:office:office"
         xmlns:w="urn:schemas-microsoft-com:office:word"
         xmlns="http://www.w3.org/TR/REC-html40">

         <head>
         <meta http-equiv=Content-Type content="text/html; charset=utf-8">
         <meta name=ProgId content=Word.Document>
         <meta name=Generator content="Microsoft Word 9">
         <meta name=Originator content="Microsoft Word 9">
         <!--[if !mso]>
         <style>
         v\:* {behavior:url(#default#VML);}
         o\:* {behavior:url(#default#VML);}
         w\:* {behavior:url(#default#VML);}
         .shape {behavior:url(#default#VML);}
         </style>
         <![endif]-->
         <title>$this->title</title>
         <!--[if gte mso 9]><xml>
          <w:WordDocument>
           <w:View>Print</w:View>
           <w:DoNotHyphenateCaps/>
           <w:PunctuationKerning/>
           <w:DrawingGridHorizontalSpacing>9.35 pt</w:DrawingGridHorizontalSpacing>
           <w:DrawingGridVerticalSpacing>9.35 pt</w:DrawingGridVerticalSpacing>
          </w:WordDocument>
         </xml><![endif]-->
         <style>
         <!--
          /* Font Definitions */
         @font-face
            {font-family:Verdana;
            panose-1:2 11 6 4 3 5 4 4 2 4;
            mso-font-charset:0;
            mso-generic-font-family:swiss;
            mso-font-pitch:variable;
            mso-font-signature:536871559 0 0 0 415 0;}
          /* Style Definitions */
         p.MsoNormal, li.MsoNormal, div.MsoNormal
            {mso-style-parent:"";
            margin:0in;
            margin-bottom:.0001pt;
            mso-pagination:widow-orphan;
            font-size:7.5pt;
                 mso-bidi-font-size:8.0pt;
            font-family:"Verdana";
            mso-fareast-font-family:"Verdana";}
         p.small
            {mso-style-parent:"";
            margin:0in;
            margin-bottom:.0001pt;
            mso-pagination:widow-orphan;
            font-size:1.0pt;
                 mso-bidi-font-size:1.0pt;
            font-family:"Verdana";
            mso-fareast-font-family:"Verdana";}
         @page Section1
            {size:8.5in 11.0in;
            margin:1.0in 1.25in 1.0in 1.25in;
            mso-header-margin:.5in;
            mso-footer-margin:.5in;
            mso-paper-source:0;}
         div.Section1
            {page:Section1;}
         -->
         </style>
         <!--[if gte mso 9]><xml>
          <o:shapedefaults v:ext="edit" spidmax="1032">
           <o:colormenu v:ext="edit" strokecolor="none"/>
          </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml>
          <o:shapelayout v:ext="edit">
           <o:idmap v:ext="edit" data="1"/>
          </o:shapelayout></xml><![endif]-->
          $this->htmlHead
         </head>
         <body>
EOH;
      return $return;
      }

      /**
       * Return Document footer
       *
       * @return String
       */
      function getFotter()
      {
         return "</body></html>";
      }

      /**
       * Create The MS Word Document from given HTML
       *
       * @param String $html :: URL Name like http://www.example.com
       * @param String $file :: Document File Name
       * @param Boolean $download :: Wheather to download the file or save the file
       * @return boolean
       */

      function createDocFromURL($url,$file,$download=false)
      {
         if(!preg_match("/^http:/",$url))
            $url="http://".$url;
         $html=@file_get_contents($url);
         return $this->createDoc($html,$file,$download);
      }

      /**
       * Create The MS Word Document from given HTML
       *
       * @param String $html :: HTML Content or HTML File Name like path/to/html/file.html
       * @param String $file :: Document File Name
       * @param Boolean $download :: Wheather to download the file or save the file
       * @return boolean
       */

      function createDoc($html,$file,$download=false)
      {
         if(is_file($html))
            $html=@file_get_contents($html);

         $this->_parseHtml($html);
         $this->setDocFileName($file);
         $doc=$this->getHeader();
         $doc.=$this->htmlBody;
         $doc.=$this->getFotter();

         if($download)
         {
            @header("Cache-Control: ");// leave blank to avoid IE errors
            @header("Pragma: ");// leave blank to avoid IE errors
            @header("Content-type: application/octet-stream");
            @header("Content-Disposition: attachment; filename=\"$this->docFile\"");
            echo $doc;
            return true;
         }
         else
         {
            return $this->write_file($this->docFile,$doc);
         }
      }

      /**
       * Parse the html and remove <head></head> part if present into html
       *
       * @param String $html
       * @return void
       * @access Private
       */

      function _parseHtml($html)
      {
         $html=preg_replace("/<!DOCTYPE((.|\n)*?)>/ims","",$html);
         $html=preg_replace("/<script((.|\n)*?)>((.|\n)*?)<\/script>/ims","",$html);
         preg_match("/<head>((.|\n)*?)<\/head>/ims",$html,$matches);
         $head=$matches[1];
         preg_match("/<title>((.|\n)*?)<\/title>/ims",$head,$matches);
         $this->title = $matches[1];
         $html=preg_replace("/<head>((.|\n)*?)<\/head>/ims","",$html);
         $head=preg_replace("/<title>((.|\n)*?)<\/title>/ims","",$head);
         $head=preg_replace("/<\/?head>/ims","",$head);
         $html=preg_replace("/<\/?body((.|\n)*?)>/ims","",$html);
         $this->htmlHead=$head;
         $this->htmlBody=$html;
         return;
      }

      /**
       * Write the content int file
       *
       * @param String $file :: File name to be save
       * @param String $content :: Content to be write
       * @param [Optional] String $mode :: Write Mode
       * @return void
       * @access boolean True on success else false
       */

      function write_file($file,$content,$mode="w")
      {
         $fp=@fopen($file,$mode);
         if(!is_resource($fp))
            return false;
         fwrite($fp,$content);
         fclose($fp);
         return true;
      }

   }
?>


Sample Usage
Code: Select all
<?
   @require_once("html-to-doc.php");

   $obj = new HTML_TO_DOC( );

   // From a file
   $obj->createDoc("test.html". "test.doc");
   
   // From a URL
   $obj->createDocFromURL("http://www.GeoSourceCode.com", "GeoSourceCode.doc");
?>
MT Shahzad
Web/Software Developer
http://mts.sw3solutions.com
User avatar
MT Shahzad
Site Admin
 
Posts: 300
Joined: February 29th, 2008, 8:11 am
Location: Muridke, Pakistan

Return to PHP / MySQL / XML

Who is online

Users browsing this forum: No registered users and 0 guests

cron