我正在使用以下代码使用docx4j
生成具有HTML内容的Word文档,并能够成功生成文档。
我的要求是编写带有一些自定义属性的内容,因此在用户进行修改后,很容易读取同一文档。
String finalData = "<h1> Heading One </h1>".aapend("<h2> Heading two </h2>");
String str1 = new StringBuffer()
.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;
charset=UTF-8\" /><style type='text/css'>
* { font-family: 'Arial Unicode MS'; } </style></head>")
.append(finalData).append("</html>").toString();
str1 = fixWhitespaceIssue(str1);
str1 = cleanHTML(str1);
System.out.println(str1);
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
XHTMLImporter.setRunFormatting(FormattingOption.CLASS_PLUS_OTHER);
NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
ndp.unmarshalDefaultNumbering();
wordMLPackage.getMainDocumentPart().getContent().addAll(XHTMLImporter.convert(str1, null));
File exportFile = new File("test.docx");
wordMLPackage.save(exportFile);
例如
<h1> Heading One </h1> // i'll bind custom property for first element as c_property1
<h2> Heading two </h2> // i'll use custom property for second element as c_property2
生成的文档可以由某些用户检查,在我的代码中使用相同的更新文档之后,他将进行一些更改,因此该代码必须能够使用自定义属性读取文档。
如果我想从文档中提取更新的值,那么我只想提供自定义属性,那么它应该返回其关联的值。
对于c_property1
代码的应该返回Heading One
或更新值,例如Updated Heading One
c_property2
代码的应该返回Heading two
或更新值,例如Updated Heading two
任何人都可以为我提供一些解决方案或替代方法,以帮助我完成它。感谢您的帮助。
答案 0 :(得分:0)
TLDR :您可以使用docx4j的FieldUpdater从您的自定义属性更新文档表面,但是您需要编写一些代码以将合适的DOCPROPERTY字段放入docx中(例如,将XHTML转换为docx之后。
内容控件对自定义属性没有帮助
要在Word(最新版本)中设置docx,请首先启用“开发人员”菜单(如果尚未启用)。
单击“ XML映射窗格”。出现的任务窗格使您可以从“核心”或“扩展”属性中进行选择。
右键单击感兴趣的属性; “插入内容控件”>“纯文本”。
您将在docx中看到它。
尽管XML Mapping Pane不包含“自定义”属性,所以您不能轻易地将它们添加到文档中。
此外,您正在从XHTML创建docx,所以我想您需要的是一种编程解决方案,用于将某些特定标签转换为绑定到自定义属性部分的内容控件。
可以使用docx4j Helper Word插件或docx4j Web应用程序从示例docx生成用于创建内容控件的Java代码。
您必须通过ItemID将内容控件绑定到CutomXML部件。某些自定义xml部分是“众所周知的”:https://msdn.microsoft.com/en-us/library/ff531265(v=office.12).aspx
当我绑定核心属性时,它使用w:storeItemID =“ {6C3C8BC8-F283-45AE-878A-BAB7291924A1}”
但是没有自定义属性的storeItemID吗?
您可以尝试将itemProps部件添加到自定义属性部件中,但是我怀疑它会起作用!
因此,如果您真的想通过内容控件方法使用自定义属性,则需要对docx4j进行一些修改以绑定这些属性。
DOCPROPERTY字段进行救援
但是有一种旧方法可用:您可以使用指向自定义属性的DOCPROPERTY字段。
docx4j的DocPropertyResolver知道如何处理这些问题。请参阅FieldUpdater:https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/model/fields/FieldUpdater.java。