Чтение / запись файла MS Word на PHP - PullRequest
32 голосов
/ 09 октября 2008

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

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

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

Ответы [ 15 ]

28 голосов
/ 05 ноября 2008

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

18 голосов
/ 05 ноября 2008

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


?>
8 голосов
/ 23 мая 2009

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

$document_file = 'c:\file.doc';
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file);
6 голосов
/ 04 апреля 2011

Просто обновить код

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


?>
6 голосов
/ 10 октября 2008

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

5 голосов
/ 10 октября 2008

Скорее всего, вы не сможете читать документы Word без COM.

Написание было освещено в этой теме

2 голосов
/ 13 сентября 2009

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

2 голосов
/ 10 октября 2008

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

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

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

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

1 голос
/ 28 сентября 2012

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

1 голос
/ 14 мая 2009

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

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

http://www.phplivedocx.org

...