-
- /**
- * 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 , 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 links in HTML content
- */
- function getWordDocument( $content , $absolutePath = "" , $isEraseLink = true )
- {
- $mht = new MhtFileMaker();
- if ( $isEraseLink)
- $content = preg_replace('/(s*.*?s*)/i' , '$1' , $content); // Remove the 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('/< ;img[.n]*?srcs*?=s*?["'](.*?)["'](.*?)/>/i',$content ,$matches ) )
- {
- $arrPath = $matches[1];
- for ( $i=0;$i{
- $path = $arrPath[$i];
- $imgPath = trim( $path );
- if ( $imgPath != "" )
- {
- $files[] = $imgPath;
- if( substr($imgPath,0,7) == 'http://')
- {
- //Absolutely Link, without prefix
- }
- else
- {
- $imgPath = $absolutePath.$imgPath;
- }
- $images[] = $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 )
- $mht->AddContents($files[$i] ,$mht->GetMimeType($image),$imgcontent);
- }
- else
- {
- echo "file:".$image." not exist!
";
- }
- }
- return $mht->GetFile();
- }
Copy code
Usage:
-
- $fileContent = getWordDocument($content,"http://www.yoursite.com/Music/etc/");
- $fp = fopen("test.doc", ' w');
- fwrite($fp, $fileContent);
- fclose($fp);
Copy code 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. This class can help us generate Mht documents.
- /***********************************************************************
- Class: Mht File Maker
- Version: 1.2 beta
- link: http://bbs.it-home.org
- 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.');
- }
- $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;
- }
- }
- ?>
复制代码
|