Java自定义文档工具(word合并、word转pdf)

发布时间 2023-04-13 15:01:44作者: IamHzc

自定义文档工具

实现功能:
1、合并多份word文档。
2、word转pdf

实现方法

1、引入依赖。

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.8.2</version>
</dependency>
<!-- documents4j -->
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-client</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-server</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.1.7</version>
</dependency>

2、编码实现

@Component
public class DocUtil {

    /**
     * word后缀
     */
    private static final String WORD_SUFFIX = ".docx";

    /**
     * pdf后缀
     */
    private static final String PDF_SUFFIX = ".pdf";

    /**
     * 文件服务
     */
    @Resource
    private FileCenterService fileCenterService;

    /**
     * 文件工具
     */
    @Resource
    private FileUtil fileUtil;


    /**
     * 合并word文档
     */
    public Map<String, String> mergeDoc(String fileName, boolean isToFdf, String... fileIds) throws Exception {
        String mainWordId;
        HashMap<String, String> map = new HashMap<>();
        if(ObjectUtil.isEmpty(fileIds)){
            BaseCustomExceptionAssert.isTrue(false, "500", "未选择文档!");
        }
        //从文件服务下载文件
        Response mainResponse = fileCenterService.downloadFile(fileIds[0]);
        NiceXWPFDocument mainDoc;
        //主文档为是空文档
        if(ObjectUtil.equals(mainResponse.body().toString(), StringPool.EMPTY)){
            mainDoc= null;
        }else {
            mainDoc = new NiceXWPFDocument(mainResponse.body().asInputStream());
        }
        for (int i = 1; i < fileIds.length; i++) {
            Response response = fileCenterService.downloadFile(fileIds[i]);
            //空文档不合并
            if(!ObjectUtil.equals(response.body().toString(), StringPool.EMPTY)) {
                NiceXWPFDocument otherDoc;
                if(mainDoc != null) {
                    //分页
                    mainDoc.createParagraph().setPageBreak(true);
                }else{
                    //主文档为空文档,则当前非空文档为主文档
                    mainDoc = new NiceXWPFDocument(response.body().asInputStream());
                }
                otherDoc = new NiceXWPFDocument(response.body().asInputStream());
                mainDoc = mainDoc.merge(otherDoc);
            }
        }
        if(fileIds.length > 1 && mainDoc != null) {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            mainDoc.write(outputStream);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray());
            FileItem fileItem = createFileItem(byteArrayInputStream, fileName + WORD_SUFFIX);
            //将文件上传到文件服务,并返回文件服务ID
            mainWordId = fileUtil.getFileId(fileItem);
            map.put("fileId", mainWordId);
            byteArrayInputStream.close();
            outputStream.close();
        }
        //只有一份文档,或者所有文档都为空文档
        else{
            mainWordId = fileIds[0];
            map.put("fileId", fileIds[0]);
        }
        //是否转PDF
        if(isToFdf){
            map.put("pdfFileId", wordToPdf(mainWordId, fileName));
        }
        return map;
    }

    /**
     * word转pdf
     * @param fileId word文件ID
     * @param fileName 文件名
     */
    public String wordToPdf(String fileId, String fileName) throws IOException, ResourceException {
        if(ObjectUtil.isEmpty(fileId)){
            throw new ResourceException("word文件异常,转换pdf失败!");
        }
        Response response = fileCenterService.downloadFile(fileId);
        InputStream inputStream = response.body().asInputStream();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        IConverter converter = LocalConverter.builder().build();
        converter.convert(inputStream)
                .as(DocumentType.DOCX)
                .to(outputStream)
                .as(DocumentType.PDF)
                .execute();
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray());
        FileItem fileItem = createFileItem(byteArrayInputStream, fileName + PDF_SUFFIX);
        outputStream.close();
        inputStream.close();
        return fileUtil.getFileId(fileItem);
    }


    public  FileItem createFileItem(InputStream inputStream, String fieldName){
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        FileItem item = factory.createItem("file", "text/plain", true, fieldName);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        try {
            OutputStream os = item.getOutputStream();
            while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return item;
    }
}