用PHP读/写MS Word文件

是否有可能在不使用COM对象的情况下在PHP中读写Word(2003和2007)文件? 我知道我可以:

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

但Word会将其作为HTML文件而不是本机.doc文件进行读取。

读取二进制Word文档将涉及根据公布的DOC格式的文件格式规范创build一个分析器。 我认为这不是真正可行的解决办法。

您可以使用Microsoft Office XML格式来读取和写入Word文件 – 这与Word的2003和2007版本兼容。 为了阅读,您必须确保Word文档以正确的格式保存(在Word 2007中称为Word 2003 XML文档)。 写作你只需要遵循公开可用的XML模式。 我从来没有使用这种格式写出来自PHP的Office文档,但我用它来读取Excel工作表(自然保存为XML-Spreadsheet 2003)并在网页上显示其数据。 由于这些文件是纯粹的XML数据,因此导航内容并找出如何提取所需数据是没有问题的。

另一个选项 – 只有Word 2007的选项(如果OpenXML文件格式没有安装在你的Word 2003中) – 将重新调整到OpenXML 。 正如databyss在这里指出的那样,DOCX文件格式只是包含XML文件的ZIP压缩文件。 MSDN上有很多关于OpenXML文件格式的资源,所以你应该能够弄清楚如何读取你想要的数据。 我认为写作会复杂得多 – 这取决于你投入多less时间。

也许你可以看看PHPExcel ,它是一个能够写入Excel 2007文件的库,并使用OpenXML标准从Excel 2007文件中读取。 在尝试读取和写入OpenXML Word文档时,您可以了解所涉及的工作。

这与VS 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\t@\/\_\(\)]/","",$outtext); return $outtext; } $userDoc = "cv.doc"; $text = parseWord($userDoc); echo $text; ?> 

您可以使用Antiword,它是一个免费的MS Word阅读器,适用于Linux和最stream行的操作系统。

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

只是更新代码

 <?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; ?> 

我不知道如何在PHP中读取原生的Word文档,但是如果你想用PHP编写一个Word文档, WordprocessingML(又名WordML)可能是一个很好的解决scheme。 您所要做的就是以正确的格式创build一个XML文档。 我相信Word 2003和2007都支持WordML。

很可能你将无法阅读没有COM的Word文档。

写作在这个话题中被覆盖了

http://www.phplivedocx.org是一个基于SOAP的服务,这意味着你总是需要在线testing文件也没有足够的例子来使用。; 奇怪的是,我发现只有在下载2天后(也需要joinzend框架),其基于SOAP的程序(诅咒我!!!)…我认为没有COM它只是不可能在Linux服务器上,唯一的想法是在另一个可用的文件中更改doc文件,PHP可以parsing…

2007年也可能有点复杂。

.docx格式是一个压缩文件,其中包含几个文件夹与其他文件格式和其他的东西。

将.docx文件重命名为.zip,您将看到我的意思。

所以,如果你可以在PHP的zip文件中工作,你应该在正确的道路上。

phpLiveDocx是一个Zend框架组件,可以在Linux,Windows和Mac上用PHP读写DOC和DOCX文件。

请参阅项目网站:

http://www.phplivedocx.org

使用PHP处理Word文件的一种方法是使用PHPDocX。 你可以看看它的在线教程是如何工作的。 您可以插入或提取内容,甚至可以将多个Word文件合并成一个文件。

Office 2007 .docx应该是可能的,因为它是一个XML标准。 Word 2003很可能需要COM来阅读,即使MS现在公布的标准,因为这些标准是巨大的。 我还没有看到许多书面来匹配他们呢。

我不知道你要使用它,但我需要.doc支持search索引; 我所做的就是使用一个叫做“catdoc”的小命令行工具。 这将Word文档的内容转换为纯文本,以便可以索引。 如果你需要保持格式和东西,这不是你的工具。

.rtf格式是否适用于您的目的? .rtf可以很容易地转换为.doc格式,但是它是以纯文本(embedded了控制命令)编写的。 这就是我计划将我的应用程序与Word文档集成的方式。

即使我正在做同样的项目[安林字处理器]! 但是我select了c#.net和ASP.net。 但通过我做的调查, 我知道这一点

通过使用Open XML SDK和VSTO [用于Office的Visual Studio工具]

我们可以很容易地使用word文件来操作它们,甚至将内部转换为不同的格式,如.odt,.pdf,.docx等等。

所以,转到msdn.microsoft.com并彻底关于办公室发展选项卡。 它是最简单的方法来做到这一点,因为我们需要实现的所有function已经在.net!

但是,因为你想用PHP做你的项目,所以你可以在Visual Studio和.NET中做,因为PHP也是.net兼容语言之一!

我有同样的情况下,我想我将使用一个廉价的50兆窗口基于免费域托pipe来使用它来转换我的文件,为PHP服务器。 并且链接它们很容易。 所有你需要的是build立一个ASP.NET页面,通过邮件接收文档文件,并通过HTTP回复它,这样简单的CURL就可以做到这一点。