java实现图片、word、pdf等多文件融合到一个pdf(word转pdf)

这篇具有很好参考价值的文章主要介绍了java实现图片、word、pdf等多文件融合到一个pdf(word转pdf)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要介绍了srpingboot如何将 jpg、jpeg、png、pdf、docx、doc六种格式文件合并输出成一个pdf文件以及word文档如何转换为pdf,关键是开源免费
在日常工作学习中免不了会涉及到将多种格式的文件合并为一个pdf或者是将word文档、ppt、excel等转换为pdf。废话不多说,直接上代码

一、使用 PDFBox 合并多种格式文件成 PDF 文件

1.添加依赖

在 pom.xml 文件中添加 PDFBox 的依赖:

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.24</version>
</dependency>
 <dependency>
    <groupId>org.apache.directory.studio</groupId>
    <artifactId>org.apache.commons.io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.7</version>
</dependency>
<dependency>
   <groupId>cn.hutool</groupId>
   <artifactId>hutool-all</artifactId>
   <version>5.7.12</version>
</dependency>

2.实现代码

在 Spring Boot 项目中,新建一个类 MergeFilesToPDFUtil,并添加如下代码:

import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.jodconverter.DocumentConverter;
import org.jodconverter.document.DefaultDocumentFormatRegistry;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;


/**
 * @ClassName MergeFilesToPDFUtil
 * @Description
 * @Author hzy
 * @Date 2023/4/6 10:56
 **/
public class MergeFilesToPDFUtil {

    @Resource
    public DocumentConverter documentConverter;


    /**
     *
     * @param fileNames 需要转换的文件列表(需带文件路径)
     * @param outputFile 输出文件路径 如:/test/output.pdf
     */
    public String generatePdf(List<String> fileNames, String outputFile) {
        List<InputStream> inputStreams = new ArrayList<>();
        List<PDDocument> pdDocuments = new ArrayList<>();
        List<PDDocument> pdfdocuments = new ArrayList<>();
        //生成临时文件的路径
        String url = "/home/tempFile/";

        try {
            File file = new File(outputFile);
            if (!file.exists()) {
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                file.createNewFile();
            }
            // 创建一个空的pdf文档
            PDDocument document = new PDDocument();
            // 依次读取要合并的各个文件,并将其内容添加到pdf文档中
            for (String fileName : fileNames) {
                String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
                //读取jpg、jpeg、png格式的文件
                if (fileExt.equalsIgnoreCase("jpg") || fileExt.equalsIgnoreCase("jpeg")
                        || fileExt.equalsIgnoreCase("png")) {
                    PDImageXObject image = PDImageXObject.createFromFile(fileName, document);
                    PDPage page = new PDPage(new PDRectangle(image.getWidth(), image.getHeight()));
                    document.addPage(page);
                    try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                        contentStream.drawImage(image, 0, 0);
                    }
                } else if (fileExt.equalsIgnoreCase("pdf")) {
                    PDDocument pdf = PDDocument.load(new File(fileName));
                    for (PDPage page : pdf.getPages()) {
                        document.addPage(page);
                    }
                    pdfdocuments.add(pdf);
                } else if (fileExt.equalsIgnoreCase("docx") || fileExt.equalsIgnoreCase("doc")) {
                    String pdfFile = System.currentTimeMillis() + ".pdf";
                    String tempPdfUrl = url + "/" + pdfFile;
                    // 转换word文件为pdf
                    if (fileExt.equalsIgnoreCase("docx")) {
                        documentConverter.convert(new File(fileName)).as(DefaultDocumentFormatRegistry.DOCX).
                                to(new File(tempPdfUrl)).as(DefaultDocumentFormatRegistry.PDF).execute();
                    } else {
                        documentConverter.convert(new File(fileName)).as(DefaultDocumentFormatRegistry.DOC)
                                .to(new File(tempPdfUrl)).as(DefaultDocumentFormatRegistry.PDF).execute();
                    }
                    //这里是将转完的pdf添加到新的pdf页面之后
                    PDDocument load = PDDocument.load(new File(tempPdfUrl));
                    for (PDPage page : load.getPages()) {
                        document.addPage(page);
                    }
                    //将生成的pdf临时文件删除掉
                    FileUtils.forceDelete(new File(tempPdfUrl));
                    pdDocuments.add(load);
                }
            }
            // 将pdf文档保存到本地
            document.save(outputFile);
            document.close();
            return outputFile;
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            closeIo(inputStreams, pdDocuments, pdfdocuments);
        }
    }
    /**
     * 关闭所有的io流
     * @param inputStreams
     * @param pdDocuments
     * @param pdfdocuments
     */
    public static void closeIo(List<InputStream> inputStreams ,List<PDDocument> pdDocuments,List<PDDocument> pdfdocuments){
        try {
            Thread.sleep(5000);
            for (InputStream inputStream : inputStreams) {
                inputStream.close();
            }
            for (PDDocument pdDocument : pdDocuments) {
                pdDocument.close();
            }
            for (PDDocument pdfdocument : pdfdocuments) {
                pdfdocument.close();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

二、使用 LibreOffice 将word文档转为pdf

注意,本文在添加 Word 文件时,我们使用了 LibreOffice的方法将其转换为 PDF 文件。然后又通过pdfbox进行的合并,如果有更好的方式将word转为pdf那么只需要修改相关代码即可,不用引入libreoffice相关依赖。以下是使用LibreOffice的方式,仅供参考:

1.安装 LibreOffice

首先需要在服务器上安装 LibreOffice。在 Linux 上,可以使用命令行工具安装:

sudo apt-get install libreoffice

在 Windows/mac上,可以从 LibreOffice 官网下载安装程序进行安装。

2.添加依赖

在 pom.xml 文件中添加以下依赖:

<!--jodconverter 核心-->
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-spring-boot-starter</artifactId>
            <version>4.4.6</version>
        </dependency>
        <!--jodconverter 引用LibreOffice-->
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-local-lo</artifactId>
            <version>4.4.6</version>
        </dependency>

3.修改配置文件

在application.yml 文件中添加以下配置:

#配置lireoffice
jodconverter:
  local:
    enabled: true
    #libreoffice安装路径
    office-home: /Applications/LibreOffice.app/Contents
    task-execution-timeout: 86400000
    task-queue-timeout: 86400000
    process-timeout: 86400000

三、进行测试

请注意:为方便观看,这里采用使用main方法的形式进行演示,在实际开发过程中 main方法无法调用非静态方法generatePdf,需要使用service进行调用,否则DocumentConverter无法注入文章来源地址https://www.toymoban.com/news/detail-554842.html

public static void main(String[] args) throws Exception {
        // 要合并的文件列表
        List<String> fileNames = new ArrayList<>();
        fileNames.add("/test/file1.jpg");
        fileNames.add("/test/file2.jpeg");
        fileNames.add("/test/file3.png");
        fileNames.add("/test/file4.pdf");
        fileNames.add("/test/file5.docx");
        fileNames.add("/test/file6.doc");
        // 输出的pdf文件名
        String outputFile = "/test/output.pdf";
        generatePdf(fileNames,outputFile);
    }

到了这里,关于java实现图片、word、pdf等多文件融合到一个pdf(word转pdf)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java使用pdfbox进行pdf和图片之间的转换

    pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图. 引入依赖

    2024年02月06日
    浏览(54)
  • Java 利用pdfbox将图片和成到pdf指定位置

    业务背景:用户在手机APP上进行签名,前端将签完名字的图片传入后端,后端合成新的pdf. 废话不多说,上代码: 注意:前端传过来的图片必须是透明的,否则合成的时候签名处会有边框        

    2024年02月09日
    浏览(65)
  • 前端实现pdf,图片,word文件预览

    需求:实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能,建议以下的预览文件标签可以在外层包裹一层弹窗。 iframe标签能够将另一个HTML页面嵌入到当前页面中,我们的图片也能够使用iframe标签来

    2024年02月11日
    浏览(56)
  • 前端实现文件预览(pdf、excel、word、图片)

    需求:实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能,建议以下的预览文件标签可以在外层包裹一层弹窗。 sandbox 这个属性如果是单纯预览图片可以不使用,该属性对呈现在 iframe 框架中的内容

    2024年02月10日
    浏览(63)
  • java中pdfbox处理pdf常用方法(读取、写入、合并、拆分、写文字、写图片)

    方法代码: 测试用例: 2.1写文字 方法代码: 测试用例: A.pdf: A2.pdf: 2.2写图片 方法代码: 测试用例: A.pdf: pic.jpg: A2.pdf: 方法代码: 测试用例: 方法代码: 测试用例: 引用链接: (17条消息) 使用Apache PDFBox实现拆分、合并PDF_似有风中泣的博客-CSDN博客 (17条消息) Java使用P

    2024年02月11日
    浏览(128)
  • Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    一、写在前面 最近在项目中使用打印功能,发现这个功能我已经写过多次了,下面这个文章的发步日期在2020年,不得不感慨时间之快啊。 https://blog.csdn.net/weixin_43238452/article/details/109636200?spm=1001.2014.3001.5501 下面介绍一下应用场景:这次项目依旧是springboot项目,使用ftl模版生

    2024年02月15日
    浏览(59)
  • 记录--前端实现文件预览(pdf、excel、word、图片)

    需求:实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能,建议以下的预览文件标签可以在外层包裹一层弹窗。 iframe标签能够将另一个HTML页面嵌入到当前页面中,我们的图片也能够使用iframe标签来

    2024年02月09日
    浏览(66)
  • Java将获取的参数,图片以及pdf文件放入到word文档指定位置

    首先引入的依赖 接下面的是template.docx文档,参数是以{{paramName}}格式的,为什么要以这种格式,是因为下面的方法,在替换参数的时候需要 但是从数据库获取的参数跟模板中的参数一一对应上即可,格式如下(我是json形式展示的): {     \\\"countQuota\\\": \\\"1\\\",     \\\"noEmission\\\": \\\"1\\\",  

    2024年02月15日
    浏览(49)
  • 如何通过Java的Apache PDFBox库制作一个PDF表格模板并填充数据

    要使用Java的Apache PDFBox库制作一个PDF表格模板并填充数据,你需要遵循以下步骤: 添加依赖 :首先,确保你的项目中包含了Apache PDFBox的依赖。如果你使用Maven,可以在你的 pom.xml 文件中添加以下依赖: 创建PDF模板 :你可以使用PDFBox创建一个简单的PDF模板,或者使用其他工具

    2024年02月22日
    浏览(58)
  • aspose-words、itextpdf完美解决java将word、excel、ppt、图片转换为pdf文件

    我是 傲骄鹿先生 ,沉淀、学习、分享、成长。 如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法 面对日常开发过程中,将各种文件转换为pdf文件的问题,总是让人头疼,这次终

    2024年02月03日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包