Java使用aspose.word完美实现docx转doc,同时打开转后的doc文件也不会报错,处理效率高于Docx4j
一、处理逻辑
- 1、使用aspose先将docx字节数组转为html数组,
- 2、将html数组转为所需要的格式的文档(doc或docx)
二、实现代码
代码实现
/**
* docx字节数组转doc字节数组
* @Title: docxToDoc
* @Description: docx字节数组转doc字节数组
* @param content
* @return: byte
*/
private static byte[] docxToDoc(byte[] content) {
// docx字节数组转成html字符串
String htmlStr = byteToHtmlStr(content);
// html字节数组转doc字节数组
return AsposeWordUtils.htmlToWord(htmlStr.getBytes(StandardCharsets.UTF_8), SaveFormat.DOC);
}
/**
* word字节数组转为html字符串
* @Title: byteToHtmlStr
* @Description: word字节数组转为html字符串
* @param content
* @return: String
*/
private static String byteToHtmlStr(byte[] content) {
String result = "";
try {
byte[] htmlContent = AsposeWordUtils.wordToHtml(content);
InputStream is = new ByteArrayInputStream(htmlContent);
InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
String line;
StringBuilder html = new StringBuilder();
while ((line = reader.readLine()) != null) {
html.append(line);
}
reader.close();
result = String.valueOf(html);
} catch (IOException e) {
logger.error("html转字符串异常", e);
}
return result;
}
AsposeWordUtils工具类
/**
* html字节数组转word字节数组
* @Title: htmlToWordTest
* @Description: html字节数组转word字节数组
* @param content html字节数组
* @param toType 值为SaveFormat.DOCX或SavaFormat.Doc对应的值
* @return: byte
*/
public static byte[] htmlToWord(byte[] content, Integer toType) {
byte[] result = new byte[1];
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream is = new ByteArrayInputStream(content);
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
String line;
StringBuilder html = new StringBuilder();
while ((line = reader.readLine()) != null) {
html.append(line);
}
reader.close();
builder.insertHtml(String.valueOf(html));
doc.save(os, toType);
log.info("html转word成功!");
result = os.toByteArray();
} catch (Exception e) {
log.error("html转word失败!", e);
}
return result;
}
/**
* word字节数组转html字节数组
* @Title: wordToHtml
* @Description: word字节数组转html字节数组
* @param content doc、docx字节数组
* @return: byte
*/
public static byte[] wordToHtml(byte[] content) {
byte[] result = new byte[1] ;
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream sbs = new ByteArrayInputStream(content);
Document document = new Document(sbs);
HtmlSaveOptions options = new HtmlSaveOptions(SaveFormat.HTML);
options.setExportImagesAsBase64(true);
document.save(os, options);
log.info("html转word成功!");
result = os.toByteArray();
} catch (Exception e) {
log.error("word转html失败!", e);
}
return result;
}