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