Merger des documents word (docx) en Java
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:
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(); |
Voici maintenant la fonction "merge"
Code:
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