IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Fichier ODT corrompu


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 35
    Par défaut Fichier ODT corrompu
    Bonjour,

    Je viens de faire un programme qui me permet de réécrire automatiquement des liens présents dans un ODT ainsi que de télécharger les pièces jointes associées (les liens présents dans le document mènent vers un document présent sur internet, c'est ça les pièces jointes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Text.RegularExpressions;
    using ICSharpCode.SharpZipLib.Core;
    using ICSharpCode.SharpZipLib.Zip;
     
    namespace PrepareDocForExternalUse
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Demande à l'utilisateur le chemin absolu d'un fichier ODT
                Console.WriteLine("Merci de renseigner le chemin absolu d'un fichier ODT:");
                string odtFilePath = Console.ReadLine();
     
                // Lis le contenu du fichier ODT
                byte[] content = File.ReadAllBytes(odtFilePath);
                MemoryStream ms = new MemoryStream();
                ms.Write(content, 0, content.Length);
                ZipFile zf = new ZipFile(ms);
                zf.UseZip64 = UseZip64.Off;
                zf.IsStreamOwner = false;
                ZipEntry entry = zf.GetEntry("content.xml");
                Stream s = zf.GetInputStream(entry);
     
                // Convertit le stream en string
                StreamReader reader = new StreamReader(s);
                string contentXml = reader.ReadToEnd();
     
                // Recherche tous les liens qui commencent par "test.test.fr"
                string pattern = @"http://test\.test\.fr/GetContenu/Download\.aspx\?p1=.*?;p2=.*?;p5=.*?;p6=NOPUB";
                Regex regex = new Regex(pattern);
                MatchCollection matches = regex.Matches(contentXml);
                // Traite chaque lien trouvé
                foreach (Match match in matches)
                {
                    string link = match.Value;
     
                    string[] parts = link.Split(new string[] { "aspx?" }, StringSplitOptions.None);
                    string queryString = parts[parts.Length - 1];
     
     
     
                    string[] parameterParts = Regex.Split(link, "(?<=aspx\\?)");
     
                    // Télécharge le document intranet correspondant
                    string newFileName = Path.GetFileName(new Uri(link).LocalPath);
                    string folderName = Path.GetFileNameWithoutExtension(odtFilePath);
                    string subFolderName = "PJ - " + folderName;
                    string localFilePath = @"com.test.fr/files/test/test/" + queryString;
     
     
                    Directory.CreateDirectory(Path.GetDirectoryName(localFilePath));
     
                    using (WebClient client = new WebClient())
                    {
                        client.DownloadFile(link, localFilePath);
                    }
     
                    // Remplace le lien par le chemin du document téléchargé
                    string newLink = localFilePath.Replace("\\", "/");
                    contentXml = contentXml.Replace(link, newLink);
                }
     
                // Met à jour le content.xml dans le fichier ZIP initial
                byte[] contentXmlBytes = System.Text.Encoding.UTF8.GetBytes(contentXml);
                ms = new MemoryStream();
                zf.BeginUpdate();
     
                // Ajoute le contenu mis à jour au fichier ZIP
                ZipOutputStream zos = new ZipOutputStream(ms);
                zos.UseZip64 = UseZip64.Off;
                zos.IsStreamOwner = false;
                zos.PutNextEntry(new ZipEntry(entry.Name));
                StreamUtils.Copy(new MemoryStream(contentXmlBytes), zos, new byte[4096]);
                zos.Close();
     
                // Termine la mise à jour du fichier ZIP
                zf.CommitUpdate();
                zf.Close();
     
                // Renomme et enregistre le fichier ODT mis à jour
                string updatedFilePath = Path.Combine(Path.GetDirectoryName(odtFilePath), "updated_" + Path.GetFileName(odtFilePath));
                using (FileStream stream = new FileStream(updatedFilePath, FileMode.Create))
                {
                    ms.Position = 0;
                    ms.WriteTo(stream);
                }
                Console.WriteLine("Le fichier ODT a été mis à jour avec succès et enregistré sous le nom : " + updatedFilePath);
     
                Console.ReadLine();
            }
        }
    }
    Je ne sais pas pourquoi mais à la sortie de ce programme, j'ai un fichier qui est corrompu avec comme message d'erreur :

    Le fichier 'updated_News Test & Test.odt' est corrompu et ne peut donc être ouvert. LibreOffice peut essayer de réparer le fichier.

    La corruption peut être le résultat de la manipulation du document ou d'une détérioration de la structure du document due à la transmission des données.

    Nous vous recommandons de ne pas faire confiance au contenu du document réparé.
    L'exécution des macros est désactivée pour ce document.

    LibreOffice doit-il réparer le fichier ?

    Est ce que j'ai fais une erreur sur le Zippage et Dézippage du fichier ce qui a provoqué cette erreur ?

    Je ne dirai pas non à une aide

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Que fait StreamUtils.Copy ? Quel est son code ? Quel est le 3e paramètre notamment ?

    Sinon, un moyen de voir un peu le problème, c'est de décompresser le fichier obtenu, et de regarder s'il y a bien un fichier content.xml, et de vérifier que son contenu est bon (qu'il ne soit pas tronqué ou qu'un entête n'ait pas été rajouté par exemple).

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 35
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Que fait StreamUtils.Copy ? Quel est son code ? Quel est le 3e paramètre notamment ?

    Sinon, un moyen de voir un peu le problème, c'est de décompresser le fichier obtenu, et de regarder s'il y a bien un fichier content.xml, et de vérifier que son contenu est bon (qu'il ne soit pas tronqué ou qu'un entête n'ait pas été rajouté par exemple).
    J'ai utilisé le StreamUtils.Copy pour transférer les données de contentXmlBytes vers le flux Zos (qui représente le fichier Zip mis à jour).

    J'ai déjà effectué la manipulation de zip manuel pour voir le contenu, résultat : Je retrouve uniquement un content.xml et pas les autres fichiers qui sont présents de base dans un document ODT et il s'avère que le content.xml est bien modifié avec les liens à jour. Donc je ne sais pas trop d'où vient la corruption.

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Gekidow Voir le message
    J'ai utilisé le StreamUtils.Copy pour transférer les données de contentXmlBytes vers le flux Zos (qui représente le fichier Zip mis à jour).
    Ca, j'avais compris, mais parfois le loup se cache dans les détails. La question c'était plutôt d'avoir le code de cette méthode, car ce n'est pas un code issu du framework .Net, mais soit un développement spécifique, soit une bibliothèque tierce.

    Citation Envoyé par Gekidow Voir le message
    J'ai déjà effectué la manipulation de zip manuel pour voir le contenu, résultat : Je retrouve uniquement un content.xml et pas les autres fichiers qui sont présents de base dans un document ODT et il s'avère que le content.xml est bien modifié avec les liens à jour. Donc je ne sais pas trop d'où vient la corruption.
    C'est important de le préciser, puisque le problème vient de là. Après une vérification de la documentation, new ZipOutputStream(ms) va créer une nouvelle archive, et non utiliser l'archive présente dans le flux existant.

    Donc soit il faut changer la méthode d'ouverture pour mettre à jour une archive existante au lieu d'en créer une nouvelle, soit il faut recopier les autres entrées manuellement.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 35
    Par défaut
    J'ai bien compris le problème mais je sais pas trop comment modifier ceci, si quelqu'un aurait des suggestions je suis preneur.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2023
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2023
    Messages : 35
    Par défaut
    J'ai réussi à transférer aussi les autres fichiers, Nom : Annotation 2023-04-18 105550.png
Affichages : 188
Taille : 25,2 Ko

    Une fois que j'ouvre mon fichier ODT final, j'obtiens cette erreur : Nom : Annotation 2023-04-18 105654.png
Affichages : 192
Taille : 7,0 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Text.RegularExpressions;
    using ICSharpCode.SharpZipLib.Core;
    using ICSharpCode.SharpZipLib.Zip;
     
    namespace PrepareDocForExternalUse
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Demande à l'utilisateur le chemin absolu d'un fichier ODT
                Console.WriteLine("Merci de renseigner le chemin absolu d'un fichier ODT:");
                string odtFilePath = Console.ReadLine();
     
                // Lis le contenu du fichier ODT
                byte[] content = File.ReadAllBytes(odtFilePath);
                MemoryStream ms = new MemoryStream();
                ms.Write(content, 0, content.Length);
                ZipFile zf = new ZipFile(ms);
                zf.UseZip64 = UseZip64.Off;
                zf.IsStreamOwner = false;
                ZipEntry entry = zf.GetEntry("content.xml");
                Stream s = zf.GetInputStream(entry);
     
                // Convertit le stream en string
                StreamReader reader = new StreamReader(s);
                string contentXml = reader.ReadToEnd();
     
                // Recherche tous les liens qui commencent par "applnet.test.fr"
                string pattern = @"http://applnet\.test\.fr/GetContenu/Download\.aspx\?p1=.*?;p2=.*?;p5=.*?;p6=NOPUB";
                Regex regex = new Regex(pattern);
                MatchCollection matches = regex.Matches(contentXml);
                // Traite chaque lien trouvé
                foreach (Match match in matches)
                {
                    string link = match.Value;
     
                    string[] parts = link.Split(new string[] { "aspx?" }, StringSplitOptions.None);
                    string queryString = parts[parts.Length - 1];
     
     
     
                    string[] parameterParts = Regex.Split(link, "(?<=aspx\\?)");
     
                    // Télécharge le document intranet correspondant
                    string newFileName = Path.GetFileName(new Uri(link).LocalPath);
                    string folderName = Path.GetFileNameWithoutExtension(odtFilePath);
                    string subFolderName = "PJ - " + folderName;
                    string localFilePath = @"com.test.fr/files/test/test/" + queryString;
     
     
                    Directory.CreateDirectory(Path.GetDirectoryName(localFilePath));
     
                    using (WebClient client = new WebClient())
                    {
                        client.DownloadFile(link, localFilePath);
                    }
     
                    // Remplace le lien par le chemin du document téléchargé
                    string newLink = localFilePath.Replace("\\", "/").Replace("&amp", "").Replace(";", "&");
                    contentXml = contentXml.Replace(link, newLink);
                }
     
                // Met à jour le content.xml dans le fichier ZIP initial
                byte[] contentXmlBytes = System.Text.Encoding.UTF8.GetBytes(contentXml);
                ms = new MemoryStream();
                zf.BeginUpdate();
     
                // Ajoute le contenu mis à jour au fichier ZIP
                ZipOutputStream zos = new ZipOutputStream(ms);
                zos.UseZip64 = UseZip64.Off;
                zos.IsStreamOwner = false;
     
                // Ajoute l'entrée pour le fichier content.xml
                zos.PutNextEntry(new ZipEntry(entry.Name));
                StreamUtils.Copy(new MemoryStream(contentXmlBytes), zos, new byte[4096]);
     
                // Traite chaque entrée du fichier ODT original
                foreach (ZipEntry origEntry in zf)
                {
                    // Ignore l'entrée pour le fichier content.xml car il a déjà été ajouté
                    if (origEntry.Name == entry.Name) continue;
     
                    // Ajoute l'entrée au nouveau fichier ZIP
                    zos.PutNextEntry(new ZipEntry(origEntry.Name));
                    StreamUtils.Copy(zf.GetInputStream(origEntry), zos, new byte[4096]);
                }
     
                zos.Close();
     
                // Termine la mise à jour du fichier ZIP
                zf.CommitUpdate();
                zf.Close();
     
     
                // Renomme et enregistre le fichier ODT mis à jour
                string updatedFilePath = Path.Combine(Path.GetDirectoryName(odtFilePath), "updated_" + Path.GetFileName(odtFilePath));
                using (FileStream stream = new FileStream(updatedFilePath, FileMode.Create))
                {
                    ms.Position = 0;
                    ms.WriteTo(stream);
                }
                Console.WriteLine("Le fichier ODT a été mis à jour avec succès et enregistré sous le nom : " + updatedFilePath);
     
                Console.ReadLine();
            }
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fichier ODT reconstitué corrompu
    Par virginieh dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 22/10/2018, 09h41
  2. [OpenOffice][Texte] Fichier ODT corrompu sous AOO et non sous LibreOffice
    Par djibril dans le forum OpenOffice & LibreOffice
    Réponses: 4
    Dernier message: 30/04/2016, 00h08
  3. Lien d'édition vers un fichier odt
    Par nicou50 dans le forum Langage
    Réponses: 2
    Dernier message: 08/03/2006, 13h38
  4. Lien d'édition vers un fichier odt
    Par nicou50 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/03/2006, 17h50
  5. [FPDF] Fichier résultant corrompu en php5
    Par titou12 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 10/02/2006, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo