2008-10-09 190 views
30

是否可以在不使用COM對象的情況下在PHP中讀寫Word(2003和2007)文件? 我知道我可以:使用PHP讀取/寫入MS Word文件

$file = fopen('c:\file.doc', 'w+'); 
fwrite($file, $text); 
fclose(); 

但Word將讀爲HTML文件不是本機.doc文件。

+0

我發現它極不可能在不使用COM的情況下實現。 – 2008-10-09 18:32:38

回答

27

讀二進制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文檔時,您可以瞭解所涉及的工作。

+1

PHPExcel似乎已經讓[PHPWord](http://phpword.codeplex.com/)創建了word文檔。 – Basic 2012-07-22 16:45:56

5

我不知道如何在PHP中閱讀本機Word文檔,但是如果您想在PHP中編寫Word文檔,WordprocessingML (aka WordML)可能是一個很好的解決方案。您所要做的就是以正確的格式創建一個XML文檔。我相信Word 2003和2007都支持WordML。

4

如果沒有COM,很可能您將無法讀取Word文檔。

寫作在這個topic

0

的Office 2007的.docx覆蓋的應該是可行的,因爲它是一個XML標準。由於這些標準非常龐大,Word 2003很可能需要COM才能閱讀,即使是MS現在發佈的標準也是如此。我還沒有看到許多圖書館都是爲了配合他們而編寫的。

1

2007年也可能有點複雜。

.docx格式是一個zip文件,其中包含幾個文件夾,其中包含其他文件以用於格式化和其他內容。

將.docx文件重命名爲.zip,您會看到我的意思。

所以,如果你可以在PHP的zip文件中工作,你應該在正確的道路上。

+0

+1,爲答案。 – 2013-07-09 05:25:32

0

我不知道你打算如何使用它,但我需要.doc支持搜索索引;我所做的是使用一個名爲「catdoc」的小命令行工具;這將Word文檔的內容轉換爲純文本,以便對其進行索引。如果你需要保持格式和東西,這不是你的工具。

17

這一點也適用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; 


?> 
+1

如果你想保持隱匿性,不要使用它。 – 2012-05-04 15:41:05

+0

我發現一些無法在此函數中解析的特殊字符。 – 2013-07-23 11:24:45

0

.rtf格式是否適用於您的目的? .rtf可以很容易地轉換成.doc格式,但是它是用明文寫的(嵌入了控制命令)。這是我計劃將我的應用程序與Word文檔集成的方式。

+0

情況是irrelivent問題是天氣或沒有這是可能的,但謝謝。 – UnkwnTech 2009-01-24 11:54:13

1

phpLiveDocx是一個Zend框架組件,可以在Linux,Windows和Mac上用PHP讀寫DOC和DOCX文件。

請參見該項目網站:

http://www.phplivedocx.org

+0

引用鏈接已死亡 – 2017-03-19 13:00:20

8

您可以使用Antiword,它是Linux和最流行的OS免費的MS Word的讀者。

$document_file = 'c:\file.doc'; 
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file); 
+8

這種類型的解決方案存在的問題是,它假定可以在服務器上安裝軟件。 – UnkwnTech 2009-05-24 07:42:04

+2

很長一段時間,但糾正我,如果我錯了。 `C:\ file.doc`是一個windows目錄,`/ usr/local/bin`是一個Linux/Unix目錄? – 2013-04-04 00:54:52

2

www.phplivedocx.org是基於SOAP的服務,意味着你總是需要測試的文件也沒有爲它的使用足夠的例子在線。奇怪的是,我發現只有在下載2天后(也需要加入zend框架)它的基於SOAP的程序(詛咒我!!!)...我認爲沒有COM它只是不可能在Linux服務器上,唯一的想法是改變另一個可用的文件,PHP可以解析的文檔文件...

0

即使我正在研究同一種項目[安林字處理器]! 但我選擇了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兼容的語言之一!

0

我有同樣的情況 我想我將使用一個廉價的50兆窗口爲基礎的託管與免費域名使用它來轉換我的文件,爲PHP服務器。並且鏈接它們很容易。 所有你需要的是製作一個ASP.NET頁面,通過發佈接收doc文件並通過HTTP 回覆它,這麼簡單的CURL就可以做到。

6

只需更新代碼來處理與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; 


?> 
1

的一種方式。 你可以看看它的工作原理,看看它的online tutorial。 您可以插入或提取內容,甚至可以將多個Word文件合併成一個文件。