Чтение / запись файла MS Word на PHP

Можно ли читать и писать файлы Word (2003 и 2007) на PHP без использования COM-объекта? Я знаю, что могу:

$file = fopen('c:\file.doc', 'w+');
fwrite($file, $text);
fclose();

но Word будет читать его как файл HTML, а не как собственный файл.doc.

15 ответов

Решение

Чтение двоичных документов Word потребовало бы создания анализатора в соответствии с опубликованными спецификациями формата файла для формата DOC. Я думаю, что это не реально выполнимое решение.

Вы можете использовать форматы Microsoft Office XML для чтения и записи файлов 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.

Это работает с 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 для 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 может анализировать...

Источник получен из

Используйте следующий класс непосредственно для чтения текстового документа

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\t@\/\_\(\)]/","",$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();

phpLiveDocx является компонентом Zend Framework и может читать и записывать файлы DOC и DOCX на PHP на Linux, Windows и Mac.

Смотрите веб-сайт проекта по адресу:

http://www.phplivedocx.org/

Я не знаю, для чего вы собираетесь его использовать, но мне нужна была поддержка.doc для индексации поиска; Я использовал маленький инструмент командной строки под названием "catdoc"; Это переводит содержимое документа Word в обычный текст, чтобы его можно было проиндексировать. Если вам нужно продолжать форматирование и прочее, это не ваш инструмент.

Один из способов манипулировать файлами Word с помощью PHP, который может вас заинтересовать, - с помощью PHPDocX. Вы можете увидеть, как это работает, посмотрев его онлайн-учебник. Вы можете вставлять или извлекать содержимое или даже объединять несколько файлов Word в один.

Office 2007 .docx должен быть возможен, так как это стандарт XML. Word 2003, скорее всего, требует, чтобы COM читал, даже с учетом стандартов, опубликованных сейчас MS, поскольку эти стандарты огромны. Я не видел много библиотек, написанных, чтобы соответствовать им.

Даже я работаю над тем же проектом [текстовый процессор Onlinw]! Но я выбрал C#.net и ASP.net. Но через опрос я сделал; я должен знать, что

Используя Open XML SDK и VSTO [Инструменты Visual Studio для офиса]

мы можем легко работать с текстовыми файлами, манипулировать ими и даже конвертировать их в различные форматы, такие как.odt,.pdf,.docx и т. д.

Итак, зайдите на msdn.microsoft.com и внимательно изучите вкладку "Разработка офиса". Это самый простой способ сделать это, так как все функции, которые нам нужно реализовать, уже доступны в.net!!

Но так как вы хотите сделать свой проект на PHP, вы можете сделать это в Visual Studio и.net, так как PHP также является одним из.net-совместимого языка!

Подойдет ли формат.rtf для ваших целей? .rtf может быть легко преобразован в и из формата.doc, но он написан в виде открытого текста (со встроенными командами управления). Вот как я планирую интегрировать свое приложение с документами Word.

У меня такой же случай, я думаю, что я собираюсь использовать дешевый хостинг на 50 мегабайтов на основе Windows с бесплатным доменом, чтобы использовать его для конвертации моих файлов на PHP-сервер. И связать их легко. Все, что вам нужно, это создать страницу ASP.NET, которая получает файл doc по почте и отвечает на него через HTTP, так что простой CURL сделает это.

Другие вопросы по тегам