先说一下需求场景,是有个需求将文件服务器上的一个word文档(已知下载路径)转换成pdf格式再上传到文件服务器上。
word转pdf实现是通过使用spire.doc第三方包实现比较简单。感兴趣的同学可以搜一下
官网是可以通过maven依赖的方式获取jar包,但是需要修改maven的配置文件仓库地址。
如果有的同学项目maven有私有库也可以吧jar下载下来上传到私有库通过maven依赖获取。 像我这种只能用阿里云的公有库的。就只能放手动添加到项目里了。
spire.doc.jar
提取码: nuw8
- 手动添加jar包到项目之后maven打包 可能会有报找不到jar报的错误
这时候需要手动创建lib文件夹将第三方jar包放进去然后pom文件需要添加下面的这个本地依赖
我lib文件夹创建的是项目根目录下和pom.xml文件同级
<!--第三方jar添加word转pdf-->
<dependency>
<groupId>com.e-iceblue</groupId>
<artifactId>spire.doc</artifactId>
<version>1</version>
<scope>system</scope>
<systemPath>${basedir}/lib/Spire.Doc.jar</systemPath>
</dependency>
关于转换的两种方式
- 文档中是使用saveToFile方法
document.saveToFile(“out/toPDF.pdf”, FileFormat.PDF);
这个方法会将文件保存到本地服务器上。- 我的代码中使用了saveToStream方法
saveToStream(OutputStream os,FileFormat.PDF); 这个方法会将文件保存一个文件输出流中。
代码
因为我的项目有一个上传文件的服务需要的参数是MultipartFile所以自己在后台创建了实例。
/**
* @Date: 2020/6/11 10:43
* @Description:
* @param fileInfoEntity 参数格式 {"path":"要转换的文件路径","fileName":"文件名"}
*/
@ApiOperation(value = "word文档转成pdf", notes = "")
public Result wordToPdf(@RequestBody FileInfoDataEntity fileInfoEntity){
try{
if(fileInfoEntity == null || StringUtils.isBlank(fileInfoEntity.getPath())||
StringUtils.isBlank(fileInfoEntity.getFileName())){
return Results.failure(BaseEnums.PARAMETER_NOT_NULL.code(), BaseEnums.PARAMETER_NOT_NULL.desc());
}
//处理文件名 将文件名后缀改成pdf
String fileName = fileInfoEntity.getFileName()
.substring(0, fileInfoEntity.getFileName().lastIndexOf("."))+".pdf";
//通过文件路径获取文件 通过网络流获取文件流转成document
URL url = new URL(fileInfoEntity.getPath());
URLConnection conn = url.openConnection();
//创建spire.doc文档实例
Document document = new Document(conn.getInputStream());
//创建输出流并且将文件数据保存到输出流中
ByteArrayOutputStream bos = new ByteArrayOutputStream();
document.saveToStream(bos,FileFormat.PDF);
//创建输入流并且把输出流的数据保存到输入流中
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
//创建MockMultipartFile实例构造参数是(文件名,真实文件名,类型,输入流)
MultipartFile file = new MockMultipartFile(fileName,fileName, ContentType.APPLICATION_OCTET_STREAM.toString(),bis);
//调用文件上传服务将文件保存到文件服务器()
FileObj fileObj = hardwareTestService.uploadFileFileServer(file);
return Results.successWithData(fileObj,BaseEnums.SUCCESS.code(),BaseEnums.SUCCESS.desc());
}catch (Exception e){
e.printStackTrace();
}
return Results.failure(BaseEnums.OPERATION_FAILURE.code(),BaseEnums.OPERATION_FAILURE.desc());
}