Чтение / запись файла MS Word на PHP
можно ли читать и писать файлы Word (2003 и 2007) в PHP без использования COM-объекта? Я знаю, что могу:
$file = fopen('c:file.doc', 'w+');
fwrite($file, $text);
fclose();
но Word будет читать его как HTML-файл, а не родной.doc-файл.
15 ответов
чтение двоичных документов Word будет включать создание анализатора в соответствии с опубликованными спецификациями формата файла для формата DOC. Я думаю, что это не реально осуществимое решение.
можно использовать форматы XML Microsoft Office для чтения и записи файлов Word-это совместимо с версией Word 2003 и 2007. Для чтения необходимо убедиться, что документы Word сохранены в правильном формате (это называется Word 2003 XML-документ в Word 2007). Для написания вам просто нужно следовать открыто доступной XML-схеме. Я никогда не использовал этот формат для написания офисных документов с PHP, но я использую его для чтения на листе Excel (естественно, сохраненном как XML-Spreadsheet 2003) и отображения его данных на веб-странице. Поскольку файлы-это просто XML-данные, нет проблем перемещаться внутри и выяснить, как извлечь необходимые данные.
другой вариант-только вариант Word 2007 (если форматы файлов OpenXML не являются установлен в вашем Word 2003) - было бы прибегнуть к OpenXML. As databyss указал здесь формат файла DOCX - это просто ZIP-архив с включенными XML-файлами. Есть много ресурсов на MSDN что касается формата файла OpenXML, поэтому вы должны иметь возможность выяснить, как читать нужные данные. Писать будет гораздо сложнее, я думаю - это просто зависит от того, сколько времени вы будете вкладывать.
возможно, вы можно посмотреть на PHPExcel которая является библиотекой, способной записывать файлы Excel 2007 и читать из файлов Excel 2007 с помощью стандарта OpenXML. Вы можете получить представление о работе, связанной с попыткой чтения и записи документов OpenXML Word.
это работает с vs
<?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 reader для Linux и самой популярной ОС.
$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;
?>
Я не знаю о чтении родных документов Word на PHP, но если вы хотите написать документ Word на PHP,WordprocessingML (он же WordML) может быть хорошим решением. Все, что вам нужно сделать, это создать XML-документ правильного формата. Я считаю, что Word 2003 и 2007 поддерживают WordML.
скорее всего, вы не сможете читать документы Word без COM.
письменность была покрыта этим темы
www.phplivedocx.org это служба на основе SOAP, что означает, что вы всегда должны быть в сети для тестирования файлов также не хватает примеров для его использования . Как ни странно, я обнаружил только после 2 дней загрузки (требует дополнительного Zend framework тоже), что его программа на основе SOAP (проклят!!!)...Я думаю, что без COM это просто невозможно на сервере Linux, и единственная идея-изменить файл doc в другом удобном файле, который PHP может разобрать...
2007 также может быть немного сложным.
The .docx format-это zip-файл, который содержит несколько папок с другими файлами для форматирования и других вещей.
переименовать a .файл docx в .ЗИП, и ты поймешь, что я имею в виду.
поэтому, если вы можете работать в zip-файлах на PHP, вы должны быть на правильном пути.
phpLiveDocx является компонентом Zend Framework и может читать и писать файлы DOC и DOCX в PHP на Linux, Windows и Mac.
см. веб-сайт проекта по адресу:
один из способов манипулировать файлами Word с PHP, которые могут вас заинтересовать, - с помощью PHPDocX. Вы можете увидеть, как это работает, взглянув на его онлайн учебник. Вы можете вставлять или извлекать содержимое или даже объединять несколько файлов Word в один asingle.
Office 2007 .docx должен быть возможен, так как это стандарт XML. Word 2003, скорее всего, требует чтения COM, даже со стандартами, опубликованными MS, поскольку эти стандарты огромны. Я еще не видел столько библиотек, написанных в соответствии с ними.
Я не знаю, для чего вы собираетесь его использовать, но мне нужно .поддержка doc для индексирования поиска; я использовал небольшой инструмент командной строки под названием "catdoc"; это передает содержимое документа Word в обычный текст, чтобы его можно было индексировать. Если вам нужно сохранить форматирование и прочее это не ваш инструмент.
будет .rtf формат работы для ваших целей? .rtf можно легко преобразовать к и от .формат doc, но он написан открытым текстом (со встроенными командами управления). Вот как я планирую интегрировать свое приложение с документами Word.
даже я работаю над таким же проектом [текстовый процессор Onlinw]! Но я выбрал c#.net и ASP.net. Но через опрос я сделал, я должен знать, что
с помощью Open XML SDK и VSTO [Visual Studio Tools For Office]
мы можем легко работать с файлом word манипулировать ими и даже конвертировать внутренне в разные форматы, такие как .файлы odt,.документ PDF.,docx etc..
Итак, Гото msdn.microsoft.com и будьте внимательны к вкладке office development. Это самый простой способ сделать это, так как все функции, которые нам нужно реализовать, уже доступны в .net!!
но поскольку вы хотите сделать проект ur в PHP, вы можете сделать это в Visual Studio и .net, поскольку PHP также является одним из .net-совместимых языков!!
У меня тот же случай Думаю, я собираюсь использовать дешевый хостинг на базе 50 mega windows с бесплатным доменом для преобразования моих файлов на PHP-сервере. И связать их легко. Все, что вам нужно, это сделать ASP.NET страница, которая получает файл doc через post и отвечает на него через HTTP такой простой завиток сделал бы это.