OVH Cloud OVH Cloud

Extraire le texte d'un doc Word

9 réponses
Avatar
Antoine Dinimant
Bonjour,

Je cherche un système permettant à PHP de lire le texte d'un document
Word uploadé. J'ai entendu parler de diverses classes permettant cela,
mais soit elles ne fonctionnent que sur un serveur Windows, soit elles
ne permettent que de créer des .doc à la volée mais pas d'en lire...

Avez-vous des pistes ?

Merci d'avance !

Antoun

9 réponses

Avatar
jerome herve
Sur windows, tu peux te servir des objets dom. si word est sur le
serveur, c'est possible.
Sous linux, tu peux demander à php d'éxecuter un programme sachant lire
le .doc (abiword, openoffice -plus lourd-) et lui demander de convertir
en .txt.
J'ai jamais fait, mais cela parait faisable.

Bonjour,

Je cherche un système permettant à PHP de lire le texte d'un document
Word uploadé. J'ai entendu parler de diverses classes permettant cela,
mais soit elles ne fonctionnent que sur un serveur Windows, soit elles
ne permettent que de créer des .doc à la volée mais pas d'en lire...

Avez-vous des pistes ?

Merci d'avance !

Antoun


Avatar
jean.lespinasse
Antoine Dinimant wrote:

Bonjour,

Je cherche un système permettant à PHP de lire le texte d'un document
Word uploadé. J'ai entendu parler de diverses classes permettant cela,
mais soit elles ne fonctionnent que sur un serveur Windows, soit elles
ne permettent que de créer des .doc à la volée mais pas d'en lire...


Question de néophyte: pourquoi ne pas accepter uniquement les uploads en
RTF qui est un format standard ? N'importe quel traitement de texte sait
enregistrer en RTF.

D'accord c'est plutôt hors sujet mais je me pose vraiment la question.
Pourquoi ne pas donner la priorité aux formats standards, et se prendre
la tête avec des formats propriétaires ?

À +
--
Jean Lespinasse

Avatar
Antoine Dinimant
Question de néophyte: pourquoi ne pas accepter uniquement les uploads en
RTF qui est un format standard ? N'importe quel traitement de texte sait
enregistrer en RTF.


ça ne changerait pas grand-chose, il me faudrait ensuite une procédure
de traduction du code RTF afin d'en extraire le texte

D'accord c'est plutôt hors sujet mais je me pose vraiment la question.
Pourquoi ne pas donner la priorité aux formats standards, et se prendre
la tête avec des formats propriétaires ?


- pour simplifier la tâche de mes (futurs) visiteurs; plutôt que
d'enregistrer en RTF, je peux leur demander de faire un copier-coller du
contenu de leur doc dans une TEXTAREA, cela n'est pas plus compliqué
pour eux, alors que c'est bcp + simple et + portable pour moi. Mais si
c'est possible, j'aimerais bien leur éviter une manipulation et donc
pouvoir lire du .DOC (et du .RTF, mais je suppose qu'un truc capable de
lire du .DOC est également capable de lire du .RTF)

- juste pour chipoter, le .RTF est certes un format d'échange devenu
standard, mais ça n'en reste pas moins un format tout aussi Microsoftien
que le .DOC

Avatar
Stephane
"Antoine Dinimant" a écrit
Bonjour,

Je cherche un système permettant à PHP de lire le texte d'un document
Word uploadé. J'ai entendu parler de diverses classes permettant cela,
mais soit elles ne fonctionnent que sur un serveur Windows, soit elles
ne permettent que de créer des .doc à la volée mais pas d'en lire...

Avez-vous des pistes ?


Oui
La voilà:

// *****************************************************************************
// Définition de la fonction "liredoc", qui stocke le texte d'un fichier ".doc"
// (Word 97, 2002 ou 2002 uniquement) dans un fichier ".doc.txt"
// *****************************************************************************

function liredoc($fichier) {

// Cette chaine se trouve juste avant le premier caractère lisible de tout
// document word
$debut_binaire = "00d9000000";
// Pareil pour la fin
$fin_binaire = "0000";

$chaine = $chaine_ascii = "";

// Ouverture du document word en mode binaire
$fp = fopen($fichier,"rb");

while (!feof($fp)) {

$chaine = fread($fp,filesize($fichier));

// Codage du fichier en mode hexadécimal
$chaine = bin2hex($chaine);

// Enlève tous les caractères illisibles du début du fichier
$debut_chaine = strpos($chaine,$debut_binaire)+10;
$chaine = substr($chaine,$debut_chaine,filesize($fichier));

// Pareil pour la fin
$fin_chaine = strpos($chaine,$fin_binaire);
$chaine = substr($chaine,0,$fin_chaine);

// Codage de la chaine hexa en texte ascii :
for ($i=0;$i<strlen($chaine);$i+=2) {

// On prend les deux caractères hexa...
$car=substr($chaine,$i,2);

// On enlève ou remplace certains indésirables...
if ($car!="00") {
if ($car!="0d") {

// On code les hexa en décimal, puis en ascii
$car=hexdec($car);
$car=chr($car);

} else $car = "<BR>";
} else $car = "";

$chaine_ascii.=$car;
}
}

fclose($fp);

// Enregistrement dans un fichier ".doc.txt"
$fichier_txt = str_replace(".doc",".doc.txt",$fichier);

$fp = fopen($fichier_txt,"w+");
fwrite($fp,$chaine_ascii);
fclose($fp);

// Sert uniquement pour afficher le résultat pendant les tests. A enlever.
return $chaine_ascii;

}


--
Stéphane
La souplesse d'esprit permet de s'adapter dans toutes circonstances.

http://www.velo-passion.com pour les fans de vélo
http://www.lorimier.com/chemin-des-cretes-du-jura une ballade à pied d'une semaine à 2
http://www.baby-boum.ch l'enfant n'est-il pas l'avenir de l'homme?

Avatar
Denis Beauregard
Le 07 Jun 2004 09:28:33 GMT, Antoine Dinimant
écrivait dans fr.comp.lang.php:

- juste pour chipoter, le .RTF est certes un format d'échange devenu
standard, mais ça n'en reste pas moins un format tout aussi Microsoftien
que le .DOC


Jusqu'à Word 97 ou 2000, le .doc était un format binaire. Puis, à
partir de la version suivante (ou celle qui a suivi la suivante ?),
le .doc devait être une sorte de html. Je ne sais pas si cela a été
fait.

Par ailleurs, dans Word 97, enregistrer en format Word 6 revient à
enregistrer en format RTF (qui est du texte sans binaire).

Finalement, sur Hotmail, si on choisit d'envoyer un message en RTF,
on envoie un message en format html. Donc, M$ peut éventuellement
publier une description du RTF qui ne serait plus la même.


Denis

Avatar
Stephane Thomas
Antoine Dinimant wrote:
Bonjour,

Je cherche un système permettant à PHP de lire le texte d'un document
Word uploadé. J'ai entendu parler de diverses classes permettant cela,
mais soit elles ne fonctionnent que sur un serveur Windows, soit elles
ne permettent que de créer des .doc à la volée mais pas d'en lire...

Avez-vous des pistes ?

Merci d'avance !

Antoun


Peut-être une piste (si abiword est installé sur le serveur qui exécute
PHP) :

abiword -t txt fichier.doc

génère un fichier.txt contenant le texte contenu dans le .doc (on peut
aussi faire un -t html, ce qui peut être interessant.


Stef

Avatar
Antoine Dinimant
Je viens de tester avec un doc Word 2002 tout ce qu'il y a de plus
standard, sans images ni macro (je suis en EasyPHP sur Windows XP),
j'obtiens juste ±á (en hexa les caractères B1, 1A et E1), qui semble
faire partie de l'en-tête... En fait, mon fichier commence par ÐÏࡱá
(D0, CF, 11, E0, A1, puis la séquence ci-dessus), puis une série
d'espaces. Est-ce une coquille dans ton code, ou une config non prévue ?

En tout cas, bravo pour le boulot ! Comment as-tu obtenu les specs du
codage de Word ?

Antoun
Avatar
Jean-Marc Molina
Antoine Dinimant a écrit/wrote :
Je cherche un système permettant à PHP de lire le texte d'un document
Word uploadé. J'ai entendu parler de diverses classes permettant cela,
mais soit elles ne fonctionnent que sur un serveur Windows, soit elles
ne permettent que de créer des .doc à la volée mais pas d'en lire...


Sous Windows uniquement, tu peux utiliser les fonctions COM de PHP. Un
exemple est dispo dans le manuel, création et sauvegarde d'un document au
format Word (.doc). Pour les autres objets et méthodes disponibles, voir
l'API de Word (MSDN).

JM

Avatar
Jean-Marc Molina
jerome herve a écrit/wrote :
Sur windows, tu peux te servir des objets dom. si word est sur le
serveur, c'est possible.


De COM pas de DOM. COM est un protocole de communication qui te permettra
d'accès à l'ensemble des fonctionnalités disponibles dans l'API de
Word/Office.

JM