Bonjour,
je suis confronté à un problème dans un projet depuis plusieurs jours et j’espère trouver de l'aide sur ce forum.
J'essaye de créer une fonction en java (je développe sous Eclipse) qui permet de fusionner différents documents Word pour n'en faire qu'un seul, cela s’apparenterait à copier les documents (contenu + mise en page) le uns à la suite des autres.
J'ai donc écrit le code suivant:
Voici maintenant la fonction "merge"
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 public class Main { public static void main(String[] args) throws Exception { //Liste des numéro des documents que je souhaite "merger" ArrayList<String> Op= new ArrayList<String>(); Op.add("1"); Op.add("2"); Op.add("3"); //Fichier contenant le document final, si il existe déjà on le supprime afin d'en créer un nouveau et éviter des problème de sur-écriture File sortie = new File("Devis.doc"); if(sortie.exists()==true){ sortie.delete(); System.out.println("Delete previous Devis\n"); } //On prépare la première page à devoir être copie et lendroit où on doit la coller //L'argument true dans fos permet "normalement" de copier les données à la suite du document si il y a déjà des données présentent File entre = new File("page"+Op.get(0)+".doc"); FileOutputStream fos = new FileOutputStream(sortie, true); BufferedOutputStream bos = new BufferedOutputStream(fos); //On appelle la fonction qui effectue l'opération merge(Op, entre, bos); //On ferme le BufferedOutputStream bos.close();
Avec cette fonction j'arrive à copier l'ensemble des octets qui compose les différents documents (le document final a pour taille la somme d'octets des différents document fusionnés) mais quand j'ouvre ce document final, seul le premier document apparait (contenu + mise en page).
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 private static void merge(ArrayList<String> Op, File entre, BuffredOutputStream bos) throws IOException{ if(Op.size() == 0) return; else{ byte[] buffer = new byte[8]; //On prépare le fichier en entre FileInputStream fis = new FileInputStream(entre); BufferedInputStream bis = new BufferedInputStream(fis); //Tant qu'il reste des données (donc code de retour différent de -1), //on doit continuer à copier dans le fichier de sortie int numBytes = bis.read(buffer); try{ while(numBytes != -1){ bos.write(buffer, 0, numBytes); numBytes = bis.read(buffer); } bos.write(13); //Ajout d'un saut de ligne bos.write(10); //Ajout d'un retour chariot System.out.println("Copie de "+Op.get(0)+" dans fichier Devis"); bos.flush(); bis.close(); bos.close(); }catch (IOException e){ e.printStackTrace(); } //Une fois la page copier on la supprime de la liste des pages à copier //Si la liste n'est pas vide => Il y a d'autre page à copier donc on prepare la page suivante //et on rappel la fonction qui effectura l'opération Op.remove(0); if(Op.size()!=0){ entre = new File("page"+Op.get(0)+".doc"); merge(Op, entre, sortie); } } }
A noter que si j'ouvre ce document final dans un éditeur de texte (style WordPad), j'arrive à voir les autres documents (contenu et la mise en page apparait sous forme de symboles divers).
Si l'un d'antre vous à une solution et/ou idée pour m'aider à résoudre ce problème, merci d'avance.
Ps: J'ai essayé des solutions via des API comme POI ou Docx4j mais le résultat est soit le même que celui décris au dessus, soit je n'obtient qu'un document final corrompus. Si jamais vous avez une solution reposant sur ces API, je suis tout aussi preneur, merci
Partager