Word, xml et php

Lionnel06
Invité n'ayant pas de compte PHPfrance

05 déc. 2011, 17:49

Bonjour,

Voilà je laisse ce message sur le site, parce que j'ai un problème avec une application php que j'utilise pour mon travail.
Je prends un document word contenant du texte et des images, je le convertie en xml avec la fonction enregsitré sous de word.
La j'y ajoute des variables, qui son généré au préalable par un programme php.
Lorsque j'exécute mon programme, il crée donc les variables, remplace chaque variables du doc xml par le contenu qui lui correspond, par exemple un chiffre et ensuite enregistre le tout au format word.

Lorsqur j'execute tout cela sur mon pc windows avec easyphp, pas de soucis, tout fonctionne bien.

Cependant, j'ai voulu transférer mon programme sur un pc linux avec apache2 et php5 pour une mise en exploitation, mais la lorsque j'exécute le prgramme, tout fonctionne bien, si ce n'est que les images contenu dans le word n'apparaissent pas.
Il apparait à la place un carré blanc avec une croix rouge, comme sur une page web lorsque la page ne peut pas localiser une image.
Or les images son directement incluse dans le document word.

Quelqu'un peut m'aider???
Merci d'avance!!!

Petit nouveau ! | 9 Messages

05 déc. 2011, 18:14

Je pense que ton problème viens du séparateur des chemins de fichiers , windows utilise le / contrairement linux utilise le \ .
essaye de trouver le bout de code dans ton application qui est le responsable d'écrire le chemin de fichier , tu doit le modifier pour qu'il prend en compte l'OS
si tu continues a faire ce que tu as toujours fait, tu continues a être ce que tu as toujours été....
http://gasstonlabs.com

Lionnel06
Invité n'ayant pas de compte PHPfrance

06 déc. 2011, 12:16

Merci pour ta réponse, mais de quel chemin tu parle?
Celui pour que le programme trouve le fichier xml?
Celui est bon puisque le fichier est bien généré.
Ce sont uniquement les images qui n'apparaissent pas.

Mammouth du PHP | 19672 Messages

07 déc. 2011, 07:56

... windows utilise le / contrairement linux utilise le \ ...
Heu... c'est juste le contraire.

Pour ne pas se casser la tête avec ça, il est utile de passer par la constante PHP DIRECTORY_SEPARATOR qui vaudra le bon symbole quel que soit l'OS. Donc si on veut pointer vers un fichier, on écrira par exemple :
$chemin = "rep_1". DIRECTORY_SEPARATOR ."rep_2". DIRECTORY_SEPARATOR ."fichier.ext";
Sous Windows, ce sera automatiquement traduit en « rep_1\rep_2\fichier.ext » alors que sous Linux ça deviendra « rep_1/rep_2/fichier.ext » :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Lionnel06
Invité n'ayant pas de compte PHPfrance

07 déc. 2011, 10:07

Merci, mais cela ne change rien à mon problème, vu que dans mon fichier word les image sont mise directement dans le fichier par un copié - coller et que le fichier est converti ensuite en php.
Comme je le disais avant tout marche sous windows, mais sous linux les fichiers sont généré mais sans les images (fichiers word généré à partir de son équivalent xml)

Mammouth du PHP | 19672 Messages

07 déc. 2011, 10:21

Ok, mais les images ne sont-elles pas des fichiers à part ? Il faudrait vérifier dans tes fichiers XML vers où pointent exactement les chemins de ces images... si elles sont indiquées, à savoir s'ils sont en local ou ailleurs.

Si la version de MS-Word que tu utilise est au format docx, ces documents sont des archives que MS-Office décompresse et interprète pour affichage, sensiblement de la même manière que les fichier odt pour OpenOffice ou LibreOffice. Pour te donner une idée générale, fais une copie de ton fichier docx, remplace l'extension par un .zip et décompresse l'archive : en ouvrant cette dernière, tu vas voir comment est structuré le document et où sont les images. Ça t'ouvrira une piste vers la résolution de ton problème.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Lionnel06
Invité n'ayant pas de compte PHPfrance

08 déc. 2011, 17:49

La seule adresse que j'ai c'est ça w:name="wordml://02000001.jpg", mais je ne sais pas à quoi cela correspond. Comme j'ai essayer de l'expliquer avant, j'ai un document word (.doc) que je convertir en xml avec la fonction enregistrer sous de word.
Ensuite je retravaille mon fichier xml.
Les images étant déjà inséré par un copier/coller dans le document word.

Mammouth du PHP | 19672 Messages

08 déc. 2011, 18:40

C'est donc effectivement très probablement comme j'ai expliqué précédemment : je suis presque certain que le nom du fichier ne correspond pas au nom d'origine de l'image. C'est lors de l'insertion par copier/coller dans ton document que MS-Word en fait une copie et la renomme dans un sous-répertoire à l'intérieur du fichier. Si en recréant ton fichier word tu ne respectes pas l'arborescence des répertoires contenant les images, le xml pointera vers des images inexistantes et/ou introuvables. Si tu fais comme j'ai expliqué en remplaçant le « .docx » par « .zip » puis en décompressant l'archive pour visualiser ce que ça contient, tu vas trouver ton image dans un des sous-répertoires.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Lionnel06
Invité n'ayant pas de compte PHPfrance

12 déc. 2011, 10:08

Oui, mais comme je l'ai dit avant, mon fichier word n'est pas un .docx, mais bien un .doc

Mammouth du PHP | 19672 Messages

12 déc. 2011, 11:52

Dans ce cas, tu ne peux pas le décompresser pour l'ouvrir et pas davantage accéder aux images qui sont dedans puisque le format .doc n'est pas ouvert contrairement au docx.

En d'autres termes, il n'y a pas de solution à moins de modifier le chemin vers les images dans ton fichier XML et en joignant ces mêmes images à ce fichier xml.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

luky
Invité n'ayant pas de compte PHPfrance

09 mars 2012, 10:58

Bonjour à tous,

J'ai également eu ce problème lors de mes fichiers words générés. En réalité c'est assez simple.

L'image, comme le dit Lionnel06, est directement encodé dans le fichier xml (en base64), il n'y a donc pas de chemin d'accès vers l'image d'origine.

Cependant, l'image est nommé selon l'exemple : wordml://03000001.png
Il faut donc attribuer un nom unique à l'image que l'on retrouve 2 fois (tag <w:binData> et <v:shape>) de part et d'autre de l'image encodé
<w:binData w:name='wordml://03000001.png'>
<v:imagedata src='wordml://03000001.png' o:title='flamme'/></v:shape>
Il faut également lui attribuer un identifiant unique (tag <v/shape>)
<v:shape id='_x0000_i1025' type='#_x0000_t75' style='width:80pt;height:80pt'>
où id='_x0000_i1025' peut être incrémenté (i1026 i1027 ...)
le type (#_x0000_t75) peut être identique.