首页 > 其他分享 >word转pdf

word转pdf

时间:2024-08-24 14:03:46浏览次数:13  
标签:outputStream word String new inputStream aspose pdf

1 使用documents4j+libreoffice进行转换-有缺陷

实现思路:

1-在Windows系统中使用documents4j进行word向pdf的转换,这个依赖底层主要是使用Microsoft office的apis进行文档转换,所以只能在Windows中使用

2-在Linux中由于没有Microsoft office,所以只能手动下载libreoffice,通过这个服务进行文档的转换

-- 此程序在Windows中可以正常运行, 但是Linux中执行失败

1.1 下载libreoffice

yum install libreoffice

1.2 libreoffice转换命令

/usr/bin/libreoffice --headless --convert-to pdf srcUrl --outdir destUrl

1.3 Java代码细节

/**
 * 如果源文件为word 需要转换为pdf
 * @param inputStream
 * @param type 0-doc\1-docx
 * @return
 */
private InputStream wordToPdf(InputStream inputStream, int type) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    String os = System.getProperty("os.name").toLowerCase();
    if(os.contains("windows")) {
        IConverter converter = LocalConverter.builder().build();
        if (0 == type)
            converter.convert(inputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute();
        else converter.convert(inputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();
    }else if(os.contains("linux") || os.contains("unix") || os.contains("mac")){
        // 将流写进文件
        String fileExtension = (type == 0) ? ".doc" : ".docx";
        // 这里的baseDir需要为绝对路径
        String srcUrl = baseDir + "/tmp/tmpDoc-" + IdUtils.randomUUID() + fileExtension;
        String destUrl = baseDir + "/tmp/tmpPdf-" + IdUtils.randomUUID() + ".pdf";
        try {
            writeToFile(inputStream, srcUrl);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 构建LibreOffice命令
        String command = String.format(
                "/usr/bin/libreoffice --headless --convert-to pdf '%s' --outdir '%s'",
                srcUrl, destUrl);

        // 执行LibreOffice命令
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(command);
            process.waitFor(); // 等待LibreOffice完成转换
            // 将文件转换为流
            outputStream = readFromFile(destUrl);
            // 清理临时文件
            new File(srcUrl).delete();
            new File(destUrl).delete();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }else{
        throw new RuntimeException("不支持的系统");
    }
    return new ByteArrayInputStream(outputStream.toByteArray());
}

private void writeToFile(InputStream inputStream, String filePath) throws IOException {
    try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, bytesRead);
        }
    }
}

private ByteArrayOutputStream readFromFile(String filePath) throws IOException {
    try (FileInputStream fileInputStream = new FileInputStream(filePath)) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        return outputStream;
    }
}

2 使用aspose-words.jar进行文档转换

由于上述方法在Linux中存在问题,依赖于系统中的第三方api,所以并不方便,还对部署造成了负担,使用aspose似乎没有问题-除了付费,这里使用一点魔法应该没有大问题

官方jar包地址:https://releases.aspose.com/java/repo/com/aspose/aspose-words/

魔法参考:https://www.cnblogs.com/cxll863/p/16887080.html

实现细节

/**
     * 如果源文件为word 需要转换为pdf
     * @param inputStream
     * @return
     */
    private InputStream wordToPdf(InputStream inputStream) {
        InputStream fis = null;
        ByteArrayOutputStream out = null;
        try {
            ClassPathResource classPathResource = new ClassPathResource("license.xml");
            fis = classPathResource.getInputStream();
//            fis = new FileInputStream("src/main/resources/license.xml");
            License license = new License();
            license.setLicense(fis);
            out = new ByteArrayOutputStream();
            //开始转换代码...
            Document doc = new Document(inputStream);// 加载 Word 文档
            // 创建输出流
            doc.save(out, SaveFormat.PDF);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return new ByteArrayInputStream(out.toByteArray());
    }

确实比上述方法简洁、有效!收费的东西就是不一样

这里需要手动引入jar包,有几个细节需要注意:

  1. 引入jar包依赖
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-words</artifactId>
    <version>21.11</version>
    <classifier>jdk17</classifier>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/aspose-words-21.11-jdk17.jar</systemPath>
</dependency>
  1. 打包插件
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>
  1. jar包中路径问题
ClassPathResource classPathResource = new ClassPathResource("license.xml");
InputStream fis = classPathResource.getInputStream();

标签:outputStream,word,String,new,inputStream,aspose,pdf
From: https://www.cnblogs.com/yuqiu2004/p/18377701

相关文章

  • 【专题】2024数智医疗服务时代营销机遇洞察报告合集PDF分享(附原数据表)
    原文链接: https://tecdat.cn/?p=37466如今,人工智能、大数据、物联网等众多智能技术持续且深入地在医药产业中得到应用。这不仅极大地增强了医药产业的创新能力,显著提高了医疗服务的质量与效率,还有力地促进了从预防、诊断、治疗到康复的全链条数字化转型,使市场效率得到大幅提升。......
  • 基于模拟退火算法求解物流选址问题(附word文档)
    基于模拟退火算法求解物流选址问题(附word文档)......
  • 90%的人都在用这7个图片转pdf技巧,转换速度很快!
    图片怎么转换成pdf格式?图片和pdf格式是两种完全不一样的格式,但是如果想要将图片转换成pdf格式还是蛮容易的,常见的方法就有数十种了。本文整理了几种常见的图片转pdf的方法,包括图片转pdf在线方法,有需要的朋友可以往下看看!方法一:使用金舟PDF转图片金舟PDF转图片是适用于Windo......
  • 代码实现WordPress主动推送及自动推送至百度搜索收录
    站长们辛辛苦苦写的文章,无非就是让百度收录,也可以帮助人,也可以给自己站或者帮人优化的站带来流量,今天就来发一篇关于wordprss主动推送给百度的方法;使用方法,U8格式放在wp当前模板functions.php里即可12345678910111213141516171819202122232425262......
  • 遷移Wordpress到新域名,新子域名
    1.0前言把Wordpress遷移到WordpressMultiSites的子域名,因此“All-in-OneWPMigrationandBackup”就需要付費VIP才支持遷移子域名。但用手動方法也可以實現遷移到子域名。延伸文章:Wordpress主題文章wordpress更改domain域名和數據庫連接2.0 “All-in-OneWPMigratio......
  • 转载:国产麒麟v10、UOS系统在线比较两个Word文件的内容差异
    调用PageOffice的WordCompare方法,同时在线打开两个Word文档,可以切换显示其中的一个文档,或者显示两个文档的对比结果,即可实现在线的文档内容比较功能。此功能可以应用在以下方面:文档管理中,比较两个版本Word文档的差别。 在处理文档管理的Web项目中,比较两个版本的Word,指的不是Wo......
  • 【专题】2023-2024中国游戏企业研发竞争力报告合集PDF分享(附原数据表)
    原文链接: https://tecdat.cn/?p=37447 在当今的数字时代,游戏产业已然成为经济与文化领域中一股不可忽视的重要力量。2023年,中国自研游戏市场更是呈现出一片繁荣且复杂的景象,实际销售收入达到了令人瞩目的2563.8亿元,同比增长15.3%,不仅刷新历史纪录,还彰显出其强大的市场活力......
  • 如何在word/wps中添加代码,并且保持源代码风格
    一、HighlightCode在线工具https://highlightcode.com二、操作步骤1、将代码复制到框中 2、点击右上方的高亮代码 3、得到如下代码样式 4、将代码复制到Word/Wps中即可,效果如下图所示 ......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版提取word文档指定位置内容保存为
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯longarch芯片架构。本示例关键代码的编写位置,请参考“开始-快速上手”里您所使用的开发语言框架的最简集成代码注意本文中展示的代码均为关键代码,复制粘......
  • Spire.Doc for Java(cracked)实现复制word中的表格(2)
    先看效果,符不符合你的需求。背景: word插入的表格数据填充到该表格时,如果数据量超过该的表格数,应将表格在下一页重新创建该表格,并将剩余数据继续填充到新的表格中。再简单点:word表格只有5行,但是数据有20行,表格不够添加,就还需要复制3份一样的表格,中间需要分页符隔开,最终得......