web-dev-qa-db-fra.com

Lecture / écriture d'un fichier MS Word en PHP

Est-il possible de lire et d'écrire des fichiers Word (2003 et 2007) en PHP sans utiliser un objet COM? Je sais que je peux:

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

mais Word le lira comme un fichier HTML et non comme un fichier .doc natif.

32
UnkwnTech

La lecture de documents Word binaires impliquerait la création d'un analyseur selon les spécifications de format de fichier publiées pour le format DOC. Je pense que ce n'est pas une vraie solution réalisable.

Vous pouvez utiliser les formats Microsoft Office XML pour lire et écrire des fichiers Word - ceci est compatible avec les versions 2003 et 2007 de Word. Pour la lecture, vous devez vous assurer que les documents Word sont enregistrés dans le format correct (il s'appelle Word 2003 XML-Document dans Word 2007). Pour écrire, il vous suffit de suivre le schéma XML ouvertement disponible. Je n'ai jamais utilisé ce format pour écrire des documents Office à partir de PHP, mais je l'utilise pour lire dans une feuille de calcul Excel (naturellement enregistrée sous XML-Spreadsheet 2003) et afficher ses données sur une page Web. Comme les fichiers sont clairement des données XML, il n'y a aucun problème à naviguer à l'intérieur et à découvrir comment extraire les données dont vous avez besoin.

L'autre option - une option Word 2007 uniquement (si les formats de fichier OpenXML ne sont pas installés dans votre Word 2003) - serait de ressortir à OpenXML . Comme databyss l'a souligné ici le format de fichier DOCX est juste une archive Zip avec des fichiers XML inclus. Il y a beaucoup de ressources sur MSDN concernant le format de fichier OpenXML, vous devriez donc être en mesure de comprendre comment lire les données que vous voulez. L'écriture sera beaucoup plus compliquée, je pense - cela dépend simplement du temps que vous investirez.

Vous pouvez peut-être jeter un œil à PHPExcel qui est une bibliothèque capable d'écrire dans des fichiers Excel 2007 et de lire à partir de fichiers Excel 2007 en utilisant la norme OpenXML. Vous pouvez vous faire une idée du travail impliqué en essayant de lire et d'écrire des documents Word OpenXML.

28
Stefan Gehrig

cela fonctionne avec vs <office 2007 et son PHP pur, pas de merde COM, essayant toujours de comprendre 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;


?>
18
Mac

Vous pouvez utiliser Antiword, c'est un lecteur MS Word gratuit pour Linux et le système d'exploitation le plus populaire.

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

Mise à jour du code

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

Je ne sais pas lire les documents Word natifs en PHP, mais si vous voulez écrire un document Word en PHP, WordprocessingML (aka WordML) pourrait être une bonne solution. Il vous suffit de créer un document XML au format correct. Je crois que Word 2003 et 2007 prennent tous les deux en charge WordML.

6
Joe Lencioni

Vous ne pourrez probablement pas lire les documents Word sans COM.

L'écriture a été couverte dans ce sujet

5
Sergey Kornilov

2007 pourrait aussi être un peu compliqué.

Le format .docx est un fichier Zip qui contient quelques dossiers contenant d'autres fichiers pour le formatage et d'autres choses.

Renommez un fichier .docx en .Zip et vous verrez ce que je veux dire.

Donc, si vous pouvez travailler avec des fichiers Zip en PHP, vous devriez être sur le bon chemin.

2
databyss

www.phplivedocx.org est un service basé sur SOAP qui signifie que vous devez toujours être en ligne pour tester les fichiers n'a pas assez d'exemples pour son utilisation. Étrangement, je n'ai trouvé qu'après 2 jours de téléchargement (nécessite également un framework zend) que c'est un SOAP programme basé (maudit moi !!!) ... Je pense que sans COM ce n'est tout simplement pas possible sur un serveur Linux et la seule idée est pour changer le fichier doc dans un autre fichier utilisable qui PHP peut analyser ...

2
jahajee

Office 2007 .docx devrait être possible car il s'agit d'une norme XML. Word 2003 requiert très probablement COM pour lire, même avec les normes maintenant publiées par MS, car ces normes sont énormes. Je n'ai pas encore vu beaucoup de bibliothèques écrites pour leur correspondre.

1
acrosman

Une façon de manipuler les fichiers Word avec PHP que vous pouvez trouver intéressant est avec l'aide de PHPDocX. Vous pouvez voir comment cela fonctionne en regardant son tutoriel en ligne . Vous pouvez insérer ou extraire du contenu ou même fusionner plusieurs fichiers Word en un seul.

1
Eduardo

Je ne sais pas pourquoi vous allez l'utiliser, mais j'avais besoin du support .doc pour l'indexation de la recherche; Ce que j'ai fait, c'est utiliser un petit outil en ligne de commande appelé "catdoc"; Cela transfère le contenu du document Word en texte brut afin qu'il puisse être indexé. Si vous devez conserver le formatage et d'autres choses, ce n'est pas votre outil.

1
fijter

phpLiveDocx est un composant de Zend Framework et peut lire et écrire DOC et fichiers DOCX dans PHP sur Linux, Windows et Mac.

Voir le site Web du projet à:

http://www.phplivedocx.org

1
Leo Bonnafe

J'ai le même cas, je suppose que je vais utiliser un hébergement basé sur 50 méga fenêtres bon marché avec un domaine gratuit pour l'utiliser pour convertir mes fichiers, pour PHP serveur. Et les relier est facile. Tout ce dont vous avez besoin est de créer une page ASP.NET qui reçoit le fichier doc par la poste et le répond via HTTP si simple CURL le ferait.

0
Omer

Le format .rtf fonctionnerait-il pour vos besoins? .rtf peut facilement être converti vers et depuis le format .doc, mais il est écrit en texte brut (avec des commandes de contrôle intégrées). C'est ainsi que je prévois d'intégrer mon application aux documents Word.

0
Josh Smeaton

même je travaille sur le même type de projet [Un traitement de texte Onlinw]! Mais j'ai choisi c # .net et ASP.net. Mais grâce à l'enquête, je l'ai fait; j'ai appris que

En utilisant Open XML SDK et VSTO [Visual Studio Tools pour Office]

nous pouvons facilement travailler avec un fichier Word, les manipuler et même les convertir en interne en différents formats en plusieurs formats tels que .odt, .pdf, .docx etc.

Donc, allez à msdn.Microsoft.com et soyez consciencieux sur l'onglet de développement de bureau. C'est le moyen le plus simple de le faire car toutes les fonctions que nous devons implémenter sont déjà disponibles dans .net !!

Mais comme vous voulez faire votre projet en PHP, vous pouvez le faire dans Visual Studio et .net en tant que PHP est également l'un des langages compatibles .net !!

0
Noddy Cha

Source obtenue de

Utilisez la classe suivante directement pour lire le document 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\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();
0
Mohamed Faalil