Можно ли читать и писать файлы Word (2003 и 2007) на PHP без использования COM-объекта? Я знаю, что могу:
$file = fopen('c:\file.doc', 'w+'); fwrite($file, $text); fclose();
но Word будет считать это HTML-файлом, а не родным .doc-файлом.
Чтение двоичных документов Word потребует создания парсера в соответствии с опубликованными спецификациями формата файла для формата DOC. Я думаю, что это не реально возможное решение.
Вы можете использовать форматы Microsoft Office XML для чтения и записи файлов Word – это совместимо с версией Word и версии 2003 и 2007 годов. Для чтения вы должны убедиться, что документы Word сохранены в правильном формате (он называется Word 2003 XML-Document в Word 2007). Для написания вам просто нужно следовать открытой XML-схеме. Я никогда не использовал этот формат для написания документов Office из PHP, но я использую его для чтения в листе Excel (естественно сохраненного как XML-Spreadsheet 2003) и отображения его данных на веб-странице. Поскольку файлы – это просто XML-данные, нет никаких проблем, чтобы перемещаться внутри и выяснить, как извлечь нужные данные.
Другой вариант – вариант только Word 2007 (если форматы файлов OpenXML не установлены в вашем Word 2003) – это было бы повторение OpenXML . Как указывали данные, формат DOCX – это просто ZIP-архив с включенными XML-файлами. В MSDN есть много ресурсов относительно формата файлов OpenXML, поэтому вы должны знать, как читать нужные данные. Написание будет намного сложнее, я думаю – это зависит от того, сколько времени вы потратите.
Возможно, вы можете взглянуть на PHPExcel, который является библиотекой, способной записывать файлы Excel 2007 и читать из файлов Excel 2007 с использованием стандарта OpenXML. Вы можете получить представление о работе, связанной с попыткой чтения и записи документов OpenXML 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\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);
Просто обновляя код
<?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 (aka WordML) может быть хорошим решением. Все, что вам нужно сделать, это создать XML-документ в правильном формате. Я считаю, что Word 2003 и 2007 поддерживают WordML.
Скорее всего, вы не сможете читать документы Word без COM.
В этой теме было написано письмо
http://www.phplivedocx.org – это служба на основе SOAP, которая означает, что вам всегда нужно быть онлайн для тестирования. В файлах также недостаточно примеров для его использования. Странно, что я нашел только после двух дней загрузки (требуется дополнительная схема zend), что ее программа на основе SOAP (прокляла меня !!!) … Я думаю, что без COM это просто невозможно на сервере Linux, и единственная идея заключается в том, чтобы измените файл doc в другом пригодном для использования файле, который может анализировать PHP …
2007 год может быть немного сложнее.
Формат .docx – это zip-файл, который содержит несколько папок с другими файлами в них для форматирования и других вещей.
Переименуйте файл .docx в .zip, и вы поймете, что я имею в виду.
Поэтому, если вы можете работать в zip-файлах на PHP, вы должны быть на правильном пути.
phpLiveDocx является компонентом Zend Framework и может читать и записывать файлы DOC и DOCX в PHP на Linux, Windows и Mac.
См. Веб-сайт проекта по адресу:
Один из способов манипулирования файлами Word с PHP, который может оказаться интересным, – с помощью PHPDocX. Вы можете увидеть, как это работает, взглянув на его онлайн-учебник . Вы можете вставлять или извлекать содержимое или даже объединять несколько файлов Word в один.
Office 2007. .docx должен быть возможен, поскольку это стандарт XML. Word 2003, скорее всего, требует, чтобы COM читал, даже со стандартами, опубликованными MS, поскольку эти стандарты огромны. Я еще не видел много библиотек, написанных для их сопоставления.
Я не знаю, для чего вы собираетесь его использовать, но мне нужна поддержка .doc для индексации поиска; То, что я сделал, было использование небольшого инструмента командной строки под названием «catdoc»; Это переносит содержимое документа Word на простой текст, чтобы его можно было проиндексировать. Если вам нужно сохранить форматирование и прочее, это не ваш инструмент.
Будет ли формат .rtf работать для ваших целей? .rtf можно легко преобразовать в формат .doc и из него, но он написан в виде открытого текста (с встроенными командами управления). Вот как я планирую интегрировать свое приложение с документами Word.
даже я работаю над таким же проектом [The Onlinw Word Processor]! Но я выбрал c # .net и ASP.net. Но через опрос я сделал; я узнал, что
Используя Open XML SDK и VSTO [Visual Studio Tools for Office]
мы можем легко работать со словом-файлом, манипулировать ими и даже конвертировать изнутри в разные форматы, такие как .odt, .pdf, .docx и т. д.
Итак, перейдите на msdn.microsoft.com и внимательно изучите вкладку «Развитие офиса». Его самый простой способ сделать это, поскольку все функции, которые нам нужно реализовать, уже доступны в .net !!
Но так как вы хотите сделать проект ur на PHP, вы можете сделать это в Visual Studio и .net, поскольку PHP также является одним из совместимых языков .net !!
У меня такой же случай. Думаю, я собираюсь использовать дешевый 50-мегагерентный хостинг с бесплатным доменом, чтобы использовать его для преобразования моих файлов на PHP-сервере. И связывать их легко. Все, что вам нужно, это сделать страницу ASP.NET, которая получает файл doc через сообщение и отвечает на него через HTTP, поэтому CURL сделает это.