前言
因为工作变动和生活环境的改变,已经很久没有更新了。最近逐渐开始适应,准备再次捡起技术整理和发文。经济环境难以言表,肉眼可见的压力越来越大。作为一个普通的打工人,又离开了北京的互联网环境,只能说为自己的选择负责,无论是结果还是后果。
废话少说。接到一个需求,需要将一批 word2003 格式的.doc 文档转换为.docx 格式。本来想着应该是很简单的事情,结果没想到通过通义千问 和 百度搜索到的代码质量都一言难尽。要么 poi 的依赖包早就没有了相关类,要么就是连代码本身就有错误。 无奈只好花了几个小时的时间筛选,选择了 aspose.words 来做个快速实现。
一 aspose.words
aspose.words 为用户提供了广泛的功能。用户可以执行大量与文档相关的任务——从简单地将文档从一种受支持的格式转换为另一种格式并在转换过程中修改这些文档到业务任务,例如创建结构化和视觉上吸引人的文档或自动报告。
因为开发语言用的是 Java,所以我们选择使用Aspose.Words for Java,除此之外,还有 for .net 的 API,相关参考资料可查阅:https://blog.csdn.net/m0_67129275/article/details/131324874 等文档。 Aspose.Words for Java 是一个高级的 Java 字处理 API,它允许您在 Java 应用程序中直接执行一系列文档处理任务。Aspose.Words for Java API 支持处理 Word (DOC、DOCX、OOXML、RTF)、HTML、OpenDocument、PDF、EPUB、XPS、SWF 和所有图像格式。使用 Aspose.Words,您可以无需使用 Microsoft Word® 即可生成、修改和转换文档。
二 doc 批量转 docx 代码示例
2.1 maven 依赖引入
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>23.1</version>
</dependency>
复制代码
目前最新版本已经是 24.8,可根据需要选择。
2.2 格式转换关键代码
需要先引入依赖的类:
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
复制代码
实现方式:
Document document = new Document(sourceFilePath + fileName);
document.save(targetFilePath + name + ".docx", SaveFormat.DOCX);
复制代码
可见非常简单,使用 Document 类新建实例,参数是 doc 文件的路径,然后通过 save 方法直接转存为.docx 即可,只需两行代码即可完成。和我们手工操作打开 word 文档,然后选择另存为-->选择 docx 格式一样,非常高效。
如果要批量转换,只需要遍历 doc 文档所在目录,依次调用上述方法执行就可以了。由于很简单所以直接附代码:
package cn.rails.chewu.docx.tool;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import java.io.File;
public class BatchTransformDocxTool {
/**
* 单篇doc转换为docx文件,输入是文件所在目录
* @param sourceFilePath 源文件位置
* @param fileName 文件名, xxx.doc
* @param targetFilePath 转换结果存储位置
*/
public static void transformDoc2Docx(String sourceFilePath, String fileName, String targetFilePath) throws Exception {
// 提取文件名
String name = fileName.substring(0, fileName.length()-4);
Document document = new Document(sourceFilePath + fileName);
document.save(targetFilePath + name + ".docx", SaveFormat.DOCX);
}
/**
* 批量转换,输入是目录
* @param sourceFilePath
* @param targetFilePath
*/
public static void batchTransDoc2Docx(String sourceFilePath, String targetFilePath){
}
public static void main(String[] args) throws Exception {
String docFilePath = "/Users/xxx/source/";
File sourceDir = new File(docFilePath);
if(!sourceDir.exists()){
System.out.println("目录不存在");
}
if(!sourceDir.isDirectory()){
System.out.println("不是目录");
}
String tarDocxFilePath = "/Users/xxx/target/";
for(String fileName : sourceDir.list()){
System.out.println(fileName);
transformDoc2Docx(docFilePath, fileName, tarDocxFilePath);
}
}
}
复制代码
2.3 支持的其他格式
除了转 docx,也支持 PDF、HTML 等格式,具体的保存格式在 com.aspose.words.SaveFormat 类中有相关定义。
package com.aspose.words;
public final class SaveFormat {
public static final int UNKNOWN = 0;
public static final int DOC = 10;
public static final int DOT = 11;
public static final int DOCX = 20;
public static final int DOCM = 21;
public static final int DOTX = 22;
public static final int DOTM = 23;
public static final int FLAT_OPC = 24;
public static final int FLAT_OPC_MACRO_ENABLED = 25;
public static final int FLAT_OPC_TEMPLATE = 26;
public static final int FLAT_OPC_TEMPLATE_MACRO_ENABLED = 27;
public static final int RTF = 30;
public static final int WORD_ML = 31;
public static final int PDF = 40;
public static final int XPS = 41;
public static final int XAML_FIXED = 42;
public static final int SVG = 44;
public static final int HTML_FIXED = 45;
public static final int OPEN_XPS = 46;
public static final int PS = 47;
public static final int PCL = 48;
public static final int HTML = 50;
public static final int MHTML = 51;
public static final int EPUB = 52;
public static final int AZW_3 = 53;
public static final int ODT = 60;
public static final int OTT = 61;
public static final int TEXT = 70;
public static final int XAML_FLOW = 71;
public static final int XAML_FLOW_PACK = 72;
public static final int MARKDOWN = 73;
public static final int TIFF = 100;
public static final int PNG = 101;
public static final int BMP = 102;
public static final int EMF = 103;
public static final int JPEG = 104;
public static final int GIF = 105;
public static final int length = 37;
...
}
复制代码
说句题外话,这个类的有些写法有点另类,例如 toString 方法的这一堆 case...
大家感兴趣的可以阅读下源码。关键内容不多,这里就不水字数了。感兴趣的话欢迎留言探讨。
评论