32 votes

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.

29voto

Stefan Gehrig Points 47227

Lecture binaire des documents Word serait la création d'un analyseur selon la publication de spécifications de format de fichier pour le format DOC. Je pense que ce n'est pas vraiment réalisable.

Vous pouvez utiliser le Microsoft Office XML formats pour la lecture et l'écriture des fichiers de mots - ce qui est compatible avec l'2003 et la version 2007 de Word. Pour la lecture, vous devez garantir que les documents Word sont enregistrées dans le format correct (il est appelé XML Word 2003-Document dans Word 2007). Pour l'écriture, vous avez juste à suivre le ouvertement disponibles schéma XML. Je n'ai jamais utilisé ce format pour écrire des documents Office à partir de PHP, mais je l'utilise pour la lecture dans une feuille de calcul Excel (naturellement enregistrées au format XML-feuille de calcul 2003) et l'affichage de ses données sur une page web. Comme les fichiers sont clairement des données XML, il n'est pas un problème pour naviguer à l'intérieur et à comprendre comment l'extraire les données dont vous avez besoin.

L'autre option - Word 2007, seule option (si l'OpenXML formats de fichiers ne sont pas installés dans votre Word 2003) - serait à ressort à OpenXML. Comme databyss 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 fichier OpenXML format, donc vous devriez être en mesure de comprendre comment lire les données que vous souhaitez. L'écriture sera beaucoup plus compliqué, je pense juste que cela dépend de la façon dont beaucoup de temps vous allez investir.

Peut-être vous pouvez avoir un coup d'oeil à PHPExcel qui est une bibliothèque en mesure d'écrire dans des fichiers Excel 2007 et lire à partir de fichiers Excel 2007 à l'aide de l'OpenXML standard. Vous pourriez avoir une idée du travail en essayant de lire et d'écrire OpenXML des documents Word.

8voto

Iman Points 129

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

6voto

Joe Lencioni Points 4642

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.

6voto

WIlson Points 51

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;


?>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X