Docx4Jの紹介

Docx4Jの概要

1. 概要

この記事では、docx4jライブラリを使用して。docxドキュメントを作成することに焦点を当てます。

Docx4jは、OfficeOpenXMLファイルの作成と操作に使用されるJavaライブラリです。つまり、.docxファイルタイプでのみ機能しますが、古いバージョンのMicrosoft Wordは.doc拡張子(バイナリ)を使用します。ファイル)。

OpenXML形式は、2007バージョン以降のMicrosoftOfficeでサポートされていることに注意してください。

2. Mavenセットアップ

docx4jの使用を開始するには、必要な依存関係をpom.xmlに追加する必要があります。


    org.docx4j
    docx4j
    3.3.5


    javax.xml.bind
    jaxb-api
    2.1

Maven Central Repositoryで常に最新の依存関係バージョンを検索できることに注意してください。

docx4jは内部でこのライブラリを使用してdocxファイル内のXMLパーツをマーシャル/アンマーシャルするため、JAXB依存関係が必要です。

3. Docxファイルドキュメントを作成する

3.1. テキスト要素とスタイリング

まず、テキスト段落を使用して単純なdocxファイルを作成する方法を見てみましょう。

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);

結果のwelcome.docxファイルは次のとおりです。

image

新しいドキュメントを作成するには、docxファイルをOpenXML形式で表すWordprocessingMLPackageを使用する必要がありますが、MainDocumentPartクラスはメインの表現を保持しますdocument.xmlの部分。

問題を解決するために、welcome.docxファイルを解凍し、word/document.xmlファイルを開いてXML表現がどのように見えるかを確認しましょう。


    
        
            
        
        
            Hello World!
        
    
    
        
            Welcome To example!
        
    

ご覧のとおり、each sentence is represented by a run (r) of text (t) inside a paragraph (p)は、addParagraphOfText()メソッドの目的です。

addStyledParagraphOfText()はそれより少し多くのことをします。段落に適用するスタイルを保持する段落プロパティ(pPr)を作成します。

簡単に言えば、段落は別々の実行を宣言し、各実行にはいくつかのテキスト要素が含まれます。

image

見栄えの良いドキュメントを作成するには、これらの要素(paragraph, run,text).を完全に制御する必要があります。

それでは、runPropertiesRPr)オブジェクトを使用してコンテンツをスタイル化する方法を見つけましょう。

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);

結果は次のようになります。

image

createP()createR()createText()をそれぞれ使用して段落、実行、テキスト要素を作成した後、新しいrunPropertiesオブジェクト(RPrを宣言しました。 )s)テキスト要素にスタイルを追加します。

rprオブジェクトは、書式設定プロパティ、太字(B)、斜体(I)、大文字(Caps)を設定するために使用され、これらのプロパティはテキスト実行に適用されます。 setRPr()メソッドを使用します。

3.2. 画像の操作

Docx4jは、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);

そして、addImageToParagraph()メソッドの実装は次のようになります。

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;
}

最初に、メインドキュメントパーツに追加する画像を含むファイルを作成し、次に画像を表すバイト配列をwordMLPackageオブジェクトにリンクしました。

画像パーツを作成したら、createImageInline()メソッドを使用してInlineオブジェクトを作成する必要があります。

addImageToParagraph()メソッドは、InlineオブジェクトをDrawingに埋め込んで、run.に追加できるようにします。

最後に、テキスト段落のように、画像を含む段落がmainDocumentPartに追加されます。

そして、これが結果のドキュメントです:

image

3.3. テーブルを作成する

また、Docx4jを使用すると、テーブル(Tbl)、行(Tr)、列(Tc)を非常に簡単に操作できます。

3×3のテーブルを作成してコンテンツを追加する方法を見てみましょう。

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);
    }
}


いくつかの行と列が与えられると、createTable()メソッドは新しいTblオブジェクトを作成し、3番目の引数はtwip単位の列幅を参照します(距離の測定値– 1/1440インチ)。

作成したら、tblオブジェクトのコンテンツを反復処理し、Paragraphオブジェクトを各セルに追加できます。

最終結果がどのようになるか見てみましょう。

image

4. Docxファイルドキュメントの読み取り

docx4jを使用してドキュメントを作成する方法を発見したので、既存のdocxファイルを読み取ってそのコンテンツを印刷する方法を見てみましょう。

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);
}


この例では、load()メソッドを使用して、既存のhelloWorld.docxファイルに基づいてWordprocessingMLPackageオブジェクトを作成しました。

その後、XPath式(//w:t)を使用して、メインドキュメントパーツからすべてのテキストノードを取得しました。

getJAXBNodesViaXPath()メソッドは、JAXBElementオブジェクトのリストを返します。

その結果、mainDocumentPartオブジェクト内のすべてのテキスト要素がコンソールに出力されます。

XML構造の理解を深めるためにdocxファイルをいつでも解凍できることに注意してください。これは問題の分析に役立ち、それらに対処する方法についてのより良い洞察を提供します。

5. 結論

この記事では、docx4jを使用すると、段落、表、ドキュメントパーツの作成、画像の追加など、MSWordドキュメントで複雑な操作を簡単に実行できることを発見しました。

コードスニペットは、いつものように、over on GitHubで見つけることができます。