是否可以在不使用COM對象的情況下在PHP中讀寫Word(2003和2007)文件? 我知道我可以:使用PHP讀取/寫入MS Word文件
$file = fopen('c:\file.doc', 'w+');
fwrite($file, $text);
fclose();
但Word將讀爲HTML文件不是本機.doc文件。
是否可以在不使用COM對象的情況下在PHP中讀寫Word(2003和2007)文件? 我知道我可以:使用PHP讀取/寫入MS Word文件
$file = fopen('c:\file.doc', 'w+');
fwrite($file, $text);
fclose();
但Word將讀爲HTML文件不是本機.doc文件。
讀二進制Word文檔會根據發佈的文件格式規格爲涉及創建一個解析器DOC格式。我認爲這不是真正可行的解決方案。
您可以使用Microsoft Office XML formats來讀取和寫入Word文件 - 這與Word的2003和2007版本兼容。爲了閱讀,您必須確保Word文檔以正確的格式保存(在Word 2007中稱爲Word 2003 XML-Document)。爲了編寫,你只需要遵循公開可用的XML模式。我從來沒有使用這種格式來寫出PHP中的Office文檔,但是我使用它來讀取Excel工作表(自然保存爲XML-Spreadsheet 2003)並在網頁上顯示其數據。由於這些文件都是純粹的XML數據,因此在內部導航並找出如何提取所需數據是沒有問題的。
另一個選項 - 僅Word 2007選項(如果OpenXML文件格式未安裝在您的Word 2003中) - 將重新編號爲OpenXML。正如databyss指出的here DOCX文件格式只是包含XML文件的ZIP存檔。關於OpenXML文件格式,MSDN上有很多資源,所以你應該能夠弄清楚如何讀取你想要的數據。我認爲寫作會複雜得多 - 這取決於你投入多少時間。
也許你可以看看PHPExcel這是一個能夠使用OpenXML標準寫入Excel 2007文件並從Excel 2007文件讀取的庫。在嘗試讀取和寫入OpenXML Word文檔時,您可以瞭解所涉及的工作。
PHPExcel似乎已經讓[PHPWord](http://phpword.codeplex.com/)創建了word文檔。 – Basic 2012-07-22 16:45:56
我不知道如何在PHP中閱讀本機Word文檔,但是如果您想在PHP中編寫Word文檔,WordprocessingML (aka WordML)可能是一個很好的解決方案。您所要做的就是以正確的格式創建一個XML文檔。我相信Word 2003和2007都支持WordML。
如果沒有COM,很可能您將無法讀取Word文檔。
寫作在這個topic
的Office 2007的.docx覆蓋的應該是可行的,因爲它是一個XML標準。由於這些標準非常龐大,Word 2003很可能需要COM才能閱讀,即使是MS現在發佈的標準也是如此。我還沒有看到許多圖書館都是爲了配合他們而編寫的。
2007年也可能有點複雜。
.docx格式是一個zip文件,其中包含幾個文件夾,其中包含其他文件以用於格式化和其他內容。
將.docx文件重命名爲.zip,您會看到我的意思。
所以,如果你可以在PHP的zip文件中工作,你應該在正確的道路上。
+1,爲答案。 – 2013-07-09 05:25:32
我不知道你打算如何使用它,但我需要.doc支持搜索索引;我所做的是使用一個名爲「catdoc」的小命令行工具;這將Word文檔的內容轉換爲純文本,以便對其進行索引。如果你需要保持格式和東西,這不是你的工具。
這一點也適用VS < Office 2007和它的純PHP,沒有COM廢話,仍試圖找出2007年
<?php
/*****************************************************************
This approach uses detection of NUL (chr(00)) and end line (chr(13))
to decide where the text is:
- divide the file contents up by chr(13)
- reject any slices containing a NUL
- stitch the rest together again
- clean up with a regular expression
*****************************************************************/
function parseWord($userDoc)
{
$fileHandle = fopen($userDoc, "r");
$line = @fread($fileHandle, filesize($userDoc));
$lines = explode(chr(0x0D),$line);
$outtext = "";
foreach($lines as $thisline)
{
$pos = strpos($thisline, chr(0x00));
if (($pos !== FALSE)||(strlen($thisline)==0))
{
} else {
$outtext .= $thisline." ";
}
}
$outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\[email protected]\/\_\(\)]/","",$outtext);
return $outtext;
}
$userDoc = "cv.doc";
$text = parseWord($userDoc);
echo $text;
?>
如果你想保持隱匿性,不要使用它。 – 2012-05-04 15:41:05
我發現一些無法在此函數中解析的特殊字符。 – 2013-07-23 11:24:45
.rtf格式是否適用於您的目的? .rtf可以很容易地轉換成.doc格式,但是它是用明文寫的(嵌入了控制命令)。這是我計劃將我的應用程序與Word文檔集成的方式。
情況是irrelivent問題是天氣或沒有這是可能的,但謝謝。 – UnkwnTech 2009-01-24 11:54:13
引用鏈接已死亡 – 2017-03-19 13:00:20
您可以使用Antiword,它是Linux和最流行的OS免費的MS Word的讀者。
$document_file = 'c:\file.doc';
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file);
這種類型的解決方案存在的問題是,它假定可以在服務器上安裝軟件。 – UnkwnTech 2009-05-24 07:42:04
很長一段時間,但糾正我,如果我錯了。 `C:\ file.doc`是一個windows目錄,`/ usr/local/bin`是一個Linux/Unix目錄? – 2013-04-04 00:54:52
www.phplivedocx.org是基於SOAP的服務,意味着你總是需要測試的文件也沒有爲它的使用足夠的例子在線。奇怪的是,我發現只有在下載2天后(也需要加入zend框架)它的基於SOAP的程序(詛咒我!!!)...我認爲沒有COM它只是不可能在Linux服務器上,唯一的想法是改變另一個可用的文件,PHP可以解析的文檔文件...
即使我正在研究同一種項目[安林字處理器]! 但我選擇了c#.net和ASP.net。但通過我做的調查,我才知道那
使用的Open XML SDK和VSTO [Visual Studio工具對於Office]
,我們可以很容易地用一個字的文件工作,操縱他們,甚至在內部轉換到不同的成多種格式如的.odt,.PDF,.DOCX等。
所以,轉到msdn.microsoft.com和徹底有關Office開發選項卡。它是最簡單的方法,因爲我們需要實現的所有功能已經可以在.net中使用!
但如u想做UR在PHP項目,美國可以在Visual Studio和.NET爲PHP做它也是.NET兼容的語言之一!
我有同樣的情況 我想我將使用一個廉價的50兆窗口爲基礎的託管與免費域名使用它來轉換我的文件,爲PHP服務器。並且鏈接它們很容易。 所有你需要的是製作一個ASP.NET頁面,通過發佈接收doc文件並通過HTTP 回覆它,這麼簡單的CURL就可以做到。
只需更新代碼來處理與PHP Word文件,你會發現有趣的是,與PHPDocX的幫助
<?php
/*****************************************************************
This approach uses detection of NUL (chr(00)) and end line (chr(13))
to decide where the text is:
- divide the file contents up by chr(13)
- reject any slices containing a NUL
- stitch the rest together again
- clean up with a regular expression
*****************************************************************/
function parseWord($userDoc)
{
$fileHandle = fopen($userDoc, "r");
$word_text = @fread($fileHandle, filesize($userDoc));
$line = "";
$tam = filesize($userDoc);
$nulos = 0;
$caracteres = 0;
for($i=1536; $i<$tam; $i++)
{
$line .= $word_text[$i];
if($word_text[$i] == 0)
{
$nulos++;
}
else
{
$nulos=0;
$caracteres++;
}
if($nulos>1996)
{
break;
}
}
//echo $caracteres;
$lines = explode(chr(0x0D),$line);
//$outtext = "<pre>";
$outtext = "";
foreach($lines as $thisline)
{
$tam = strlen($thisline);
if(!$tam)
{
continue;
}
$new_line = "";
for($i=0; $i<$tam; $i++)
{
$onechar = $thisline[$i];
if($onechar > chr(240))
{
continue;
}
if($onechar >= chr(0x20))
{
$caracteres++;
$new_line .= $onechar;
}
if($onechar == chr(0x14))
{
$new_line .= "</a>";
}
if($onechar == chr(0x07))
{
$new_line .= "\t";
if(isset($thisline[$i+1]))
{
if($thisline[$i+1] == chr(0x07))
{
$new_line .= "\n";
}
}
}
}
//troca por hiperlink
$new_line = str_replace("HYPERLINK" ,"<a href=",$new_line);
$new_line = str_replace("\o" ,">",$new_line);
$new_line .= "\n";
//link de imagens
$new_line = str_replace("INCLUDEPICTURE" ,"<br><img src=",$new_line);
$new_line = str_replace("\*" ,"><br>",$new_line);
$new_line = str_replace("MERGEFORMATINET" ,"",$new_line);
$outtext .= nl2br($new_line);
}
return $outtext;
}
$userDoc = "custo.doc";
$userDoc = "Cultura.doc";
$text = parseWord($userDoc);
echo $text;
?>
的一種方式。 你可以看看它的工作原理,看看它的online tutorial。 您可以插入或提取內容,甚至可以將多個Word文件合併成一個文件。
我發現它極不可能在不使用COM的情況下實現。 – 2008-10-09 18:32:38