从 Docx 中删除内容控件
Removing content controls from Docx
我想用实际文本替换 docx
中的内容控件(仅限下拉列表),然后在文档上应用一些逻辑以使用 apache-poi
提取表格。如果我不这样做,则不会提取具有内容控制的单元格。
如果我手动将 docx
保存为 Word 97-2003(*.doc
) 然后它会要求删除所有内容控件并将其替换为选中的文本所以我打算将 docx
转换为doc
摆脱内容控制。
到目前为止我已经探索过:
- 我遇到了
Aspose.words
图书馆,但它是收费的,可以做一个
仅需 3 行代码即可完成工作(已使用试用版进行测试)。
- 我尝试了
POI
本身,但不明白具体怎么做。我尝试了以下代码:
XWPFDocument doc = new XWPFDocument(new FileInputStream("<DOCX_FILE_PATH>"));
FileOutputStream fos = new FileOutputStream("<PATH_FOR_DOC_FILE>");
doc.write(fos);
fos.close();
它确实创建了 doc 文件,但没有像 aspose
那样删除内容控件。
- 我现在正在克制尝试
JODConverter
因为它依赖于 LibreOffice
或 OpenOffice
- 我们在服务器上没有它并且没有安装新的权限软件。
- 我查看了
Docx4J
,但在检查了它的 API 后看起来它无法执行。
处理这种情况的最佳方法是什么,有什么方法可以直接替换内容控件吗?谢谢!
docx4j 可以删除内容控件
String input_DOCX = System.getProperty("user.dir") + "/some.docx";
// resulting docx
String OUTPUT_DOCX = System.getProperty("user.dir") + "/OUT_ContentControlRemove.docx";
// Load input_template.docx
WordprocessingMLPackage wordMLPackage = Docx4J.load(new File(input_DOCX));
// There is no xml stream
FileInputStream xmlStream = null;
Docx4J.bind(wordMLPackage, xmlStream, Docx4J.FLAG_BIND_REMOVE_SDT);
//Save the document
Docx4J.save(wordMLPackage, new File(OUTPUT_DOCX), Docx4J.FLAG_NONE);
我想用实际文本替换 docx
中的内容控件(仅限下拉列表),然后在文档上应用一些逻辑以使用 apache-poi
提取表格。如果我不这样做,则不会提取具有内容控制的单元格。
如果我手动将 docx
保存为 Word 97-2003(*.doc
) 然后它会要求删除所有内容控件并将其替换为选中的文本所以我打算将 docx
转换为doc
摆脱内容控制。
到目前为止我已经探索过:
- 我遇到了
Aspose.words
图书馆,但它是收费的,可以做一个 仅需 3 行代码即可完成工作(已使用试用版进行测试)。 - 我尝试了
POI
本身,但不明白具体怎么做。我尝试了以下代码:
XWPFDocument doc = new XWPFDocument(new FileInputStream("<DOCX_FILE_PATH>"));
FileOutputStream fos = new FileOutputStream("<PATH_FOR_DOC_FILE>");
doc.write(fos);
fos.close();
它确实创建了 doc 文件,但没有像 aspose
那样删除内容控件。
- 我现在正在克制尝试
JODConverter
因为它依赖于LibreOffice
或OpenOffice
- 我们在服务器上没有它并且没有安装新的权限软件。 - 我查看了
Docx4J
,但在检查了它的 API 后看起来它无法执行。
处理这种情况的最佳方法是什么,有什么方法可以直接替换内容控件吗?谢谢!
docx4j 可以删除内容控件
String input_DOCX = System.getProperty("user.dir") + "/some.docx";
// resulting docx
String OUTPUT_DOCX = System.getProperty("user.dir") + "/OUT_ContentControlRemove.docx";
// Load input_template.docx
WordprocessingMLPackage wordMLPackage = Docx4J.load(new File(input_DOCX));
// There is no xml stream
FileInputStream xmlStream = null;
Docx4J.bind(wordMLPackage, xmlStream, Docx4J.FLAG_BIND_REMOVE_SDT);
//Save the document
Docx4J.save(wordMLPackage, new File(OUTPUT_DOCX), Docx4J.FLAG_NONE);