Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réempaquetage d'un docx !

28 juillet 2011 à 15:05:39

Bonjour à toutes et à tous ! :)

Vous ne le savez peut-être pas, mais si on décompresse un fichier .docx (document Word "classique" pour Office 2007 ou plus) avec winzip ou un équivalent, on obtient plein de fichiers XML (voire des fichiers images, etc...). Maintenant que ceux qui ne le savaient le savent, voici mon problème.

Je dois exporter une page web dans un document Word avec un template bien défini. J'ai donc créer le template en question à l'intérieur de Word et j'ai placé du texte de ce type là: $titre, $contenu, etc... => bref, des éléments qu'il sera facile de modifier grâce au PHP.

Ceci fait, j'ai enregistré le template en docx puis je l'ai décompressé pour obtenir la série de fichiers dont j'ai parlé plus haut.

Pour le moment, je ne modifie pas les fichiers XML, j'ai juste voulu tester la recomposition du fichier grâce à une librairie qui s’occupe de zipper des fichiers.

Tout fonctionne très bien, le fichier zip est bien créé, le contenu des fichiers est le même MAIS (parce qu'il y a un mais, je ne suis pas là pour rien :p), lorsque je change l'extension du fichier en .docx, Word me dit que le fichier est corrompu ! o_O

Vous avez une idée d'où ça peut venir ?

Merci d'avance pour votre aide !
  • Partager sur Facebook
  • Partager sur Twitter
31 juillet 2011 à 11:28:35

Je pense que cela vient de ton changement d'extension du fichier en ".docx". Comment le fais-tu ? Quelle extension as-tu avant de la changer ?
  • Partager sur Facebook
  • Partager sur Twitter
1 août 2011 à 9:21:12

En fait, en tout logique, j'ai un .zip qui sort, mais le nom du fichier a le format docx.
  • Partager sur Facebook
  • Partager sur Twitter
1 août 2011 à 11:29:16

Sa n'as pas l'air d'être comme ça pour la pratique en tout cas :-°

Par pur hasard tu as éssayé d'ouvrir ton zip avec Word (Ouais je sais sa parait farfelu mais autant éssayer) :-°

Renommer ton .zip en .docx aurait du fonctionner d'après ce que j'ai trouvé:

Citation : Goole Traduction

Renommez le fichier. Docx (après téléchargement) et de modifier l'extension du DOCX au format ZIP. L'icône associée à des modifications de fichiers. Windows va maintenant le voir comme une archive ZIP au lieu d'un document Word. Vous pouvez ouvrir le contenu avec WinZip, WinRAR, PKZIP, ou tout autre outil de compression ZIP d'autres.

Le contenu réel du document est contenu dans le fichier document.xml. Vous pouvez modifier le contenu du fichier en éditant le fichier XML directement avec notepad, il retomber dans l'conteneur ZIP, puis changez son extension de ZIP pour DOCX. Maintenant que vous avez fait le changement à votre fichier docx.



Source: http://www.drostdesigns.com

Sinon, j'ai vu parlé d'un document.xml (après extraction du zip) pour voir le contenu du document, c'est peut-être à creuser ;)

EDIT: Tu parle d'une recomposition avec une librairie, pourquoi as-tu besoin de cela ? Ta librairie à peut-être vraiment crée un .zip en enlevant "l'encapsulage" .docx
  • Partager sur Facebook
  • Partager sur Twitter
1 août 2011 à 14:47:24

Il me semble avoir eu un problème similaire quand je me suis intéressé à la question (il y a plus de 4 ans...).
Ça doit venir d'un problème de format du zip créé par ta librairie. Pourrais-tu essayer de créer ton zip autrement pour voir ce que ça donne ?

Par ailleurs, le format docx permet la création de templates dont les champs désignent des champs d'autres documents XML de l'archive. Tu n'aurais donc pas besoin de faire toi-même le remplacement des champs de ton template : il suffit de créer puis d'insérer dans l'archive un document XML avec toutes tes données, et word ira chercher bien sagement les valeurs qui t'intéressent au moment d'ouvrir le document ^^
  • Partager sur Facebook
  • Partager sur Twitter
1 août 2011 à 15:04:33

Pour le docx, j'ai plus ou moins résolu mon problème. Disons que si je crée le fichier docx sur le serveur et que je renvoie l'utilisateur vers ce dossier via un header(Location: (...)), ça fonctionne correctement (même si, dans ce cas, l'utilisateur doit faire un clic-droit "Enregistrer sous" pour ne pas tomber sur une page avec plein de caractères bizarres...).

En revanche, ton idée de template qui va récupérer les éléments automatiquement dans un fichier XML est intéressante ! As-tu plus d'infos là-dessus ? (je ne sais pas par où commencer mes recherches avec ce que tu m'as donné).

D'ailleurs, c'est justement là-dessus que je suis en train de travailler actuellement, et j'ai un petit problème de remplacement.

En fait, pour un champ particulier, on peut écrire du texte, mais aussi faire des listes (avec 2 niveaux de puce) => l'utilisateur peut aussi ne pas en faire... Si bien que j'ai créé une liste dans un docx pour voir à quoi ça correspondait en XML, et je me suis occupé de faire tout le nécessaire pour que ces listes apparaissent après remplacement.

Je viens tout juste d'avoir un truc fonctionnel, et je me demandais si c'était possible de faire ça avec ta technique automatique de remplacement via un fichier XML ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
6 octobre 2011 à 19:26:38

Bonjour Noxalus,

j'ai exactement le même problème de fichier docx corrompu, généré en PHP. Pourrais tu me donner ton code qui fonctionne (le zip du dossier et le header pour télécharger le fichier) ?

merci
  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2019 à 9:40:20

J'ai découvert un problème avec le téléchargement de fichiers .docx et .xlsx. Lors du téléchargement de ces fichiers, ils sont interpettés en tant qu'application / zip
  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2019 à 12:56:56

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter