Fichier texte corrompu
réparation fichier corrompu
Contributeur·ice·s
Statut du projet
fonctionnel
Statut de la publication
License
GPL
Inspiration
Fichiers source
Machines
Matériaux
Lien
Sommaire
Comment récupérer le texte d'un document .docx corrompu ?
Ça arrive à tous le monde, au moins une fois dans sa vie, parfois on bosse sur un mémoire, un rapport de stage, une thèse, une traduction, son autobiographie... Des milliers de caractères qui s'enchaînent les uns à la suite des autres.
On fait pas forcément attention à sauvegarder 20 versions différentes de son documents, dans 30 dossiers chiffrés afin de s'assurer de la pérennité de son travail... Et un beau jour (...) notre fichier maViemonOeuvre.docx ne veut plus s'ouvrir.
Notre fichier est corrompu, c'est foutu, je t'avais bien dit de pas utiliser des logiciels libres, c'est vraiment pas fiable...Bref c'est la panade.
Tout d'abord il faut savoir que ce genre de problème n'est pas inhérent à l'utilisation de solutions libres (d'ailleurs .docx est la propriété de Microsoft ©©©), c'est également très présent dans des solutions propriétaires. Quant à l'origine du bug, ça reste un mystère (importation de données copier-coller depuis le web ? vérole envoyée par de vils personnages ?...)
Ouvrir le .docx avec le gestionnaire d'archive
Et maintenant une solution... :
Les documents textes "complexes" tels que ceux utilisés avec libreOffice, mais aussi openOffice, word etc. sont en fait des paquets contenant plusieurs types de fichiers. En somme un fichier .odt ou ici .docx s'apparentent plus à un dossier qu'à un fichier. C'est le syndrome des poupées russes.
Intéressons nous au format .docx : https://fr.wikipedia.org/wiki/Docx
Alors comment accéder au contenu disponible dans un fichier .docx ? Et bien tout simplement en utilisant un gestionnaire d'archives.
"Le format docx est en fait un fichier compressé au format ZIP qui contient un ensemble de fichiers (XML, images .jpg) décrivant le document."
Ouvrir le fichier document.xml
Une fois à ce stade, il faut se rendre dans le dossier "word", dans lequel on trouve tout un ensemble de fichier .xml.
On y trouve le fichier document.xml, c'est celui ci qui contient l'ensemble du texte que vous avez pu rédiger durant de nombreuses heures de labeur (hormis les commentaires, notes et autres éléments graphiques). En tout cas l'essentiel de votre pensée féconde se trouve dans ce fichier.
Vous pouvez ouvrir document.xml avec un éditeur de texte type gedit, mousepad ou leafpad. Vous vous rendrez compte alors de la riche pensée complexe des types qui inventent les langages informatiques, en admirant toutes ces magnifiques balises et ce rigoureux rangement bien ordonné, mais malheureusement bien laborieux pour l’œil d'un humain.
Qu'est ce que le XML ?
On va pas réinventer la poudre :
https://fr.wikipedia.org/wiki/Extensible_Markup_Language
http://xml.chez.com/initiation/
http://www.commentcamarche.net/contents/1332-introduction-a-xml
Récupérer le contenu textuel depuis le fichier document.xml
À partir de maintenant il s'agit de pouvoir récupérer dans ce qui ressemble à ça :
<w:r><w:rPr><w:rFonts w:ascii="Courier New" w:cs="Lohit Hindi" w:eastAsia="WenQuanYi Micro Hei" w:hAnsi="Courier New"/><w:b/><w:bCs/><w:i/><w:iCs/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="fr-FR"/></w:rPr><w:t xml:space="preserve"> / qui ma donné </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="Courier New" w:cs="Lohit Hindi" w:eastAsia="WenQuanYi Micro Hei" w:hAnsi="Courier New"/><w:b/><w:bCs/><w:i/><w:iCs/><w:sz w:val="24"/><w:szCs w:val="24"/><w:shd w:fill="FFFF00" w:val="clear"/><w:lang w:val="fr-FR"/></w:rPr><w:t>son cœur</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="Courier New" w:cs="Lohit Hindi" w:eastAsia="WenQuanYi Micro Hei" w:hAnsi="Courier New"/><w:b/><w:bCs/><w:i/><w:iCs/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="fr-FR"/></w:rPr><w:t xml:space="preserve"> envers et contre tout.</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style0"/><w:suppressAutoHyphens w:val="false"/><w:spacing w:after="120" w:before="240" w:line="480" w:lineRule="auto"/><w:jc w:val="left"/></w:pPr><w:r><w:rPr/></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style0"/><w:pageBreakBefore/><w:suppressAutoHyphens w:val="false"/><w:spacing w:after="120" w:before="240" w:line="480" w:lineRule="auto"/><w:jc w:val="left"/></w:pPr><w:r><w:rPr/></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style0"/><w:suppressAutoHyphens w:val="false"/><w:spacing w:after="120" w:before="240" w:line="480" w:lineRule="auto"/><w:jc w:val="left"/></w:pPr><w:r><w:rPr/></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style27"/><w:suppressAutoHyphens w:val="false"/><w:jc w:val="center"/></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Courier New" w:cs="Lohit Hindi" w:eastAsia="WenQuanYi Micro Hei" w:hAnsi="Courier New"/><w:b/><w:bCs/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr><w:t>1</w:t></w:r></w:p><w:p><w:pPr><w:pStyle w:val="style0"/><w:suppressAutoHyphens w:val="false"/><w:spacing w:after="120" w:before="240" w:line="480" w:lineRule="auto"/><w:jc w:val="left"/></w:pPr><w:r><w:rPr/></w:r></w:p><w:p> <w:pPr><w:pStyle w:val="style0"/><w:suppressAutoHyphens w:val="false"/><w:spacing w:after="120" w:before="240" w:line="480" w:lineRule="auto"/><w:jc w:val="left"/></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Courier New" w:cs="Lohit Hindi" w:eastAsia="WenQuanYi Micro Hei" w:hAnsi="Courier New"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr><w:t>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet. .</w:t></w:r>
Bon là c'est facile, on voit bien le texte, mais imaginez plein de petits bouts de textes tout éclaté dans le xml et qu'il faut récupérer patiemment à la main pendant des heures... non ce n'est pas diable possible ! Il faut utiliser un programme qui permette de trier dans toutes ces balises et d'extraire les données qui nous intéressent.
Comme je n'ai pas ça sous la main (si quelqu'un connaît ça sous GNU/Linux qu'il me fasse signe ! ) en faisant un bout de code on doit pouvoir arriver à nos fins.
Certains développeurs à l'éthique irréprochable me soutiendront qu'il vaudrait mieux faire ça avec python et d'autres avec Caml, mais voyez vous, j'y connait à peu près rien alors j'ai fais ça avec Processing. C'est sûrement peu performant mais on va dire que ici, Processing est mon couteau-suisse.
Processing ?
Alors pour extraire mes textes de mon fichier .xml j'ai utilisé Processing: http://www.processing.org/
C'est pas compliqué à installer, sur toutes les plateformes : https://www.processing.org/download/
Le code est disponible à cette adresse : https://gitorious.org/parse_texte_xml_processing/parse_texte_xml_processing/trees/master Vous avez un bouton download en bas à droite.
Sinon directement le code ici: <blackquote> /* Récupération des éléments textuels dans un fichier xml corrompu (fichier docx corrompu à la base) Permet en autre de récupérer 3 mois de travail de traduction.
Copyleft pour tous les zozos et les loulous.
- /
// le document xml à exploiter (attention on commencera à chercher les child à partir de la balise <body> et non <document>) String ba = "document2.xml";
void setup() {
XML xml = loadXML(ba);
// la variable String dans laquelle je vais ajouter les éléments textuels récupérés dans mon XML au fur et à mesure. String texte = "";
// Je récupère d'abord les elts dans la balise body XML niveau_zero = xml.getChild("body");// évidemment il y a bcp de balises
dans cette balise <body> il convient de les récupérer toutes. XML[] niveau_un = niveau_zero.getChildren("p"); // je scanne ma boucle avec toutes mes balises <p> // pour y récupérer mes balises <r>... et oui for (int k=0; k<niveau_un.length; k++) { XML niveau_deux = niveau_un[k].getChild("r"); // si nous avons bien une balise <r> dans la balise <p> alors on peut // regarder s'il y a une balise <t>, ces fameuses balises qui contiennent // des elements textuels. if (niveau_deux != null) { XML[] children = niveau_deux.getChildren("t"); // j'ajoute le contenu textuel récolté à ma variable texte. for (int i=0; i<children.length; i++) { texte += children[i].getContent(); } } } // petite manipe peu élégante pour imprimer le contenu de la variable texte // dans un fichier .txt if (texte != null) { String textFinal [] = { " ", " " }; textFinal = append(textFinal, texte); saveStrings("testExport.txt", textFinal); println(texte); } } void draw() { } </blackquote>