<?php


/**
 * Convert HTML to MS Word file
 *
 * @author Harish Chauhan
 * @version 1.0.0
 * @name HTML_TO_DOC
 * @see http://www.apnacode.com/wp-content/uploads/2015/02/html_to_doc.php_.txt
 */
class HTML_TO_DOC
{


    var $docFile = "";


    var $title = "";


    var $htmlHead = "";


    var $htmlBody = "";


    /**
     * Constructor
     *
     * @return void
     */
    function __construct() {
        $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;
    }
}
