SRIDHAR B
SRIDHAR B

Reputation: 1

DOCX4J - docx template - pdf converter

I want to convert a DOCX template to PDF in Java using Maven. The template contains if conditions, each loops, and dynamically rendered tables based on the data. I need to fill this template with JSON data and then convert it to a PDF. How can I achieve this?

I have tried using the DOCx4J library but have encountered some issues. Specifically, I am struggling with processing the conditional statements and loops in the template. Additionally, the dynamic rendering of tables based on JSON data is not working as expected.

Here is a summary of what I have done so far:

  1. Loaded the DOCX template using DOCx4J.

  2. Attempted to fill the template with JSON data.

  3. Tried to handle the conditional statements and loops within the template.

Could anyone provide guidance or examples on how to properly achieve this? Any help with handling conditional statements, loops, and dynamic table rendering in DOCX templates would be greatly appreciated.

pom.xml

<dependencies>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j</artifactId>
        <version>11.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-export-fo</artifactId>
        <version>11.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.6</version>
    </dependency>
</dependencies>

Java Code

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.*;

import java.io.File;
import java.util.List;
import java.util.Map;

public class DocxToPdfConverter {

    public static void main(String[] args) throws Exception {
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("documentTemplate_docx4j.docx"));
        replacePlaceholders(wordMLPackage, data);
        wordMLPackage.save(new File("filled_template.docx"));
    }

    // Method to replace placeholders in the DOCX template
    private static void replacePlaceholders(WordprocessingMLPackage wordMLPackage, Map<String, String> data) {
        // Get the content of the DOCX document
        List<Object> paragraphs = wordMLPackage.getMainDocumentPart().getContent();

        for (Object obj : paragraphs) {
            if (obj instanceof P) { // If the object is a paragraph
                P paragraph = (P) obj;
                List<Object> runs = paragraph.getContent();
                for (Object runObj : runs) {
                    if (runObj instanceof R) { // If the object is a run (text chunk)
                        R run = (R) runObj;
                        List<Object> texts = run.getContent();
                        for (Object textObj : texts) {
                            if (textObj instanceof Text) { // Use org.docx4j.wml.Text instead of T
                                Text text = (Text) textObj;
                                String textValue = text.getValue();

                                // Replace placeholders with data
                                for (Map.Entry<String, String> entry : data.entrySet()) {
                                    textValue = textValue.replace("<<" + entry.getKey() + ">>", entry.getValue());
                                }

                                // Set the updated value
                                text.setValue(textValue);
                            }
                        }
                    }
                }
            }
        }
    }
}

Upvotes: 0

Views: 65

Answers (1)

JasonPlutext
JasonPlutext

Reputation: 15878

Thow away that code and try either OpenDoPE or docx-stamper.

OpenDoPE is part of docx4j and builds on Microsoft's content-control data binding to support loops/repeats and conditions, amongst other things. It takes data in XML format, so you'll need to convert your JSON to XML.

https://github.com/thombergs/docx-stamper is a templating engine which uses docx4j under the hood.

Upvotes: 0

Related Questions