一般に、ドキュメント ドキュメントをエクスポートするには 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 ドキュメントを生成し、次に doc ドキュメントのアドレスを記録する方法です。最後に、header("location. : xx.doc"); クライアントはこのドキュメントをダウンロードできます。もう 1 つの方法は、HTML リクエストを直接送信し、HTML プロトコルのヘッダー部分を変更し、その content-type を application/doc に設定し、content-disposition を Attachment に設定し、その後に HTML プロトコルを直接送信することです。ファイルの内容はクライアントに送信され、クライアントを doc ドキュメントにダウンロードすることもできます。
実装
上記の原則の導入を通じて、誰もが実装プロセスを予備的に理解できると思います。以下にこの関数を示します。 HTML コードを mht ドキュメントにエクスポートできます。パラメータは 3 つあり、最後の 2 つはオプションのパラメータです。
content: 変換される HTML コード
absolutePath: HTML コード内の画像アドレスがすべて相対パスである場合。 , then このパラメータは、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('/
$images = array();
$matches = array(); // このアルゴリズムには次の属性が必要ですsrc 値は引用符で囲む必要があります
if ( preg_match_all('//i',$content ,$matches ) )
{
$arrPath = $matches[1]
for ( $i=0;$i
$path = $arrPath[$i];
$imgPath = トリム( $path );
if ( $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];
if ( @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() ;
}
使用法:
コードをコピー
コードは次のとおりです:
$fp = fopen("test.doc", 'w'); ($fp, $fileContent); fclose($fp); このうち、$content 変数は HTML ソース コードである必要があり、次のリンクはその URL アドレスである必要があります。 HTML コードに画像の相対パスを入力できます
この関数を使用する前に、MhtFileMaker クラスを含める必要があることに注意してください。このクラスは、Mht ドキュメントの生成に役立ちます。
コードをコピー
コードは次のとおりです:
/*************************************************** *******************
クラス: 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: $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 ,
'エンコーディング' =>
}
function CheckHeaders(){
if (!array_key_exists('date', $this->headers_exists)) {
$this->SetDate(NULL, TRUE);
}
if ($this->boundary == NULL) {
$this->SetBoundary();
}
}
関数 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/popular;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";
$content を返す;
}
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';壊す;
case 'php': $mimetype = 'text/plain';壊す;
case 'css': $mimetype = 'text/css';壊す;
ケース 'jpg': $mimetype = 'image/jpeg';壊す;
case 'jpeg': $mimetype = 'image/jpeg';壊す;
case 'jpe': $mimetype = 'image/jpeg';壊す;
ケース 'gif': $mimetype = 'image/gif';壊す;
ケース 'png': $mimetype = 'image/png';壊す;
デフォルト: $mimetype = 'application/octet-stream';壊す;
}
return $mimetype;
}
}
?>