Java 比较可靠的docx文件流转doc流的方法。
网上好多都是doc转docx,之前使用aspose.word 实现docx转doc后,如果文档内容比较复杂时,转换出的doc打开很大概率会报错,后转用docx4j完美实现了docx转doc且打开不会报错。
1、相关代码
String filePath = "C:\\Users\\desktop\\docx文件的.docx";
byte[] content = new byte[0];
try {
content = Files.readAllBytes(Paths.get(filePath));
} catch (IOException e) {
e.printStackTrace();
}
InputStream inputStream = new ByteArrayInputStream(content);
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(inputStream);
// 获取项目路径
String path = System.getProperty("user.dir");
// 先将docx转换成xml,然后再转换成doc,处理过程中依次生成临时xml和doc文件,
// 处理完后xml文件自动删除, 可读取临时doc文件字节流存库后将临时doc文件删除
File outFileXml = new File(path , "tempFileOne.xml");
Docx4J.save(wordMLPackage, outFileXml, Docx4J.FLAG_SAVE_FLAT_XML);
File outFileDoc = new File(path + "tempFileTwo.doc");
outFileXml.renameTo(outFileDoc);
FileInputStream fileInputStream = new FileInputStream(outFileDoc);
// 如果只需获取文件流,读取后,删除临时doc, 直接return
byte[] resultOut = FileCopyUtils.copyToByteArray(fileInputStream);
// 如果只需要文件的字节数组,可删除临时doc文件,这样就不会有转换的痕迹
outFileDoc.delete();
return resultOut;
// 2、也可以输出到指定文件
FileOutputStream fos = new FileOutputStream("C:\\Users\\desktop\\导出的doc文件66666.doc");
byte[] buffer = new byte[1024];
int r = 0;
while ((r = fileInputStream.read(buffer)) != -1) {
fos.write(buffer, 0, r);
}
fileInputStream .close();
2、使用的依赖
<dependency>
<!--支持插入图片-->
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>3.3.1</version>
</dependency>