word文档转pdf实现上传文件服务器

750 阅读2分钟

先说一下需求场景,是有个需求将文件服务器上的一个word文档(已知下载路径)转换成pdf格式再上传到文件服务器上。

word转pdf实现是通过使用spire.doc第三方包实现比较简单。感兴趣的同学可以搜一下
官网是可以通过maven依赖的方式获取jar包,但是需要修改maven的配置文件仓库地址。
如果有的同学项目maven有私有库也可以吧jar下载下来上传到私有库通过maven依赖获取。 像我这种只能用阿里云的公有库的。就只能放手动添加到项目里了。
spire.doc.jar
提取码: nuw8

Spire.doc-java帮助文档

  • 手动添加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());
    }