ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルで Web ページを Word ファイルとして保存する 3 つの方法

PHP_PHP チュートリアルで Web ページを Word ファイルとして保存する 3 つの方法

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

1. PHP で単語を生成するための 2 つのアイデアまたは原則

1. Windows で com コンポーネントを使用します
2. PHP を使用してコンテンツを doc ファイルに書き込みます
具体的な実装方法は次のとおりです。

2. Windows で com コンポーネントを使用します

原則: com は PHP の拡張クラスであり、office がインストールされているサーバーは自動的に word.application の com を呼び出し、PHP 公式ドキュメント マニュアル: http://www.php.net/manual/en/ を自動的に生成します。クラス.com.php

公式の例を使用してください:

コードをコピーします コードは次のとおりです:
// starting word
$word = new COM("word.application") or die("Unable to instantiate Word");
echo "Loaded Word, version {$word->Version}n";

//前面に表示
$word->Visible = 1;

//空の文書を開きます
$word->ドキュメント->Add();

//何か奇妙なことをしてください
$word->Selection->TypeText("これはテストです...");
$word->Documents[1]- >SaveAs( "Useless test.doc");

//単語を閉じる
$word->Quit();

//オブジェクトを解放する
$word = null;
?>

個人的な提案: com インスタンス以降 このメソッドの意味を知るには公式ドキュメントを参照する必要がありますが、エディターにはコード プロンプトがないため、非常に不便です 。

3. PHPを使用してコンテンツをdocファイルに書き込みます
この方法は2つの方法に分けられます

1. mht 形式 (HTML に非常に似ています) を生成し、Word に書き込みます
2. 純粋な HTML 形式を Word に書き込みます


1)、mht 形式 (HTML に非常に似ています) を生成し、Word に書き込みます

コードをコピーします コードは次のとおりです:
/**
* 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('//i',$content ,$matches ) )
;
if ( $imgPath ! = "")
//絶対リンク、プレフィックスなし
elles $ mht-> addcontents( "tmp.html"、$ mht-> getmimeType( "tmp.html")、$ content); $i=0;$i {
$image = $images[$i];
if ( @ fopen($image, 'r') )
$imgcontent = mht- >GetMimeType ($image),$imgcontent);
Return $mht->GetFile ();
}

この関数の主な機能は、実際には、HTML コード内のすべての画像アドレスを分析し、それらを 1 つずつダウンロードすることです。画像のコンテンツを取得した後、MhtFileMaker クラスを呼び出して、画像を mht ファイルに追加します。追加の具体的な詳細は MhtFileMaker クラスにカプセル化されます。

利用方法1:リモート呼び出し

コードをコピー コードは以下の通りです:
$url= http://www.***.com;

$content = file_get_contents($url);

$fileContent = getWordDocument($content,"http://www.yoursite.com/Music/etc/");
$fp = fopen("test.doc", 'w');
fwrite($fp , $fileContent) ;
fclose($fp);
このうち、$content 変数は HTML ソース コードである必要があり、次のリンクは HTML コード内の画像の相対パスを記入できる URL アドレスである必要があります


このうち、$content変数はHTMLソースコードである必要があり、次のリンクはHTMLコード内の画像の相対パスを埋めることができるURLアドレスである必要があります

使用方法 2: ローカルで生成された呼び出し

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

header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no -cache") ;
$wordStr = 'PHP チュートリアル Web サイト--jb51.net';
$fileContent = getWordDocument($wordStr);
$fileName = iconv("utf-8", "GBK", 'PHP チュートリアル' . '_' . $intro . rand(100, 999));
header("Content-Disposition: 添付ファイル名 = . ".doc ");
この関数を使用する前に、MhtFileMaker クラスを含める必要があることに注意してください。このクラスは Mht ドキュメントの生成に役立ちます。

コードをコピーします

コードは次のとおりです:
/*************************************************** *******************
クラス: Mht File Maker
バージョン: 1.2 beta
日付: 2007/02/11
作成者: 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") ;
}

関数 SetDate($date = NULL, $istimestamp = FALSE){
if ($date == NULL) {
$date = time();
}
if ($istimestamp = = 本当) {
$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;
}
}

関数 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' 。 $filepath;
$this->AddFile($this->page_first, $filepath, NULL);
$this->AddDir($this->dir_base);
}

関数 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' $ファイルパス,
$mimetype,
'filecont' => 'encoding' => $encoding);
}

関数 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;
}
}

関数 GetFile() {
$this->CheckHeaders();
if (!$this->CheckFiles()) {
exit ('ファイルは追加されませんでした。');
}
$contents = implode("rn", $ this->headers);
$contents .= "rn";
$contents .= "MIME-Version: 1.0rn";
$contents .= "Content-Type: multipart/popular;rn";
$contents .= "tboundary="{$this->境界}";rn";
$contents .= "ttype="" . $this->files[0]['mimetype'] . ""rn";
$contents .= "X-MimeOLE: Mht ファイルによって生成Maker v1.0 betarn";
$contents .= "rn";
$contents .= "これは MIME 形式のマルチパート メッセージです。rn";
$contents .= "rn";
foreach ($this ->ファイルを $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;
}

関数ファイル( $filename){
$contents = $this->GetFile();
$fp = fopen($filename, 'w');
fwrite($fp, $contents);
fclose($fp);
}

関数 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;
}
}
?>

ポイント评:この方法の欠点は、承認量生成のダウンロードをサポートしていないため、1 つのヘッダーが 1 つあるためです(無论远程使用は本件で承認されており、ヘッダー面のみを出力できます)、循環生成の場合、結果も 1 つだけです単語生成(もちろん上面を修正できる方法で来实现)

2.纯HTML格式写入word

原理:

ob_start を利用して html 页面先存储起来(解决一下页面多个ヘッダー、大量生成可能)、その後、doc 文档コンテンツの書き込みに利用

代記入:

复制代記入代記入如下:
class word
{
function start()
{
ob_start();
echo ' xmlns:w= "urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">';
}
関数 save($path)
{

echo "";
$data = ob_get_contents();
ob_end_clean();

$this->wirtefile ($path,$data);
}

function wirtefile ($fn,$data) )
{
$fp=fopen($fn,"wb");
fwrite($fp,$data);
fclose($fp);
}
}

复制代 代码如下:
$html = '











PHP10086

最新の PHP 技術分享网站




';

//批量生成
for($i=1;$i $word = new word();
$word->start();
//$html = "aaa".$i;
$wordname = 'PHP教程网站--jb51.net'.$i.".doc";
echo $html;
$word->save($wordname);
ob_flush();//每次执行前刷新缓存
flush();
}

人点评:这种方法效果最好,原因三个: 最初の代価比较简洁、容易に理解できます

2番目は批量生成単語のサポート(これは重要)です
3番目は完全なhtml代コードのサポートです

http://www.bkjia.com/PHPjc/748163.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/748163.html技術記事一、PHP で単語を生成する 2 つの考え方または原理 1. Windows 下のコンポーネントを利用する 2. PHP を利用してドキュメントファイルにコンテンツを書き込む 具体的な実現方法は次のとおりです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHP10086 http://www.jb51.net
PHP10086 http://www.jb51.net