Pengenalan Kepada Docx4J

1. Gambaran keseluruhan

Dalam artikel ini, kami akan memberi tumpuan untuk membuat. dokumen docx menggunakan perpustakaan docx4j.

Docx4j adalah perpustakaan Java yang digunakan untuk membuat dan memanipulasi fail Office OpenXML - yang bermaksud ia hanya dapat berfungsi dengan jenis fail .docx , sementara versi Microsoft Word yang lebih lama menggunakan pelanjutan .doc (fail binari).

Perhatikan bahawa format OpenXML disokong oleh Microsoft Office bermula dengan versi 2007.

2. Persediaan Maven

Untuk mula bekerja dengan docx4j, kita perlu menambahkan kebergantungan yang diperlukan ke dalam pom.xml kami :

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

Perhatikan bahawa kami sentiasa dapat mencari versi dependensi terbaru di Maven Central Repository.

The JAXB pergantungan diperlukan, kerana docx4j menggunakan perpustakaan ini di bawah hud untuk marshall / bahagian XML unmarshall dalam docx fail.

3. Buat Dokumen Fail Docx

3.1. Elemen dan Gaya Teks

Mari lihat dahulu cara membuat fail docx sederhana - dengan perenggan 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 fail welcome.docx yang dihasilkan :

Untuk membuat dokumen baru, kita harus memanfaatkan WordprocessingMLPackage , yang mewakili file docx dalam format OpenXML , sementara kelas MainDocumentPart memegang representasi dari bahagian document.xml utama .

Untuk menyelesaikan perkara, mari kita unzip fail welcome.docx , dan buka fail word / document.xml untuk melihat seperti apa gambaran XML:

      Hello World!     Welcome To Baeldung!   

Seperti yang dapat kita lihat, setiap kalimat diwakili oleh run ( r ) teks ( t ) di dalam perenggan ( p ) , dan itulah yang digunakan untuk kaedah addParagraphOfText () .

The addStyledParagraphOfText () melakukan sedikit lebih daripada itu; ia mewujudkan sifat perenggan ( pPr ) yang memegang gaya untuk diterapkan pada perenggan tersebut.

Ringkasnya, perenggan menyatakan jalan terpisah, dan setiap larian mengandungi beberapa elemen teks:

Untuk membuat dokumen yang menarik, kita perlu mempunyai kawalan penuh terhadap elemen-elemen ini (perenggan, larian, dan teks).

Oleh itu, mari kita ketahui cara menggayakan kandungan kami 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);

Inilah hasilnya:

Selepas kami telah mencipta satu perenggan, lari dan elemen teks menggunakan createP () , Creater () dan createText () masing-masing, kami telah mengisytiharkan baru runProperties objek ( RPR ) untuk menambah beberapa styling dengan elemen teks.

The rpr objek digunakan untuk hartanah pemformatan set, Bold ( B ), ditulis dengan huruf condong ( I ), dan modal ( Huruf Besar ), harta digunakan untuk jangka teks yang menggunakan setRPr () kaedah.

3.2. Bekerja Dengan Imej

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

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

Seperti inilah pelaksanaan kaedah 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 fail yang mengandungi gambar yang ingin kami tambahkan ke bahagian dokumen utama kami, kemudian, kami telah menghubungkan array bait yang mewakili gambar dengan objek wordPackage .

Setelah bahagian gambar dibuat, kita perlu membuat objek Inline menggunakan kaedah createImageInline ( ).

Kaedah addImageToParagraph () menanamkan objek Inline ke dalam Drawing sehingga dapat ditambahkan ke dalam run.

Akhirnya, seperti perenggan teks, perenggan yang mengandungi gambar ditambahkan ke mainDocumentPart .

Dan inilah dokumen yang dihasilkan:

3.3. Membuat Jadual

Docx4j juga memudahkan manipulasi Jadual (Tbl), baris (Tr), dan lajur (Tc).

Mari lihat bagaimana membuat jadual 3 × 3 dan tambahkan beberapa kandungan padanya:

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

Memandangkan beberapa baris dan lajur, kaedah createTable () membuat objek Tbl baru , argumen ketiga merujuk pada lebar lajur dalam twips (yang merupakan ukuran jarak - 1/1440 inci).

Setelah dibuat, kita dapat melakukan iterasi atas isi objek tbl , dan menambahkan objek Perenggan ke dalam setiap sel.

Mari lihat bagaimana hasil akhirnya:

4. Membaca Dokumen Fail Docx

Setelah mengetahui cara menggunakan docx4j untuk membuat dokumen, mari kita lihat cara membaca fail docx yang ada, dan mencetak kandungannya:

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 fail helloWorld.docx yang ada , menggunakan kaedah load () .

Selepas itu, kami telah menggunakan ungkapan XPath ( // w: t ) untuk mendapatkan semua nod teks dari bahagian dokumen utama.

Kaedah getJAXBNodesViaXPath () mengembalikan senarai objek JAXBElement .

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

Perhatikan bahawa kami selalu dapat mengekstrak fail docx kami untuk mendapatkan pemahaman yang lebih baik mengenai struktur XML, yang membantu dalam menganalisis masalah, dan memberikan wawasan yang lebih baik mengenai cara mengatasinya.

5. Kesimpulan

Dalam artikel ini, kami telah mengetahui bagaimana docx4j mempermudah melakukan operasi yang kompleks pada dokumen MSWord, seperti membuat perenggan, jadual, bahagian dokumen, dan menambahkan gambar.

Coretan kod boleh didapati, seperti biasa, di GitHub.