DOCX4J - docx 模板 - pdf 转换器

问题描述 投票:0回答:1

我想使用 Maven 将 DOCX 模板转换为 Java 中的 PDF。该模板包含 if 条件、each 循环以及基于数据动态呈现的表。我需要用 JSON 数据填充此模板,然后将其转换为 PDF。我怎样才能实现这个目标?

我尝试使用 DOCx4J 库,但遇到了一些问题。具体来说,我正在努力处理模板中的条件语句和循环。此外,基于 JSON 数据的表格动态渲染无法按预期工作。

以下是我迄今为止所做工作的总结:

  1. 使用 DOCx4J 加载 DOCX 模板。

  2. 尝试使用 JSON 数据填充模板。

  3. 尝试处理模板内的条件语句和循环。

任何人都可以提供有关如何正确实现这一目标的指导或示例吗?任何有关处理 DOCX 模板中的条件语句、循环和动态表渲染的帮助将不胜感激。

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代码

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);
                            }
                        }
                    }
                }
            }
        }
    }
}
java maven templates docx4j
1个回答
0
投票

扔掉该代码并尝试 OpenDoPE 或 docx-stamper。

OpenDoPE 是 docx4j 的一部分,基于 Microsoft 的内容控制数据绑定构建,以支持循环/重复和条件等。 它接受 XML 格式的数据,因此您需要将 JSON 转换为 XML。

https://github.com/thombergs/docx-stamper是一个在底层使用docx4j的模板引擎。

© www.soinside.com 2019 - 2024. All rights reserved.