我正在尝试解析包含内容控件字段的docx文件(这些字段是使用窗口添加的,如下图所示,我的是另一种语言)
我正在使用APACHE POI库。我在这个问题上找到了如何做的方法。我使用了相同的代码:
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import java.util.List;
import java.util.ArrayList;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.apache.xmlbeans.XmlCursor;
import javax.xml.namespace.QName;
public class ReadWordForm {
private static List<XWPFSDT> extractSDTsFromBody(XWPFDocument document) {
XWPFSDT sdt;
XmlCursor xmlcursor = document.getDocument().getBody().newCursor();
QName qnameSdt = new QName("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "sdt", "w");
List<XWPFSDT> allsdts = new ArrayList<XWPFSDT>();
while (xmlcursor.hasNextToken()) {
XmlCursor.TokenType tokentype = xmlcursor.toNextToken();
if (tokentype.isStart()) {
if (qnameSdt.equals(xmlcursor.getName())) {
if (xmlcursor.getObject() instanceof CTSdtRun) {
sdt = new XWPFSDT((CTSdtRun)xmlcursor.getObject(), document);
//System.out.println("block: " + sdt);
allsdts.add(sdt);
} else if (xmlcursor.getObject() instanceof CTSdtBlock) {
sdt = new XWPFSDT((CTSdtBlock)xmlcursor.getObject(), document);
//System.out.println("inline: " + sdt);
allsdts.add(sdt);
}
}
}
}
return allsdts;
}
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("WordDataCollectingForm.docx"));
List<XWPFSDT> allsdts = extractSDTsFromBody(document);
for (XWPFSDT sdt : allsdts) {
//System.out.println(sdt);
String title = sdt.getTitle();
String content = sdt.getContent().getText();
if (!(title == null) && !(title.isEmpty())) {
System.out.println(title + ": " + content);
} else {
System.out.println("====sdt without title====");
}
}
document.close();
}
}
问题在于,这段代码无法在我的docx文件中看到这些字段,直到我在LibreOffice中打开并重新保存它。因此,如果文件来自Windows并被放入此代码中,则它不会查看这些内容控件字段。但是,如果我在LibreOffice中重新保存文件(使用相同的格式),它开始查看这些字段,尽管它会丢失一些数据(某些字段的标题和标记)。有人能告诉我可能的原因是什么,我该如何修复才能看到这些字段?或者也许有更简单的方法可以使用docx4j吗?不幸的是,关于如何在互联网上使用这两个库进行操作的信息很少,至少我没有找到。示例文件位于谷歌磁盘上。第一个文件无法正常工作,第二个文件可以正常工作(在打开Libre并将字段更改为其中之一后)。