SpringBoot集成jodconverter

在SpringBoot项目中集成jodconvert+LibreOffice实现office文档转pdf

 <!-- 核心包 -->
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-core</artifactId>
            <version>4.4.6</version>
        </dependency>
        <!-- 本地支持包 -->
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-local</artifactId>
            <version>4.4.6</version>
        </dependency>

在application.properties中的添加配置

jodconverter.local.officeHome=C:/Program Files/LibreOffice
#所在主机IP
jodconverter.local.hostName=127.0.0.1
# 开启多个LibreOffice进程,每个端口对应一个进程
jodconverter.local.portNumbers=8102
# LibreOffice进程重启前的最大进程数
jodconverter.local.maxTasksPerProcess=5
#超时时间
jodconverter.local.processTimeout=120000

编写Spring配置类

@Slf4j
@Configuration
@ConfigurationProperties(value = "jodconverter.local")
public class JodconverterConfig {

    private LocalOfficeManager officeManager;
    @Value("${jodconverter.local.officeHome}")
    private String officeHome;
   @Value("${jodconverter.local.hostName}")
   private String hostName;
   @Value("${jodconverter.local.portNumbers}")
    private String portNumbers;

    @Value("${jodconverter.local.maxTasksPerProcess}")
    private Integer maxTasksPerProcess;
    @Value("${jodconverter.local.processTimeout}")
    private Long processTimeout;

    /**
     * 启动Office组件进程
     *
     * @return
     */
    @PostConstruct
    public OfficeManager officeManager() {
        // 多个端口处理
        String[] portsString = portNumbers.split(",");
        int[] ports = Arrays.stream(portsString).mapToInt(Integer::parseInt).toArray();
        // 系统判断
        String os = System.getProperty("os.name").toLowerCase();

        officeManager = LocalOfficeManager.builder()
                .officeHome(os.contains("windows") ? officeHome : "linuxHome")
                .hostName(hostName)
                .portNumbers(ports)
                .processTimeout(processTimeout)
                .maxTasksPerProcess(maxTasksPerProcess)
                .install()
                .build();
        try {
            officeManager.start();
            InstalledOfficeManagerHolder.setInstance(officeManager);
            log.info("office进程启动成功");
        } catch (OfficeException e) {
            log.error("启动office组件失败");
            throw new RuntimeException(e);
        }
        return officeManager;
    }

    /**
     * 创建DocumentConverter实例
     *
     * @return
     */
    @Bean
    public DocumentConverter documentConverter() {
        log.info("创建DocumentConverter实例");
        LocalConverter converter = LocalConverter.builder()
                .officeManager(officeManager)
                .build();
        return converter;
    }

    @PreDestroy
    public void destroyOfficeManager() {
        if (null != officeManager && officeManager.isRunning()) {
            log.info("终止office进程");
            OfficeUtils.stopQuietly(officeManager);
        }
    }



}

编写controller

@RestController
@RequestMapping("/file")
public class FileConverterController {

    String PATH = "C:/Users/Administrator/Desktop/importTest/test/";

    @Resource
    DocumentConverter documentConverter;

    @RequestMapping("/convert")
    public String convert(@RequestParam("file") MultipartFile file) throws OfficeException, IOException {
        if (file.isEmpty()) {
            return "请选择上传文件";
        }

        // 保存上传文件
        String originalFilePath = PATH + file.getOriginalFilename();
        File localFile = new File(originalFilePath);
        try (OutputStream os = new FileOutputStream(localFile)) {
            os.write(file.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
            return "转换异常";
        }
        //刷新,将excel的表头都放置在同一页pdf
        String newExcelPath = PATH+UUID.randomUUID().toString().replace("-", "")+".xlsx";
        File newExcelFile = new File(newExcelPath);
        refresh(localFile,"xlsx",newExcelFile);
        // 转换成pdf的名称
        String pdfName = UUID.randomUUID().toString().replace("-", "");
        // 转换成pdf存放路径
        File pdfFile = new File(PATH + pdfName + ".pdf");
        // 开始转换
        documentConverter.convert(newExcelFile)
                .to(pdfFile).as(DefaultDocumentFormatRegistry.PDF)
                .execute();

        // 返回转换后的pdf文件的URL
        Map<String,Object> map = new HashMap<>();
        map.put("path",pdfFile.getAbsolutePath());
        return JSON.toJSONString(map);
    }

    public static void refresh(File oldFilePath, String oldType, File newFilePath) throws IOException {
        if (!"xlsx".equals(oldType)) {
            throw new RuntimeException("仅支持xlsx");
        } else {
            Workbook workbook = null;
            workbook = new XSSFWorkbook(new FileInputStream(oldFilePath));
            Integer sheetCount = workbook.getNumberOfSheets();

            for(int i = 0; i < sheetCount; ++i) {
                Sheet sheet = workbook.getSheetAt(i);
                XSSFPrintSetup printSetup = (XSSFPrintSetup)sheet.getPrintSetup();
                printSetup.setFitHeight((short)0);
                sheet.setFitToPage(true);
            }
            workbook.write(new FileOutputStream(newFilePath));
        }
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
Lorn的意义:你这标个前端是想找全栈吗?而且项目确实没什么含金量,技术栈太少了,边沉淀边找吧 现在学院本想就业好一点四年至少得高三模式两年加油吧
点赞 评论 收藏
分享
温州头等大孝子:你们的确很幸福,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
字节跳动开奖364人在聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务