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:

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 l’endroit 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();
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
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);
			}
		}
	}
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).
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