Подтвердить что ты не робот

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

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

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

но Word будет считать это HTML файлом, а не родным .doc файлом.

4b9b3361

Ответ 1

Чтение двоичных документов 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.

Ответ 2

это работает с 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;


?>

Ответ 3

Вы можете использовать Antiword, это бесплатный читатель MS Word для Linux и самой популярной ОС.

$document_file = 'c:\file.doc';
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file);

Ответ 4

Я не знаю о чтении собственных документов Word в PHP, но если вы хотите написать документ Word в PHP, WordprocessingML (aka WordML) может быть хорошим решением. Все, что вам нужно сделать, это создать XML-документ в правильном формате. Я считаю, что Word 2003 и 2007 поддерживают WordML.

Ответ 5

Просто обновляя код

<?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;


?>

Ответ 7

2007 также может быть немного сложнее.

Формат .docx - это zip файл, содержащий несколько папок с другими файлами в них для форматирования и других материалов.

Переименуйте файл .docx в .zip, и вы увидите, что я имею в виду.

Итак, если вы можете работать в zip файлах на PHP, вы должны быть на правильном пути.

Ответ 8

www.phplivedocx.org - это служба на основе SOAP, которая означает, что вам всегда нужно быть онлайн для тестирования. Файлы также не имеют достаточного количества примеров для ее использования. Странно, что я нашел только после двух дней загрузки (требуется дополнительная схема zend), что ее программа на основе SOAP (прокляла меня!!!)... Я думаю, что без COM это просто невозможно на сервере Linux, и единственная идея заключается в том, чтобы измените файл doc в другом пригодном для использования файле, который PHP может проанализировать...

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

http://www.phplivedocx.org

Ответ 12

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

Ответ 13

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

Ответ 14

даже я работаю над таким же проектом [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.

Ответ 15

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

Ответ 16

Используйте следующий класс непосредственно, чтобы прочитать документ 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();