2

我需要进行 docx 操作(查找/替换占位符和选中/取消选中复选框)。由于 ColdFusion 10 与 Java 很好地集成,我决定尝试使用 Java 库 docx4j,它基本上模仿了 OpenXML SDK(.net 平台)。

我在自定义文件夹中有 docx4j JAR,我通过 JavaSettings 在我的 Application.cfc 中设置了它(CF10 中的新功能,我用其他 JARS 进行了尝试,它可以工作):

<cfcomponent output="false">

    <cfset this.javaSettings =
        {LoadPaths = ["/myJava/lib"], loadColdFusionClassPath = true, reloadOnChange= true, 
        watchInterval = 100, watchExtensions = "jar,class,xml"} />

</cfcomponent>

现在,我正在尝试使用此示例:https ://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/samples/VariableReplace.java

但是尝试调用 WordprocessingMLPackage 失败,函数CreateObject()说特定类不存在:

<cfset docObj = createObject("java","org.docx4j.openpackaging.packages.WordprocessingMLPackage") />

有任何想法吗?我不是一个真正的 Java 人,但是对于 docx 操作没有太多选择。

4

3 回答 3

1

好吧。好像我让一切正常。我只需要弄清楚如何进行查找/替换,以及我想在 docx 文档中做的所有其他事情。到目前为止,这是我的代码,向你们展示它看起来正在工作(如果您使用的是 CF10,请确保您的 Application.cfc 看起来像原始帖子):

<cfscript>

    docPackageObj = createObject("java","org.docx4j.openpackaging.packages.WordprocessingMLPackage").init();
    docObj = createObject("java","org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart").init();
    xmlUtilObj = createObject("java","org.docx4j.XmlUtils").init();
    wmlDocObj = createObject("java","org.docx4j.wml.Document").init();
    saveToZipFile = createObject("java","org.docx4j.openpackaging.io.SaveToZipFile").init(docPackageObj);

    strFilePath = getDirectoryFromPath(getCurrentTemplatePath()) & "testDoc.docx";

    wordMLPackage = 
        docPackageObj.load(createObject("java","java.io.File").init(javaCast("string",strFilePath)));

    documentPart = wordMLPackage.getMainDocumentPart();

    // unmarshallFromTemplate requires string input     
    strXml = xmlUtilObj.marshaltoString(documentPart.getJaxbElement(),true);

    writeDump(var="#strXml#");

</cfscript>

现在,有人知道如何将 ColdFusion 中的结构转换为哈希图(或一般的集合)吗?我认为CF中的结构实际上是util.Vector,而hashmaps是util.HashMap。我在 Docx4j 中看到的所有演示在占位符中查找/替换的示例都使用了这个:

HashMap<String, String> mappings = new HashMap<String, String>();
mappings.put("colour", "green");
mappings.put("icecream", "chocolate");
于 2012-05-31T23:13:44.207 回答
0

您是否尝试过设置 loadColdFusionClassPath = false 而不是 true?可能与带有 CF 的某些 JAR 存在冲突。

于 2012-05-31T11:55:44.560 回答
0

(并不是一个真正的新答案,但评论代码太多了..)

这是 docx4j VariableReplace.java示例的完整代码

<cfscript>
    saveToDisk = true;
    inputFilePath = ExpandPath("./docx4j/sample-docs/word/unmarshallFromTemplateExample.docx");
    outputFilePath = ExpandPath("./OUT_VariableReplace.docx");

    inputFile = createObject("java", "java.io.File").init(inputFilePath);
    wordMLPackage = createObject("java","org.docx4j.openpackaging.packages.WordprocessingMLPackage").load(inputFile);
    documentPart = wordMLPackage.getMainDocumentPart();

    XmlUtils = createObject("java","org.docx4j.XmlUtils");
    xmlString  = XmlUtils.marshaltoString(documentPart.getJaxbElement(),true);

    mappings = createObject("java", "java.util.HashMap").init();
    mappings["colour"] = "green";
    mappings["icecream"] =  "chocolate";
    obj = XmlUtils.unmarshallFromTemplate(xmlString , mappings);
    documentPart.setJaxbElement(obj);

    if (saveToDisk) {
        saveToZipFile = createObject("java","org.docx4j.openpackaging.io.SaveToZipFile").init(wordMLPackage);
        SaveToZipFile.save( outputFilePath );
    } 
    else {
        WriteDump(XmlUtils.marshaltoString(documentPart.getJaxbElement(), true, true));
    }
</cfscript>
于 2012-06-01T05:51:19.760 回答