Можно ли читать и записывать файлы Word (2003 и 2007) на PHP без использования COM-объекта?
Я знаю, что могу:
$file = fopen('c:\file.doc', 'w+');
fwrite($file, $text);
fclose();
но Word будет читать его как файл HTML, а не как собственный файл .doc.
Чтение двоичных документов Word потребовало бы создания анализатора в соответствии с опубликованными спецификациями формата файла для формата DOC. Я думаю, что это не реально выполнимое решение.
Вы могли бы использовать XML-форматы Microsoft Office для чтения и записи файлов Word — это совместимо с версиями Word 2003 и 2007. Для чтения необходимо убедиться, что документы Word сохранены в правильном формате (он называется XML-документ Word 2003 в Word 2007). Для написания вы просто должны следовать открыто доступной XML-схеме. Я никогда не использовал этот формат для записи документов Office из PHP, но я использую его для чтения на листе Excel (естественно сохраненного как XML-Spreadsheet 2003) и отображения его данных на веб-странице. Поскольку файлы представляют собой просто XML-данные, нет проблем перемещаться по ним и выяснять, как извлечь нужные данные.
Другой вариант — вариант только для Word 2007 (если форматы файлов OpenXML не установлены в вашем Word 2003) — будет использовать OpenXML. Как databyss указал Вот формат файла DOCX — это просто ZIP-архив с включенными файлами XML. Есть много ресурсов на MSDN что касается формата файла OpenXML, так что вы должны быть в состоянии понять, как читать данные, которые вы хотите. Я думаю, что писать будет намного сложнее — все зависит от того, сколько времени вы потратите.
Возможно, вы можете взглянуть на PHPExcel это библиотека, способная записывать в файлы Excel 2007 и читать из файлов Excel 2007, используя стандарт OpenXML. Вы можете получить представление о проделанной работе при попытке читать и писать документы OpenXML Word.
это работает с против < 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\t@\/\_\(\)]/","",$outtext);
return $outtext;
}
$userDoc = "cv.doc";
$text = parseWord($userDoc);
echo $text;?>
Вы можете использовать Antiword, это бесплатная программа чтения MS Word для Linux и самой популярной ОС.
$document_file = 'c:\file.doc';
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file);
Я не знаю о чтении документов Word в PHP, но если вы хотите написать документ Word в PHP, WordprocessingML (он же WordML) может быть хорошим решением. Все, что вам нужно сделать, это создать XML-документ в правильном формате. Я считаю, что Word 2003 и 2007 оба поддерживают WordML.
Просто обновляем код
<?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;?>
Скорее всего, вы не сможете читать документы Word без COM.
Письмо было покрыто в этом тема
2007 год может быть немного сложным.
Формат .docx — это zip-файл, который содержит несколько папок с другими файлами в них для форматирования и прочего.
Переименуйте файл .docx в .zip, и вы поймете, что я имею в виду.
Так что если вы можете работать с zip-файлами в PHP, вы должны быть на правильном пути.
www.phplivedocx.org — это сервис, основанный на SOAP, что означает, что вам всегда нужно быть в сети для тестирования Файлов, а также не хватает примеров для его использования. Странно, но я обнаружил, что только после 2-х дней загрузки (требует также дополнительно Zend Framework), что это программа на основе SOAP (проклинаю меня !!!) … Я думаю, что без COM это просто невозможно на сервере Linux, и единственная идея состоит в том, чтобы изменить файл doc в другом используемом файле, который PHP может анализировать …