Pengantar Docx4J

1. Ikhtisar

Pada artikel ini, kami akan fokus pada pembuatan file. docx menggunakan pustaka docx4j.

Docx4j adalah pustaka Java yang digunakan untuk membuat dan memanipulasi file Office OpenXML - yang artinya hanya dapat bekerja dengan jenis file .docx , sedangkan versi Microsoft Word yang lebih lama menggunakan ekstensi .doc (file biner).

Perhatikan bahwa format OpenXML didukung oleh Microsoft Office yang dimulai dengan versi 2007.

2. Pengaturan Maven

Untuk mulai bekerja dengan docx4j, kita perlu menambahkan ketergantungan yang diperlukan ke dalam pom.xml kita :

 org.docx4j docx4j 3.3.5   javax.xml.bind jaxb-api 2.1 

Perhatikan bahwa kami selalu dapat mencari versi dependensi terbaru di Maven Central Repository.

The JAXB ketergantungan diperlukan, sebagai docx4j menggunakan library ini di bawah tenda untuk marshall / bagian XML unmarshall dalam docx file yang.

3. Buat Dokumen File Docx

3.1. Elemen Teks dan Gaya

Pertama mari kita lihat cara membuat file docx sederhana - dengan paragraf teks:

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

Inilah file welcome.docx yang dihasilkan :

Untuk membuat dokumen baru, kita harus menggunakan WordprocessingMLPackage , yang merepresentasikan file docx dalam format OpenXML , sedangkan kelas MainDocumentPart memegang representasi dari bagian document.xml utama .

Untuk membersihkan semuanya, mari unzip file welcome.docx , dan buka file word / document.xml untuk melihat seperti apa representasi XML:

      Hello World!     Welcome To Baeldung!   

Seperti yang bisa kita lihat, setiap kalimat diwakili oleh run ( r ) teks ( t ) di dalam paragraf ( p ) , dan untuk itulah metode addParagraphOfText () .

The addStyledParagraphOfText () melakukan sedikit lebih dari itu; itu membuat properti paragraf ( pPr ) yang menampung gaya untuk diterapkan ke paragraf.

Sederhananya, paragraf mendeklarasikan proses terpisah, dan setiap proses berisi beberapa elemen teks:

Untuk membuat dokumen yang terlihat bagus, kita harus memiliki kontrol penuh atas elemen-elemen ini (paragraf, proses, dan teks).

Jadi, mari temukan cara menyesuaikan gaya konten kita menggunakan objek runProperties ( RPr ):

ObjectFactory factory = Context.getWmlObjectFactory(); P p = factory.createP(); R r = factory.createR(); Text t = factory.createText(); t.setValue("Welcome To Baeldung"); 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);

Hasilnya seperti ini:

Setelah kami telah membuat sebuah paragraf, lari dan elemen teks menggunakan createP () , creater () dan createText () masing-masing, kita sudah mendeklarasikan baru runProperties objek ( RPR ) untuk menambahkan beberapa styling ke elemen teks.

The RPR objek digunakan untuk set properti format, Bold ( B ), Miring ( I ), dan dikapitalisasi ( Caps ), properti-properti yang diterapkan ke teks run menggunakan setRPr () metode.

3.2. Bekerja Dengan Gambar

Docx4j menawarkan cara mudah untuk menambahkan gambar ke dokumen Word kita:

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

Dan berikut adalah implementasi metode 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; }

Pertama, kami telah membuat file yang berisi gambar yang ingin kami tambahkan ke bagian dokumen utama kami, kemudian, kami telah menautkan array byte yang mewakili gambar dengan objek wordMLPackage .

Setelah bagian gambar dibuat, kita perlu membuat objek Inline menggunakan metode createImageInline ( ).

Metode addImageToParagraph () menyematkan objek Inline ke dalam Gambar sehingga bisa ditambahkan ke proses .

Terakhir, seperti paragraf teks, paragraf yang berisi gambar ditambahkan ke mainDocumentPart .

Dan inilah dokumen yang dihasilkan:

3.3. Membuat Tabel

Docx4j juga membuatnya sangat mudah untuk memanipulasi Tabel (Tbl), baris (Tr), dan kolom (Tc).

Mari kita lihat cara membuat tabel 3 × 3 dan menambahkan beberapa konten ke dalamnya:

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

Diberikan beberapa baris dan kolom, metode createTable () membuat objek Tbl baru , argumen ketiga mengacu pada lebar kolom dalam twips (yang merupakan pengukuran jarak - 1/1440 inci).

Setelah dibuat, kita dapat mengulang konten objek tbl , dan menambahkan objek Paragraph ke setiap sel.

Mari kita lihat seperti apa hasil akhirnya:

4. Membaca Dokumen File Docx

Sekarang kita telah menemukan cara menggunakan docx4j untuk membuat dokumen, mari kita lihat cara membaca file docx yang ada, dan mencetak isinya:

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

Dalam contoh ini, kami telah membuat objek WordprocessingMLPackage berdasarkan file helloWorld.docx yang ada , menggunakan metode load () .

Setelah itu, kami telah menggunakan ekspresi XPath ( // w: t ) untuk mendapatkan semua node teks dari bagian dokumen utama.

Metode getJAXBNodesViaXPath () mengembalikan daftar objek JAXBElement .

Hasilnya, semua elemen teks di dalam objek mainDocumentPart dicetak di konsol.

Perhatikan bahwa kami selalu dapat mengekstrak file docx kami untuk mendapatkan pemahaman yang lebih baik tentang struktur XML, yang membantu dalam menganalisis masalah, dan memberikan wawasan yang lebih baik tentang cara menanganinya.

5. Kesimpulan

Dalam artikel ini, kami telah menemukan bagaimana docx4j mempermudah untuk melakukan operasi kompleks pada dokumen MSWord, seperti membuat paragraf, tabel, bagian dokumen, dan menambahkan gambar.

Cuplikan kode dapat ditemukan, seperti biasa, di GitHub.