Introduction à Docx4J

Introduction à Docx4J

1. Vue d'ensemble

Dans cet article, nous allons nous concentrer sur la création d'un document.docx à l'aide de la bibliothèquedocx4j.

Docx4j est une bibliothèque Java utilisée pour créer et manipuler des fichiers OfficeOpenXML - ce qui signifie qu'elle ne peut fonctionner qu'avec le type de fichier.docx, tandis que les anciennes versions de Microsoft Word utilisent une extension.doc (binaire des dossiers).

Notez que le formatOpenXML est pris en charge par Microsoft Office à partir de la version 2007.

2. Maven Setup

Pour commencer à travailler avec docx4j, nous devons ajouter la dépendance requise dans nospom.xml:


    org.docx4j
    docx4j
    3.3.5


    javax.xml.bind
    jaxb-api
    2.1

Notez que nous pouvons toujours rechercher les dernières versions des dépendances dans lesMaven Central Repository.

La dépendanceJAXB est nécessaire, car docx4j utilise cette bibliothèque sous le capot pour rassembler / désorganiser des parties XML dans un fichierdocx.

3. Créer un document de fichier Docx

3.1. Éléments de texte et style

Voyons d'abord comment créer un simple fichierdocx - avec un paragraphe de texte:

WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();
mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!");
mainDocumentPart.addParagraphOfText("Welcome To example");
File exportFile = new File("welcome.docx");
wordPackage.save(exportFile);

Voici le fichierwelcome.docx résultant:

image

Pour créer un nouveau document, nous devons utiliser leWordprocessingMLPackage, qui représente un fichierdocx au formatOpenXML, tandis que la classeMainDocumentPart contient une représentation du fichier principal Partiedocument.xml.

Pour clarifier les choses, décompressons le fichierwelcome.docx et ouvrons le fichierword/document.xml pour voir à quoi ressemble la représentation XML:


    
        
            
        
        
            Hello World!
        
    
    
        
            Welcome To example!
        
    

Comme nous pouvons le voir,each sentence is represented by a run (r) of text (t) inside a paragraph (p), et c’est à cela que sert la méthodeaddParagraphOfText().

LesaddStyledParagraphOfText() font un peu plus que cela; il crée des propriétés de paragraphe (pPr) qui contiennent le style à appliquer au paragraphe.

En termes simples, les paragraphes déclarent des exécutions séparées et chaque exécution contient des éléments de texte:

image

Pour créer un beau document, nous devons avoir un contrôle total sur ces éléments(paragraph, run, ettext).

Découvrons donc comment styliser notre contenu à l'aide de l'objetrunProperties (RPr):

ObjectFactory factory = Context.getWmlObjectFactory();
P p = factory.createP();
R r = factory.createR();
Text t = factory.createText();
t.setValue("Welcome To example");
r.getContent().add(t);
p.getContent().add(r);
RPr rpr = factory.createRPr();
BooleanDefaultTrue b = new BooleanDefaultTrue();
rpr.setB(b);
rpr.setI(b);
rpr.setCaps(b);
Color green = factory.createColor();
green.setVal("green");
rpr.setColor(green);
r.setRPr(rpr);
mainDocumentPart.getContent().add(p);
File exportFile = new File("welcome.docx");
wordPackage.save(exportFile);

Voici à quoi ressemble le résultat:

image

Après avoir créé un paragraphe, une exécution et un élément de texte en utilisant respectivementcreateP(),createR() etcreateText(), nous avons déclaré un nouvel objetrunProperties (RPr) s) pour ajouter du style à l'élément de texte.

L'objetrpr est utilisé pour définir les propriétés de mise en forme, en gras (B), en italique (I) et en majuscule (Caps), ces propriétés sont appliquées à l'exécution de texte en utilisant la méthodesetRPr().

3.2. Travailler avec des images

Docx4j offre un moyen simple d’ajouter des images à notre document Word:

File image = new File("image.jpg" );
byte[] fileContent = Files.readAllBytes(image.toPath());
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage
  .createImagePart(wordPackage, fileContent);
Inline inline = imagePart.createImageInline(
  "example Image (filename hint)", "Alt Text", 1, 2, false);
P Imageparagraph = addImageToParagraph(inline);
mainDocumentPart.getContent().add(Imageparagraph);

Et voici à quoi ressemble l'implémentation de la méthodeaddImageToParagraph():

private static P addImageToParagraph(Inline inline) {
    ObjectFactory factory = new ObjectFactory();
    P p = factory.createP();
    R r = factory.createR();
    p.getContent().add(r);
    Drawing drawing = factory.createDrawing();
    r.getContent().add(drawing);
    drawing.getAnchorOrInline().add(inline);
    return p;
}

Tout d’abord, nous avons créé le fichier contenant l’image que nous souhaitons ajouter à notre partie principale du document, puis nous avons lié le tableau d’octets représentant l’image à l’objetwordMLPackage.

Une fois la partie image créée, nous devons créer un objetInline en utilisant la méthodecreateImageInline().

La méthodeaddImageToParagraph() incorpore l'objetInline dans unDrawing afin qu'il puisse être ajouté à unrun.

Enfin, comme un paragraphe de texte, le paragraphe contenant l'image est ajouté auxmainDocumentPart.

Et voici le document résultant:

image

3.3. Création de tableaux

Docx4j facilite également la manipulation des tableaux (Tbl), des lignes (Tr) et des colonnes (Tc).

Voyons comment créer un tableau 3 × 3 et y ajouter du contenu:

int writableWidthTwips = wordPackage.getDocumentModel()
  .getSections().get(0).getPageDimensions().getWritableWidthTwips();
int columnNumber = 3;
Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips/columnNumber);
List rows = tbl.getContent();
for (Object row : rows) {
    Tr tr = (Tr) row;
    List cells = tr.getContent();
    for(Object cell : cells) {
        Tc td = (Tc) cell;
        td.getContent().add(p);
    }
}


Compte tenu de certaines lignes et colonnes, la méthodecreateTable() crée un nouvel objetTbl, le troisième argument fait référence à la largeur de colonne en twips (qui est une mesure de distance - 1 / 1440e de pouce).

Une fois créé, nous pouvons parcourir le contenu de l'objettbl et ajouter des objetsParagraph dans chaque cellule.

Voyons à quoi ressemble le résultat final:

image

4. Lire un document de fichier Docx

Maintenant que nous avons découvert comment utiliser docx4j pour créer des documents, voyons comment lire un fichier docx existant et imprimer son contenu:

File doc = new File("helloWorld.docx");
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
  .load(doc);
MainDocumentPart mainDocumentPart = wordMLPackage
  .getMainDocumentPart();
String textNodesXPath = "//w:t";
List textNodes= mainDocumentPart
  .getJAXBNodesViaXPath(textNodesXPath, true);
for (Object obj : textNodes) {
    Text text = (Text) ((JAXBElement) obj).getValue();
    String textValue = text.getValue();
    System.out.println(textValue);
}


Dans cet exemple, nous avons créé un objetWordprocessingMLPackage basé sur un fichierhelloWorld.docx existant, en utilisant la méthodeload().

Après cela, nous avons utilisé une expressionXPath (//w:t) pour obtenir tous les nœuds de texte de la partie principale du document.

La méthodegetJAXBNodesViaXPath() renvoie une liste d'objetsJAXBElement.

En conséquence, tous les éléments de texte à l'intérieur de l'objetmainDocumentPart sont imprimés dans la console.

Notez que nous pouvons toujours décompresser nos fichiers docx pour mieux comprendre la structure XML, ce qui facilite l'analyse des problèmes et permet de mieux comprendre comment les résoudre.

5. Conclusion

Dans cet article, nous avons découvert comment docx4j facilite l'exécution d'opérations complexes sur un document MSWord, telles que la création de paragraphes, de tableaux, de parties de document et l'ajout d'images.

Les extraits de code peuvent être trouvés, comme toujours,over on GitHub.