是否可以在不使用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