ColdFusion & Java (docx4j library)



我需要做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操作的选择并不多。

好吧。似乎我一切都在工作。我只需要弄清楚如何进行查找/替换,以及我想在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 中的结构实际上是实用的。向量,而哈希图是有用的。哈希图。我在 Docx4j 中看到的所有演示在占位符中查找/替换的示例都使用以下内容:

HashMap<String, String> mappings = new HashMap<String, String>();
mappings.put("colour", "green");
mappings.put("icecream", "chocolate");

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

(不是真正的新答案,但它的代码太多了,无法注释..)

以下是 docx4j 变量替换的完整代码.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>

相关内容

  • 没有找到相关文章

最新更新