Можно ли читать и писать файлы Word (2003 и 2007) на PHP без использования COM-объекта? Я знаю, что могу:
$file = fopen('c:\file.doc', 'w+');
fwrite($file, $text);
fclose();
но Word будет считать это HTML файлом, а не родным .doc файлом.
Можно ли читать и писать файлы 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) - было бы ressort для OpenXML. Поскольку databyss указал здесь, формат файла DOCX - это просто ZIP-архив с включенными файлами XML. Есть много ресурсов на MSDN относительно формата файла OpenXML, поэтому вы должны иметь возможность выяснить, как читать данные, которые вы хотеть. Написание будет намного сложнее, я думаю - это зависит от того, сколько времени вы потратите.
Возможно, вы можете взглянуть на PHPExcel, который является библиотекой, способной записывать файлы Excel 2007 и читать из Excel 2007 с использованием стандарта OpenXML. Вы можете получить представление о работе, связанной с попыткой чтения и записи документов 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\[email protected]\/\_\(\)]/","",$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 (aka 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, которая означает, что вам всегда нужно быть онлайн для тестирования. Файлы также не имеют достаточного количества примеров для ее использования. Странно, что я нашел только после двух дней загрузки (требуется дополнительная схема zend), что ее программа на основе SOAP (прокляла меня!!!)... Я думаю, что без COM это просто невозможно на сервере Linux, и единственная идея заключается в том, чтобы измените файл doc в другом пригодном для использования файле, который PHP может проанализировать...
Office 2007..docx должен быть возможен, поскольку он является стандартом XML. Word 2003, скорее всего, требует, чтобы COM читал, даже со стандартами, опубликованными MS, поскольку эти стандарты огромны. Я еще не видел много написанных библиотек, чтобы соответствовать им.
Я не знаю, для чего вы собираетесь его использовать, но мне нужна поддержка .doc для индексации поиска; То, что я сделал, было использование небольшого инструмента командной строки под названием "catdoc"; Это переносит содержимое документа Word на простой текст, чтобы его можно было проиндексировать. Если вам нужно сохранить форматирование и прочее, это не ваш инструмент.
phpLiveDocx является компонентом Zend Framework и может читать и записывать файлы DOC и DOCX в PHP на Linux, Windows и Mac.
См. веб-сайт проекта по адресу:
Один из способов манипулирования файлами Word с PHP, который может оказаться интересным, - с помощью PHPDocX. Вы можете увидеть, как это работает, взглянув на его онлайн-учебник. Вы можете вставлять или извлекать содержимое или даже объединять несколько файлов Word в один.
Будет ли формат .rtf работать для ваших целей?.rtf можно легко преобразовать в формат .doc и из него, но он написан в виде открытого текста (с встроенными командами управления). Вот как я планирую интегрировать свое приложение с документами Word.
даже я работаю над таким же проектом [The Onlinw Word Processor]! Но я выбрал С#.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-мегапиксельный хостинг на базе Windows с бесплатным доменом, чтобы использовать его для конвертирования моих файлов для PHP-сервера. И связывать их легко. Все, что вам нужно, это сделать страницу ASP.NET, которая получает файл doc через сообщение и отвечает на него через HTTP поэтому простой CURL сделает это.
Используйте следующий класс непосредственно, чтобы прочитать документ Word
class DocxConversion{
private $filename;
public function __construct($filePath) {
$this->filename = $filePath;
}
private function read_doc() {
$fileHandle = fopen($this->filename, "r");
$line = @fread($fileHandle, filesize($this->filename));
$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;
}
private function read_docx(){
$striped_content = '';
$content = '';
$zip = zip_open($this->filename);
if (!$zip || is_numeric($zip)) return false;
while ($zip_entry = zip_read($zip)) {
if (zip_entry_open($zip, $zip_entry) == FALSE) continue;
if (zip_entry_name($zip_entry) != "word/document.xml") continue;
$content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
zip_entry_close($zip_entry);
}// end while
zip_close($zip);
$content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
$content = str_replace('</w:r></w:p>', "\r\n", $content);
$striped_content = strip_tags($content);
return $striped_content;
}
/************************excel sheet************************************/
function xlsx_to_text($input_file){
$xml_filename = "xl/sharedStrings.xml"; //content file name
$zip_handle = new ZipArchive;
$output_text = "";
if(true === $zip_handle->open($input_file)){
if(($xml_index = $zip_handle->locateName($xml_filename)) !== false){
$xml_datas = $zip_handle->getFromIndex($xml_index);
$xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
$output_text = strip_tags($xml_handle->saveXML());
}else{
$output_text .="";
}
$zip_handle->close();
}else{
$output_text .="";
}
return $output_text;
}
/*************************power point files*****************************/
function pptx_to_text($input_file){
$zip_handle = new ZipArchive;
$output_text = "";
if(true === $zip_handle->open($input_file)){
$slide_number = 1; //loop through slide files
while(($xml_index = $zip_handle->locateName("ppt/slides/slide".$slide_number.".xml")) !== false){
$xml_datas = $zip_handle->getFromIndex($xml_index);
$xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
$output_text .= strip_tags($xml_handle->saveXML());
$slide_number++;
}
if($slide_number == 1){
$output_text .="";
}
$zip_handle->close();
}else{
$output_text .="";
}
return $output_text;
}
public function convertToText() {
if(isset($this->filename) && !file_exists($this->filename)) {
return "File Not exists";
}
$fileArray = pathinfo($this->filename);
$file_ext = $fileArray['extension'];
if($file_ext == "doc" || $file_ext == "docx" || $file_ext == "xlsx" || $file_ext == "pptx")
{
if($file_ext == "doc") {
return $this->read_doc();
} elseif($file_ext == "docx") {
return $this->read_docx();
} elseif($file_ext == "xlsx") {
return $this->xlsx_to_text();
}elseif($file_ext == "pptx") {
return $this->pptx_to_text();
}
} else {
return "Invalid File Type";
}
}
}
$docObj = new DocxConversion("test.docx"); //replace your document name with correct extension doc or docx
echo $docText= $docObj->convertToText();