格式能被word識別嗎?如何創(chuàng)建doc文檔?
2021-06-28
原理
一般導(dǎo)出doc文檔有兩種方式,一種是使用com作為php的擴(kuò)展庫安裝在服務(wù)器上,然后創(chuàng)建一個com并調(diào)用其方法。安裝好的服務(wù)器可以調(diào)用一個名為word的com。生成word文檔,但是我不推薦這種方式,因為執(zhí)行效率比較低(我測試過php導(dǎo)出word格式數(shù)據(jù)的實(shí)現(xiàn)代碼,在word客戶端執(zhí)行代碼的時候服務(wù)端會實(shí)際打開一個)。理想的com應(yīng)該沒有接口,在后臺進(jìn)行數(shù)據(jù)轉(zhuǎn)換。這個效果會好一些,但是這些擴(kuò)展一般是需要收費(fèi)的。
第二種方法是使用PHP將我們的doc文檔的內(nèi)容直接寫入一個后綴為doc的文件中。使用該方法不需要依賴第三方擴(kuò)展,執(zhí)行效率高。
word本身的功能還是很強(qiáng)大的,可以打開html格式的文件,并且可以保留格式,即使后綴是doc也能正常識別和打開。這為我們提供了便利。但有一個問題。 html格式文件中的圖片只有一個地址,真實(shí)圖片保存在別處。也就是說,如果將 HTML 格式寫入 doc,則 doc 將不包含圖片。那么我們?nèi)绾蝿?chuàng)建一個包含圖片的doc文檔呢?我們可以使用非常接近html的mht格式。
mht 格式與 html 非常相似,只是在 mht 格式中,來自外部鏈接的文件,例如圖片和 CSS 會被編碼和存儲。因此,單個 mht 文件可以保存一個網(wǎng)頁中的所有資源。當(dāng)然,相比html,它的尺寸會更大。
mht格式可以用word識別嗎?我把一個網(wǎng)頁保存為mht,然后修改后綴為doc,然后用word打開,OK,word也能識別mht文件,顯示圖片。
好的,既然doc可以識別mht,接下來就是考慮如何將圖片放入mht。由于html代碼中圖片的地址寫在img標(biāo)簽的src屬性中,所以只要提取html代碼中的src屬性值,就可以得到圖片地址。當(dāng)然有可能你得到的是相對路徑,沒關(guān)系,加上URL前綴,改成絕對路徑即可。有了圖片地址,我們就可以通過函數(shù)獲取圖片文件的具體內(nèi)容,然后調(diào)用函數(shù)將文件內(nèi)容編碼成代碼,最后插入到mht文件的合適位置。
最后,我們有兩種方式將文件發(fā)送到客戶端。一種是先在服務(wù)器端生成一個doc文檔,然后記錄doc文檔的地址,最后通過(":xx.doc");就可以讓客戶端下載這個doc了。另一種是直接發(fā)送html請求,修改html協(xié)議部分,將其-type設(shè)置為/doc,set-to,后跟文件名,發(fā)送html協(xié)議后,直接將文件內(nèi)容發(fā)送到 ,你也可以讓客戶端下載這個doc文件。
實(shí)現(xiàn)
通過以上原理的介紹,相信大家應(yīng)該對實(shí)現(xiàn)過程有了初步的了解。下面我將給出一個導(dǎo)出功能。該函數(shù)可以將 HTML 代碼導(dǎo)出為帶有 3 個參數(shù)的 mht 文檔。 2 為可選參數(shù)
:要轉(zhuǎn)換的HTML代碼
:如果HTML代碼中的圖片地址都是相對路徑,那么這個參數(shù)就是HTML代碼中缺失的絕對路徑。
:是否去除HTML代碼中的超鏈接
返回值為mht的文件內(nèi)容,可以保存為后綴為doc的文件
PHP網(wǎng)頁導(dǎo)出Word文檔的方法分離實(shí)現(xiàn)代碼
這個函數(shù)的主要作用其實(shí)就是分析HTML代碼中的所有圖片地址,依次下載。獲取到圖片內(nèi)容后,調(diào)用類將圖片添加到mht文件中。具體的添加細(xì)節(jié)封裝在類中。
/**
* 根據(jù)HTML代碼獲取word文檔內(nèi)容
* 創(chuàng)建一個本質(zhì)上是mht的文檔php導(dǎo)出word格式數(shù)據(jù)的實(shí)現(xiàn)代碼,這個功能會分析文件的內(nèi)容并遠(yuǎn)程下載頁面中的圖片資源
* 這個函數(shù)依賴于類
* 該函數(shù)會分析img標(biāo)簽,提取src的屬性值。但是src的屬性值必須用引號括起來,否則無法提取
*
*@$HTML 內(nèi)容
* @ $ 網(wǎng)頁的絕對路徑。如果HTML內(nèi)容中的圖片路徑是相對路徑,則需要填寫該參數(shù),使函數(shù)自動填寫絕對路徑。此參數(shù)需要以/結(jié)尾
* @bool $ 是否去除 HTML 內(nèi)容中的鏈接
*/
($, $ = “”, $ = true )
{
$mht = new();
如果 ($)
$ = ('/(\s*.*?\s*)/i', '$1', $); //刪除鏈接
$ = ();
$ = ();
$ = ();
//這個算法要求src后面的屬性值必須用引號括起來
如果 (('/
/i’,$ ,$) )??
{
$ = $[1];
對于 ($i=0;$i{
$path = $[$i];
$=trim($path);
if ($ != “” )
{
$[] = $;
if( ($,0,7) == ‘’)
{
//絕對鏈接,無前綴
}
其他
{
$ = $.$;
}
$[] = $;
}
}
}
$mht->("tmp.html",$mht->("tmp.html"),$);
對于 ($i=0;$i{
$ = $[$i];
if (@($, ‘r’) )
{
$ = @( $ );
如果 ($)
$mht->($[$i],$mht->($),$);
}
其他
{
echo "file:".$." not !
";
}
}
$mht->();
}
使用方法:
$ = ($,”//etc/”);
$fp = ("test.doc", 'w');
($fp, $);
($fp);
其中$變量應(yīng)該是HTML源代碼,下面的鏈接應(yīng)該是可以在HTML代碼中填寫圖片相對路徑的URL地址
注意在使用這個函數(shù)之前,需要先包含這個類,這個類可以幫助我們生成Mht文檔。