Java判断word文件版本

Java判断word文件版本

业务中有调用一个office转换服务,转换服务是基于word转换的,但是有时候出现文件后缀名不匹配的情况时,word无法识别,就比如,这个文件实际上是word 2003文件,但是后缀名是docx,word就会打不开,从而转换失败

image-20230301101810497

解决办法

转换之前判断文件头
/**
* 判断版本
*/
public int checkDocx(String filePath) {
    //获取文件头判断版本
    try (FileInputStream fileInputStream = new FileInputStream(filePath)) {
        byte[] b = new byte[4];
        fileInputStream.read(b, 0, b.length);
        //Hutool的hexutil
        String value = HexUtil.encodeHexStr(b);
        logger.info("检测word文件头:" + value);
        //2003版本的word
        if ("d0cf11e0".equals(value)) {
            return 2003;
        } else {
            return 2007;
        }
    } catch (Exception e) {
        return -1;
    }
}
完事之后重命名一下文件再丢到转换服务就好了
if (i == 2003 && "docx".equals(FileUtil.getExtensionName(file))) {
    //重命名文件为doc
    File file1 = new File(file);
    File file2 = new File(cn.hutool.core.io.FileUtil.getParent(file1, 1) + File.separator + FileUtil.getFileNameNoEx(file1.getName()) + ".doc");
    File targetFile = cn.hutool.core.io.FileUtil.copy(file1, file2, true);
}
Fileutil
/**
 * 获取文件扩展名,不带 .
 */
public static String getExtensionName(String filename) {
    if ((filename != null) && (filename.length() > 0)) {
        int dot = filename.lastIndexOf('.');
        if ((dot > -1) && (dot < (filename.length() - 1))) {
            return filename.substring(dot + 1);
        }
    }
    return filename;
}
/**
     * Java文件操作 获取不带扩展名的文件名
     */
public static String getFileNameNoEx(String filename) {
    if ((filename != null) && (filename.length() > 0)) {
        int dot = filename.lastIndexOf('.');
        if ((dot > -1) && (dot < (filename.length()))) {
            return filename.substring(0, dot);
        }
    }
    return filename;
}
评论区
头像