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 pas un natif .fichier doc.

30
demandé sur UnkwnTech 2008-10-09 22:09:15

15 réponses

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

vous pouvez utiliser le formats Microsoft Office XML pour lire et écrire des fichiers Word - ceci est compatible avec les versions 2003 et 2007 de Word. Pour lire, vous devez vous assurer que les documents Word sont sauvegardés dans le format correct (il s'appelle Word 2003 XML-Document in Word 2007). Pour écrire, vous n'avez qu'à suivre le schéma XML disponible. Je n'ai jamais utilisé ce format pour écrire des documents de bureau à partir de PHP, mais je l'utilise pour lire dans une feuille de travail Excel (naturellement sauvé comme XML-tableur 2003) et l'affichage de ses données sur une page web. Comme les fichiers sont purement des données XML, il n'y a aucun problème pour naviguer à l'intérieur et trouver comment extraire les données dont vous avez besoin.

l'autre option - Un mot 2007 seulement option (si le Les formats de fichier OpenXML ne sont pas installés dans votre Word 2003) - serait de sonner à OpenXML . Comme databyss fait remarquer ici le format de fichier DOCX est juste une archive ZIP avec des fichiers XML inclus. Il ya beaucoup de ressources sur MSDN concernant le format de fichier OpenXML, donc vous devriez ê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 juste sur le temps que vous investirez.

peut-être Pouvez-vous jeter un oeil à PHPExcel qui est une bibliothèque capable D'écrire aux fichiers Excel 2007 et lire à partir des fichiers Excel 2007 en utilisant la norme OpenXML. Vous pouvez vous faire une idée du travail que cela implique lorsque vous essayez de lire et d'écrire des documents OpenXML Word.

27
répondu Stefan Gehrig 2017-05-23 12:25:45

cela fonctionne avec vs < office 2007 et son pur PHP, NO COM crap, toujours à l'essai de la figure 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;


?>
17
répondu UnkwnTech 2009-01-24 03:59:34

vous pouvez utiliser Antiword, il est un lecteur MS Word gratuit pour Linux et OS les plus populaires.

$document_file = 'c:\file.doc';
$text_from_doc = shell_exec('/usr/local/bin/antiword '.$document_file);
8
répondu Mantichora 2009-05-23 00:57:12

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
répondu WIlson 2011-04-04 12:56:20

Je ne sais pas lire des documents Word natifs en PHP, mais si vous voulez écrire un document Word en PHP, WordprocessingML (alias WordML) pourrait être une bonne solution. Tout ce que vous avez à faire est de créer un document XML dans le bon format. Je crois Word 2003 et 2007 à la fois le soutien WordML.

5
répondu Joe Lencioni 2008-10-10 00:23:47

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

l'Écriture a été couverts dans ce sujet

4
répondu Sergey Kornilov 2017-05-23 12:10:15

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

2
répondu 2009-09-13 17:45:58

2007 pourrait être un peu compliqué aussi.

The .format docx est un fichier zip qui contient quelques dossiers avec d'autres fichiers pour le formatage et d'autres trucs.

renommer A.fichier docx .zip et vous verrez ce que je veux dire.

donc si vous pouvez travailler dans des fichiers zip en PHP, vous devriez être sur le bon chemin.

1
répondu databyss 2008-10-10 15:24:10

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

voir le site Web du projet à:

http://www.phplivedocx.org

1
répondu 2009-05-14 07:03:23

une façon de manipuler des fichiers Word avec PHP que vous pourriez trouver intéressante est avec L'aide de PHPDocX. Vous pouvez voir comment cela fonctionne en regardant son tutoriel en ligne . Vous pouvez insérer ou extraire des contenus ou même fusionner plusieurs fichiers Word en un seul.

1
répondu Eduardo 2012-09-28 16:44:16

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

0
répondu acrosman 2008-10-10 02:45:48

je ne sais pas ce que vous allez l'utiliser, mais j'avais besoin .soutien de doc pour l'indexation de la recherche; ce que j'ai fait était d'utiliser un petit outil en ligne de commande appelé "catdoc"; cela transfère le contenu du document de mot au texte simple afin qu'il puisse être indexé. Si vous avez besoin de garder le formatage et les trucs ce n'est pas votre outil.

0
répondu fijter 2008-10-10 15:25:06

la .format rtf de travail à vos fins? .la rtf peut facilement être convertie en et à partir de .le format doc, mais il est écrit en clair (avec des commandes de contrôle intégrées). C'est ainsi que je prévois d'intégrer ma demande aux documents Word.

0
répondu Josh Smeaton 2009-01-24 05:09:28

même moi je travaille sur le même genre de projet [un traitement de texte en ligne]! Mais j'ai choisi c#.net et ASP.net. Mais à travers l'enquête, je l'ai fait; j'ai appris à savoir que

en utilisant Open XML SDK et VSTO [Visual Studio Tools For Office]

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

So, goto msdn.microsoft.com et soyez minutieux à propos de l'onglet développement de bureau. C'est la façon la plus simple de le faire puisque 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 en Visual Studio et .NET car PHP est aussi L'un des langages compatibles .net!!

0
répondu Noddy Cha 2010-09-05 14:17:51

j'ai la même affaire Je suppose que je vais utiliser un bon marché 50 méga Windows basé hébergement avec Domaine GRATUIT pour l'utiliser pour convertir mes fichiers sur, pour PHP server. Et les relier est facile. Tout ce que vous avez besoin est de faire un ASP.NET page qui reçoit le fichier doc via post et y répond via HTTP donc simple boucle le ferait.

0
répondu Omer 2010-10-11 19:12:09