Wednesday, January 10, 2024

Sample Word to PDF convert with docx4j

Below is sample application to convert Word file to Pdf using dox4j

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.poc.convert</groupId>
<artifactId>convert</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>convert</name>
<description>Poc Project to convert word to pdf</description>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<!-- dox4j -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-Internal</artifactId>
<version>8.3.9</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>8.3.9</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-MOXy</artifactId>
<version>8.3.9</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>8.3.9</version>
</dependency>

<!--- ****** -->
<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>

<!-- java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException -->
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>

<!-- java.lang.NoClassDefFoundError: javax/activation/DataSource -->
<!-- Caused by: java.lang.ClassNotFoundException: javax.activation.DataSource-->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

<!-- java.lang.NoClassDefFoundError: javax/mail/internet/MimeMultipart-->
<!-- Caused by: java.lang.ClassNotFoundException: javax.mail.internet.MimeMultipart-->

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>

<!-- Documents4jLocalServices-->
<!-- https://mvnrepository.com/artifact/org.docx4j/docx4j-documents4j-local -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-documents4j-local</artifactId>
<version>11.4.9</version>
</dependency>

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>


<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
</dependency>



<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>


Above POM all dependencies 

Below Convert Class contains the Logic

--------------------------------------------------------------------------------------------------------


package com.poc.convert.convert;


import com.documents4j.api.DocumentType;

import org.docx4j.Docx4J;

import org.docx4j.documents4j.local.Documents4jLocalServices;

import org.docx4j.openpackaging.exceptions.Docx4JException;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


import java.io.*;


public class Convert {

    private static final Logger LOGGER = LoggerFactory.getLogger(Convert.class);


    public static Documents4jLocalServices exporter = new Documents4jLocalServices();


    private static volatile Convert instance;


    private Convert() {

    }


    public static Convert getInstance() {

        if (instance == null) {

            synchronized (Convert.class) {

                if (instance == null) {

                    instance = new Convert();

                }

            }

        }

        return instance;

    }


    /**

     * Convert word .docx format file to pdf file.

     *

     * @param inputWordFile Input word .docx file.

     * @param outputPdfFile Converted .pdf file.

     * @throws IOException     Exception when reading input word ,docx file or writing to .pdf output file

     * @throws Docx4JException Excpetion occcuring during converting word file to Pdf file.

     */

    public void convertWordDocxtoPdf(String inputWordFile, String outputPdfFile) throws IOException, Docx4JException {

        LOGGER.info("Start Converting Word {} file to {}", inputWordFile, outputPdfFile);

        InputStream templateInputStream = new FileInputStream(inputWordFile);

        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(templateInputStream);

        MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();


        FileOutputStream os = new FileOutputStream(outputPdfFile);

        Docx4J.toPDF(wordMLPackage, os);

        os.flush();

        os.close();

        LOGGER.info("Successfully converted {} to {}", inputWordFile, outputPdfFile);

    }


    public void convertWordDocxtoPdfWithLocalServer(String inputWordFile, String outputPdfFile) throws IOException, Docx4JException {

        LOGGER.info("Start Converting with local server Word {} file to {}", inputWordFile, outputPdfFile);

        try (FileOutputStream fos = new FileOutputStream(outputPdfFile)) {

            if (inputWordFile.toLowerCase().endsWith(".docx")) {

                exporter.export(new File(inputWordFile), fos, DocumentType.MS_WORD);

            }

            LOGGER.info("Start Flushing ***********");

            fos.flush();

            fos.close();

            LOGGER.info("End Flushing ***********");

//            System.exit(0);

        }

        LOGGER.info("Successfully converted with local server {} to {}", inputWordFile, outputPdfFile);

    }


    public void convertWordDocxtoPdfWithLibre(String inputWordFile, String outputPdfFile) throws IOException {

        LOGGER.info("Start Converting Word with Libre {} file to {}", inputWordFile, outputPdfFile);


        String command = "libreoffice --headless --convert-to pdf " + inputWordFile + " --outdir " + outputPdfFile;

        Runtime.getRuntime().exec(command);


        LOGGER.info("Successfully converted with Libre {} to {}", inputWordFile, outputPdfFile);

    }

}

----------------------------------------------------------------------------------------------------------------


package com.poc.convert.convert;

import com.documents4j.api.DocumentType;
import org.docx4j.Docx4J;
import org.docx4j.documents4j.local.Documents4jLocalServices;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

public class Convert {
private static final Logger LOGGER = LoggerFactory.getLogger(Convert.class);

public static Documents4jLocalServices exporter = new Documents4jLocalServices();

private static volatile Convert instance;

private Convert() {
}

public static Convert getInstance() {
if (instance == null) {
synchronized (Convert.class) {
if (instance == null) {
instance = new Convert();
}
}
}
return instance;
}

/**
* Convert word .docx format file to pdf file.
*
* @param inputWordFile Input word .docx file.
* @param outputPdfFile Converted .pdf file.
* @throws IOException Exception when reading input word ,docx file or writing to .pdf output file
* @throws Docx4JException Excpetion occcuring during converting word file to Pdf file.
*/
public void convertWordDocxtoPdf(String inputWordFile, String outputPdfFile) throws IOException, Docx4JException {
LOGGER.info("Start Converting Word {} file to {}", inputWordFile, outputPdfFile);
InputStream templateInputStream = new FileInputStream(inputWordFile);
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(templateInputStream);
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

FileOutputStream os = new FileOutputStream(outputPdfFile);
Docx4J.toPDF(wordMLPackage, os);
os.flush();
os.close();
LOGGER.info("Successfully converted {} to {}", inputWordFile, outputPdfFile);
}

public void convertWordDocxtoPdfWithLocalServer(String inputWordFile, String outputPdfFile) throws IOException, Docx4JException {
LOGGER.info("Start Converting with local server Word {} file to {}", inputWordFile, outputPdfFile);
try (FileOutputStream fos = new FileOutputStream(outputPdfFile)) {
if (inputWordFile.toLowerCase().endsWith(".docx")) {
exporter.export(new File(inputWordFile), fos, DocumentType.MS_WORD);
}
LOGGER.info("Start Flushing ***********");
fos.flush();
fos.close();
LOGGER.info("End Flushing ***********");
// System.exit(0);
}
LOGGER.info("Successfully converted with local server {} to {}", inputWordFile, outputPdfFile);
}

public void convertWordDocxtoPdfWithLibre(String inputWordFile, String outputPdfFile) throws IOException {
LOGGER.info("Start Converting Word with Libre {} file to {}", inputWordFile, outputPdfFile);

String command = "libreoffice --headless --convert-to pdf " + inputWordFile + " --outdir " + outputPdfFile;
Runtime.getRuntime().exec(command);

LOGGER.info("Successfully converted with Libre {} to {}", inputWordFile, outputPdfFile);
}
}


3. This is the default Springboot main classs
This class simply call the logic of the Convert class where takes InputFilePath and OutputFilePath as arguments

package com.poc.convert.convert;

import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.io.IOException;

@SpringBootApplication
public class ConvertApplication {

private static final Logger LOGGER = LoggerFactory.getLogger(ConvertApplication.class);

public static void main(String[] args) {
SpringApplication.run(ConvertApplication.class, args);

String inputWordFile = "";
String outputPdfFile = "";

if (args[0].length() > 0) {
inputWordFile = args[0];
} else {
LOGGER.info("Please define Input file");
}

if (args[1].length() > 0) {
outputPdfFile = args[1];
} else {
LOGGER.info("Please define Output file");
}


try {
Convert.getInstance().convertWordDocxtoPdf(inputWordFile, outputPdfFile);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Docx4JException e) {
throw new RuntimeException(e);
}

}

}


With this you can execute Jar file with below command.
{space} --> empty space character, separate parts of the commands

1. command to execute jar
java {space} -jar {space} {name of the jar file} {space} {input file path} {output file path}

java -jar convert-0.0.1-SNAPSHOT.jar D:/sample.docx D:/sample.pdf






No comments:

Post a Comment