ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルを使用した Word ドキュメントのエクスポートの原則と例

PHP_PHP チュートリアルを使用した Word ドキュメントのエクスポートの原則と例

WBOY
WBOYオリジナル
2016-07-13 10:26:00791ブラウズ

原則

一般に、ドキュメントドキュメントをエクスポートするには 2 つの方法があります。1 つは com を使用し、PHP の拡張ライブラリとしてサーバーにインストールし、com を作成してそのメソッドを呼び出す方法です。 Office がインストールされているサーバーは、word.application という名前の com を呼び出して Word ドキュメントを生成できます。ただし、この方法は実行効率が比較的低いため、お勧めしません (テストしたところ、コードの実行時にサーバーが実際には Word クライアントを開きます)。理想的な com にはインターフェイスがなく、データ変換がバックグラウンドで実行されるため、効果は高くなりますが、これらの拡張機能は通常、料金が必要です。
2 番目の方法は、PHP を使用して、doc ドキュメントのコンテンツを接尾辞 doc を持つファイルに直接書き込む方法です。この方法を使用すると、サードパーティの拡張機能に依存する必要がなく、実行効率が高くなります。
Word 自体の機能は依然として非常に強力で、拡張子が doc であっても、HTML 形式でファイルを開くことができます。これは私たちに利便性をもたらします。しかし、問題があります。HTML 形式ファイル内の画像にはアドレスが 1 つしかなく、実際の画像は別の場所に保存されます。つまり、HTML 形式がドキュメントに記述されている場合、ドキュメントにはそのアドレスを含めることができません。ピクチャー。では、画像を含むドキュメント文書を作成するにはどうすればよいでしょうか? html に非常に近い mht 形式を使用できます。
mht 形式は html に非常に似ていますが、mht 形式では、画像、JavaScript、CSS などの外部リンクからのファイルがエンコードされ、base64 で保存される点が異なります。したがって、1 つの mht ファイルで Web ページ内のすべてのリソースを保存できます。当然、そのサイズは html よりも大きくなります。
mht形式はwordで認識できますか? Web ページを mht として保存し、サフィックスを doc に変更して Word で開きました。Word は mht ファイルも認識し、画像を表示できます。
さて、doc が mht を認識できるようになったので、次のステップは mht に写真を入れる方法を検討することです。 imgタグのsrc属性にはhtmlコード中の画像のアドレスが記述されているので、htmlコード中のsrc属性の値を抽出すれば画像のアドレスを取得することができます。もちろん、取得したものが相対パスである可能性もありますが、URL の接頭辞を追加して絶対パスに変更するだけで問題はありません。画像アドレスを使用すると、file_get_content 関数を通じて画像ファイルの特定のコンテンツを取得し、base64_encode 関数を呼び出してファイルのコンテンツを Base64 エンコードにエンコードし、最後に mht ファイルの適切な場所に挿入できます。
最後に、ファイルをクライアントに送信するには 2 つの方法があります。1 つは、最初にサーバー側で doc ドキュメントを生成し、最後に header("location:xx.doc" を通じて doc ドキュメントのアドレスを記録する) です。 ) ; クライアントがこのドキュメントをダウンロードできるようにします。もう 1 つの方法は、HTML リクエストを直接送信し、HTML プロトコルのヘッダー部分を変更し、その content-type を application/doc に設定し、content-disposition を Attachment に設定し、その後に HTML プロトコルを直接送信することです。ファイルの内容はクライアントに送信され、クライアントを doc ドキュメントにダウンロードすることもできます。

達成しました

上記の原理の紹介を通じて、皆さんは実装プロセスを予備的に理解できると思います。この関数には HTML コードを mht ドキュメントにエクスポートできます。そのうちの 2 つはパラメータです。オプションのパラメータ
content: 変換される HTML コード
absolutePath: HTML コード内の画像アドレスがすべて相対パスの場合、このパラメータは HTML コードに欠落している絶対パスです。
isEraseLink: HTML コード内のハイパーリンクを削除するかどうか
戻り値は mht のファイル内容です。file_put_content を介して接尾辞 doc を付けてファイルとして保存できます。この関数の主な機能は、実際には、ファイル内のすべての画像アドレスを分析することです。 HTML コードをダウンロードし、1 つずつダウンロードします。画像のコンテンツを取得した後、MhtFileMaker クラスを呼び出して、画像を mht ファイルに追加します。追加の具体的な詳細は MhtFileMaker クラスにカプセル化されます。

コードをコピーします コードは次のとおりです:

/**
* HTML コードに基づいて Word ドキュメントのコンテンツを取得します
* 本質的に mht であるドキュメントを作成します この関数は、ファイルのコンテンツを分析し、リモートの場所からページ内の画像リソースをダウンロードします
* この関数はクラス MhtFileMaker に依存します
*この関数は img タグを解析し、src の属性値を抽出します。ただし、src の属性値は引用符で囲む必要があります。そうしないと抽出できません
*
* @param string $content HTML コンテンツ
* @param string $absolutePath Web ページの絶対パス。 HTML コンテンツ内の画像パスが相対パスの場合、関数が自動的に絶対パスに入力できるように、このパラメータを入力する必要があります。このパラメータは /
で終わる必要があります * @param bool $isEraseLink HTML コンテンツ内のリンクを削除するかどうか
* by www.jb51.net
*/
function getWordDocument( $content , $absolutePath = "" , $isEraseLink = true )
{
$mht = new MhtFileMaker();
if ($isEraseLink)
$content = preg_replace ('/(s*.*?s*)/i' , '$1' , $content); $images = array();

$files = array();
$matches = array();
//このアルゴリズムでは、src の後の属性値を引用符で囲む必要があります
if ( preg_match_all('/< img [.n]*?srcs*?=s*?["'](.*?)["'](.*?)/>/i',$content ,$matches ) )
$arrPath = $ match [1] else
$imgpath = $absolutepath;
}
$iMAGES [] = $imgpath; ml ",, $mht->GetMimeType("tmp.html"),$content);

for ( $i=0;$i {
$image = $images[$i ];
tents($files[$i], $mht->GetMimeType($image) ,$imgcontent);


return $mht->GetFile();
}





使用方法:





コードをコピーします

コードは次のとおりです:


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

このうち、$content 変数は HTML ソース コードである必要があり、次のリンクは HTML コード内の画像の相対パスを入力できる URL アドレスである必要があります。
この関数を使用する前に、次のことを行う必要があることに注意してください。 MhtFileMaker クラスを含めます。このクラスは Mht ドキュメントの生成に役立ちます。

コードをコピーします コードは次のとおりです:

/***********************************************************************
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 ('ファイルは追加されませんでした。');
} //www.jb51. net
$contents = implode("rn", $this->headers);
$contents .= "rn";
$contents .= "MIME-Version: 1.0rn";
$contents .= "Content-タイプ: multipart/popular;rn";
$contents .= "tboundary="{$this->boundary}";rn";
$contents .= "ttype="" . ]['mimetype'] . ""rn";
$contents .= "X-MimeOLE: Mht File Maker v1.0 betarn によって作成されました";
$contents .= "rn";
$contents .= "これはMIME 形式のマルチパート メッセージ。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-場所:$ file [filepath] rn ";
$ contents。=" rn ";
$ contents。= $ file ['filecont']; $ 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;
デフォルト: $mimetype = 'application/octet-stream'; Break;
}
return $mimetype;
}
}
?>

上記では、PHP で mht ファイルを介して doc 形式をエクスポートする方法について説明しました。この方法では、エクスポートされた doc ファイルに画像を含めるという難しい問題を解決できます。もちろん、CSS スタイル シートなどのさらに多くのコンテンツを含める必要がある場合は、正規表現を使用してファイル内のリンク タグを分析するだけです。 HTML コードと CSS の抽出 次に、スタイル ファイルのアドレスが読み取られて、base64 にエンコードされ、最後に mht ファイルに追加されます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/824888.html技術記事原則として、ドキュメント ドキュメントをエクスポートするには 2 つの方法があります。1 つは com を使用し、PHP の拡張ライブラリとしてサーバーにインストールし、com を作成してそのメソッドを呼び出す方法です。インストール...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。