Home  >  Article  >  Backend Development  >  Principles and examples of exporting Word documents using PHP_PHP tutorial

Principles and examples of exporting Word documents using PHP_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:26:00787browse

Principle

Generally, there are two ways to export doc documents. One is to use com and install it on the server as an extension library of PHP, then create a com and call its methods. A server with office installed can call a com called word.application to generate a word document. However, I do not recommend this method because the execution efficiency is relatively low (I tested it and found that when executing the code, the server will actually Open a word client). The ideal com should have no interface and perform data conversion in the background, so the effect will be better, but these extensions generally require charges.
The second method is to use PHP to directly write the content of our doc document into a file with the suffix doc. Using this method does not require relying on third-party extensions, and the execution efficiency is higher.
The function of word itself is still very powerful. It can open files in html format and retain the format. Even if the suffix is ​​doc, it can still open it normally. This provides us with convenience. But there is a problem. The pictures in the HTML format file have only one address, and the real pictures are saved elsewhere. That is to say, if the HTML format is written into the doc, the doc will not be able to contain the pictures. So how do we create a doc document containing images? We can use the mht format which is very close to html.
The mht format is very similar to html, except that in the mht format, files from external links, such as images, Javascript, and CSS, will be encoded and stored in base64. Therefore, a single mht file can save all the resources in a web page. Of course, its size will be larger than that of html.
Can the mht format be recognized by word? I saved a web page as mht, then changed the suffix to doc, and then opened it with word. OK, word can also recognize mht files and can display pictures.
Okay, now that doc can recognize mht, the next step is to consider how to put pictures into mht. Since the address of the image in the html code is written in the src attribute of the img tag, as long as the src attribute value in the html code is extracted, the image address can be obtained. Of course, it is possible that what you get is a relative path. It doesn't matter. Just add the prefix of the URL and change it to an absolute path. With the image address, we can obtain the specific content of the image file through the file_get_content function, then call the base64_encode function to encode the file content into base64 encoding, and finally insert it into the appropriate location of the mht file.
Finally, we have two methods to send the file to the client. One is to first generate a doc document on the server side, and then record the address of the doc document. Finally, through header("location:xx.doc "); allows the client to download this doc. Another method is to directly send an html request, modify the header part of the HTML protocol, set its content-type to application/doc, set content-disposition to attachment, followed by the file name. After sending the html protocol, directly The file content is sent to the client, and the client can also be downloaded to the doc document.

Achievement

Through the above introduction to the principles, I believe everyone should have a preliminary understanding of the implementation process. Below I will give an export function. This function can export the HTML code into an mht document. There are 3 parameters, of which the last 2 optional parameters
content: HTML code to be converted
absolutePath: If the image addresses in the HTML code are all relative paths, then this parameter is the absolute path missing in the HTML code.
isEraseLink: Whether to remove hyperlinks in HTML code
The return value is the file content of mht. You can save it as a file with the suffix doc through file_put_content
The main function of this function is actually to analyze HTML All image addresses in the code and download them one by one. After obtaining the content of the image, call the MhtFileMaker class to add the image to the mht file. The specific adding details are encapsulated in the MhtFileMaker class.

Copy code The code is as follows:

/**
* Get word document content based on HTML code
* Create a document that is essentially mht. This function will analyze the file content and download the image resources in the page from a remote location
* This function depends on the class MhtFileMaker
* This function will analyze the img tag and extract the attribute value of src. However, the attribute value of src must be surrounded by quotes, otherwise it cannot be extracted.
*
* @param string $content HTML content
* @param string $absolutePath The absolute path of the web page. If the image path in the HTML content is a relative path, then you need to fill in this parameter to let the function automatically fill it into an absolute path. This parameter needs to end with /
* @param bool $isEraseLink Whether to remove the link in the HTML content
* by www.jb51.net
*/
function getWordDocument( $content , $absolutePath = "" , $isEraseLink = true )
{
$mht = new MhtFileMaker();
if ($isEraseLink)
$content = preg_replace('/(s*.*?s*)/i' , '$1' , $content); //Remove link

$images = array();
$files = array();
$matches = array();
//This algorithm requires that the attribute value after src must be enclosed in quotes
if ( preg_match_all('//i',$content ,$matches ) )
{
$arrPath = $matches[1];
for ( $i=0;$i {
$path = $arrPath[$i];
                                                                                                                                 < B> If (SUBSTR ($ imgpath, 0,7) == 'http:///')
{
// Absolute link, no prefix
}
else
{
                $imgPath = $absolutePath.$imgPath;
                                                                                                                                     🎜> }
}
$mht->AddContents("tmp .html",$mht->GetMimeType("tmp.html"),$content);

for ( $i=0;$i {
$image = $images[$i];
if ( @fopen($image , 'r') )
{
$imgcontent = @file_get_contents( $image );
if ( $content )
                                                                                                                                                                                                                                                                                           Since 🎜>                 echo "file:".$image." not exist!
";
                                                                                                                                                                                                                          not exist!
}





Usage:





Copy code

The code is as follows:

$fileContent = getWordDocument($content,"http://www.jb51.net /Music/etc/");$fp = fopen("test.doc", 'w');

fwrite($fp, $fileContent);
fclose($fp);

Among them, the $content variable should be the HTML source code, and the following link should be the URL address that can fill in the relative path of the image in the HTML code.
Note that before using this function, you need to include the class MhtFileMaker. Can help us generate Mht documents.

Copy code The code is as follows:

/***********************************************************************
Class: Mht File Maker
Version: 1.2 beta
Author: Wudi
Description:  The class can make .mht file.
***********************************************************************/

class MhtFileMaker{
    var $config = array();
    var $headers = array();
    var $headers_exists = array();
    var $files = array();
    var $boundary;
    var $dir_base;
    var $page_first;

    function MhtFile($config = array()){

    }

    function SetHeader($header){
        $this->headers[] = $header;
        $key = strtolower(substr($header, 0, strpos($header, ':')));
        $this->headers_exists[$key] = TRUE;
    }

    function SetFrom($from){
        $this->SetHeader("From: $from");
    }

    function SetSubject($subject){
        $this->SetHeader("Subject: $subject");
    }

    function SetDate($date = NULL, $istimestamp = FALSE){
        if ($date == NULL) {
            $date = time();
        }
        if ($istimestamp == TRUE) {
            $date = date('D, d M Y H:i:s O', $date);
        }
        $this->SetHeader("Date: $date");
    }

    function SetBoundary($boundary = NULL){
        if ($boundary == NULL) {
            $this->boundary = '--' . strtoupper(md5(mt_rand())) . '_MULTIPART_MIXED';
        } else {
            $this->boundary = $boundary;
        }
    }

    function SetBaseDir($dir){
        $this->dir_base = str_replace("\\", "/", realpath($dir));
    }

    function SetFirstPage($filename){
        $this->page_first = str_replace("\\", "/", realpath("{$this->dir_base}/$filename"));
    }

    function AutoAddFiles(){
        if (!isset($this->page_first)) {
            exit ('Not set the first page.');
        }
        $filepath = str_replace($this->dir_base, '', $this->page_first);
        $filepath = 'http://mhtfile' . $filepath;
        $this->AddFile($this->page_first, $filepath, NULL);
        $this->AddDir($this->dir_base);
    }

    function AddDir($dir){
        $handle_dir = opendir($dir);
        while ($filename = readdir($handle_dir)) {
            if (($filename!='.') && ($filename!='..') && ("$dir/$filename"!=$this->page_first)) {
                if (is_dir("$dir/$filename")) {
                    $this->AddDir("$dir/$filename");
                } elseif (is_file("$dir/$filename")) {
                    $filepath = str_replace($this->dir_base, '', "$dir/$filename");
                    $filepath = 'http://mhtfile' . $filepath;
                    $this->AddFile("$dir/$filename", $filepath, NULL);
                }
            }
        }
        closedir($handle_dir);
    }

    function AddFile($filename, $filepath = NULL, $encoding = NULL){
        if ($filepath == NULL) {
            $filepath = $filename;
        }
        $mimetype = $this->GetMimeType($filename);
        $filecont = file_get_contents($filename);
        $this->AddContents($filepath, $mimetype, $filecont, $encoding);
    }

    function AddContents($filepath, $mimetype, $filecont, $encoding = NULL){
        if ($encoding == NULL) {
            $filecont = chunk_split(base64_encode($filecont), 76);
            $encoding = 'base64';
        }
        $this->files[] = array('filepath' => $filepath,
                               'mimetype' => $mimetype,
                               'filecont' => $filecont,
                               'encoding' => $encoding);
    }

    function CheckHeaders(){
        if (!array_key_exists('date', $this->headers_exists)) {
            $this->SetDate(NULL, TRUE);
        }
        if ($this->boundary == NULL) {
            $this->SetBoundary();
        }
    }

    function CheckFiles(){
        if (count($this->files) == 0) {
            return FALSE;
        } else {
            return TRUE;
        }
    }

    function GetFile(){
        $this->CheckHeaders();
        if (!$this->CheckFiles()) {
            exit ('No file was added.');
        } //www.jb51.net
        $contents = implode("rn", $this->headers);
        $contents .= "rn";
        $contents .= "MIME-Version: 1.0rn";
        $contents .= "Content-Type: multipart/related;rn";
        $contents .= "tboundary="{$this->boundary}";rn";
        $contents .= "ttype="" . $this->files[0]['mimetype'] . ""rn";
        $contents .= "X-MimeOLE: Produced By Mht File Maker v1.0 betarn";
        $contents .= "rn";
        $contents .= "This is a multi-part message in MIME format.rn";
        $contents .= "rn";
        foreach ($this->files as $file) {
            $contents .= "--{$this->boundary}rn";
            $contents .= "Content-Type: $file[mimetype]rn";
            $contents .= "Content-Transfer-Encoding: $file[encoding]rn";
            $contents .= "Content-Location: $file[filepath]rn";
            $contents .= "rn";
            $contents .= $file['filecont'];
            $contents .= "rn";
        }
        $contents .= "--{$this->boundary}--rn";
        return $contents;
    }

    function MakeFile($filename){
        $contents = $this->GetFile();
        $fp = fopen($filename, 'w');
        fwrite($fp, $contents);
        fclose($fp);
    }

    function GetMimeType($filename){
        $pathinfo = pathinfo($filename);
        switch ($pathinfo['extension']) {
            case 'htm': $mimetype = 'text/html'; break;
            case 'html': $mimetype = 'text/html'; break;
            case 'txt': $mimetype = 'text/plain'; break;
            case 'cgi': $mimetype = 'text/plain'; break;
            case 'php': $mimetype = 'text/plain'; break;
            case 'css': $mimetype = 'text/css'; break;
            case 'jpg': $mimetype = 'image/jpeg'; break;
            case 'jpeg': $mimetype = 'image/jpeg'; break;
            case 'jpe': $mimetype = 'image/jpeg'; break;
            case 'gif': $mimetype = 'image/gif'; break;
            case 'png': $mimetype = 'image/png'; break;
            default: $mimetype = 'application/octet-stream'; break;
        }
        return $mimetype;
    }
}
?>

The above discussed how to export doc format by PHP through mht file. This method can solve a difficult problem, which is to make the exported doc file contain images. Of course, if you want to include more content, such as CSS style sheets, you only need to use regular expressions to analyze the link tags in the HTML code and extract the css The address of the style file is then read and encoded into base64, and finally added to the mht file.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/824888.htmlTechArticleThe principle is general. There are two ways to export doc documents. One is to use com and as an extension of php The library is installed on the server, then a com is created and its methods are called. Install...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn