ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルで Web ページを Word ドキュメントにエクスポートするコード

PHP_PHP チュートリアルで Web ページを Word ドキュメントにエクスポートするコード

WBOY
WBOYオリジナル
2016-07-21 15:18:39693ブラウズ

一般に、ドキュメント ドキュメントをエクスポートするには 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. " ); クライアントがドキュメントをダウンロードできるようにします。もう 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 コンテンツ内のリンクを削除するかどうか
*/
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('/PHP_PHP チュートリアルで Web ページを Word ドキュメントにエクスポートするコード{
$arrPath = $matches [1] ;
for ( $i=0;$i$path = $arrPath[$i];
$imgPath = トリム( $path ); $imgPath ! = "" )
{
$files[] = $imgPath;
if( substr($imgPath,0,7) == 'http://')
{
//接頭辞なしの絶対リンク
}
else
{
$imgPath = $absolutePath.$imgPath;
}
$images[] = $imgPath;
}
}
$mht->AddContents("tmp.html",$mht-> ;GetMimeType ("tmp.html"),$content);
for ( $i=0;$i{
$image = $images[$i]; @fopen ($image , 'r') )
{
$imgcontent = @file_get_contents( $image );
if ( $content )
$mht->AddContents($files[$i],$mht->; GetMimeType( $image),$imgcontent);
}
else
{
echo "file:".$image." が存在しません!

}
}
return $mht->GetFile () ;
}


使用法:


コードをコピー
コードは次のとおりです: $fileContent = getWordDocument($content,"http://www.yoursite.com/Music/etc/ "); $fp = fopen("test.doc", 'w');
fwrite($fp, $fileContent);
fclose($fp);


その中で、$content 変数はHTML ソース コード、および次のリンクは、HTML コード内の画像の相対パスを入力できる URL アドレスである必要があります。この関数を使用する前に、このクラスを生成するのに役立つクラス MhtFileMaker を含める必要があることに注意してください。書類。


コードをコピーします

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

/*************************************************** *******************
クラス: Mht File Maker
バージョン: 1.2 ベータ版
日付: 02/11/2007
作成者: Wudi
説明: このクラスは .mht ファイルを作成できます。
************************************************ **********************/
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 = strto lower(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");
}
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 ('最初のページを設定しません。');
}
$filepath = str_replace($this->dir_base, '', $this->page_first);
$filepath = 'http://mhtfile' 。 $ファイルパス;
$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' 。 $ファイルパス;
$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 {
TRUE を返します。
}
}
function GetFile(){
$this->CheckHeaders();
if (!$this->CheckFiles()) {
exit ('ファイルは追加されませんでした。');
}
$contents = implode("rn", $this->headers);
$contents .= "rn";
$contents .= "MIME バージョン: 1.0rn";
$contents .= "Content-Type: multipart/relative;rn";
$contents .= "tboundary="{$this->boundary}";rn";
$contents .= "ttype="" . $this->files[0]['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 .= "コンテンツタイプ: $file[mimetype]rn";
$contents .= "コンテンツ転送エンコーディング: $file[encoding]rn";
$contents .= "コンテンツの場所: $file[ファイルパス]rn";
$contents .= "rn";
$contents .= $file['filecont'];
$contents .= "rn";
}
$contents .= "--{$this->境界}--rn";
$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'; html': $mimetype = 'text/html';
case 'txt': $mimetype = 'text/plain';
case 'cgi': $mimetype = 'text/plain'; 'php': $mimetype = 'text/plain';
case 'css': $mimetype = 'image/jpeg'; case 'jpeg': $mimetype = 'image/jpeg';
case 'jpe': $mimetype = 'image/gif';
case 'png': $mimetype = 'image/png';
default: $mimetype = 'application/octet-stream';
return $mimetype;





http://www.bkjia.com/PHPjc/325436.html

www.bkjia.com

tru​​e
http://www.bkjia.com/PHPjc/325436.html

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