Java将Word转换成PDF

这篇具有很好参考价值的文章主要介绍了Java将Word转换成PDF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近项目需要做在线预览文档功能,要求对word文档后台转为pdf,遇到了很多问题,因此记录一下。

网上有很多将Word转换成PDF的方式,这里我试了几种比较简单的方式:POI、aspose、spire和documents4j。

1、POI

POI是Apache下的一个Java类库,可以帮助我们实现Java与各种Office格式文件的互相转换。下面是实现步骤:

引入依赖

<!-- Apache POI -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
 <!-- Apache POI - Word -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
 <!-- iText -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.2</version>
</dependency>

工具类代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfWriter;
public class WordToPdfConverter {
    public static void convertToPdf(String inputFilePath, String outputFilePath) {
        try {
            // 加载Word文档
            FileInputStream fis = new FileInputStream(inputFilePath);
            XWPFDocument document = new XWPFDocument(fis);
             // 创建PDF文档
            Document pdfDoc = new Document();
            PdfWriter.getInstance(pdfDoc, new FileOutputStream(outputFilePath));
            pdfDoc.open();
             // 将Word文档内容写入PDF文档
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                pdfDoc.add(paragraph.createRun().getText());
            }
             for (XWPFTable table : document.getTables()) {
                for (XWPFTableRow row : table.getRows()) {
                    for (XWPFTableCell cell : row.getTableCells()) {
                        pdfDoc.add(cell.getText());
                    }
                }
            }
             pdfDoc.close();
            document.close();
             System.out.println("Word文档已成功转换为PDF!");
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
    }
     public static void main(String[] args) {
        String inputFilePath = "input.docx";
        String outputFilePath = "output.pdf";
        convertToPdf(inputFilePath, outputFilePath);
     }
}

POI库在转换过程中无法完全保留Word文档的所有样式。POI库的主要目标是处理Word文档的内容,而不是完全复制其样式。因此,转换后的PDF文件可能会有一些样式差异。如果是比较复杂的Word不建议使用此方式

2、Aspose.Words

Aspose.Words for Java是一个原生库,为开发人员提供了丰富的功能来创建、编辑和转换 Word、PDF、Web 文档,而无需在系统上安装 Microsoft Word 环境。该 Java 库是依赖于文档对象模型 (DOM) 的类和方法的集合,使开发人员能够在元素级别直接访问文档的内部工作方式。使用我们的产品,Java 开发人员可以高效地创建复杂的文档并修改其格式、布局和内容。
对于寻求综合工具来简化文档编辑和文档生成任务的开发人员来说,这个原生 Java API 是一个可靠的文档处理解决方案;大规模自动化文档密集型业务流程;减少人工干预、错误和延迟。

官网:https://products.aspose.com/words/java/

引入依赖(建议将jar包下载下来并上传私服里去)

https://releases.aspose.com/java/repo/com/aspose/aspose-words/18.6/aspose-words-18.6-jdk16.jar

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-words</artifactId>
    <version>18.6</version>
    <classifier>jdk16</classifier>
</dependency>

需要在项目里加入一个license.xml,不然生成的pdf会有水印

license.xml如下:

<?xml version="1.0" encoding="UTF-8" ?>
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

代码如下:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.FontSettings;
import com.aspose.words.SaveFormat;

public static boolean asposeWordToPdf() {
        if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
            return false;
        }
        String inPath = "D:\\GoogleDownload\\ExportWord_230803_032555.docx";
        String outputFilePath = "C:\\Users\\WPC\\Desktop\\test.pdf";
        FileOutputStream os = null;

        try {
            long old = System.currentTimeMillis();
            File file = new File(outputFilePath); // 新建一个空白pdf文档
            os = new FileOutputStream(file);
            com.aspose.words.Document doc = new Document(inPath); // Address是将要被转化的word文档
            //Linux 下使用字体库
//            FontSettings fontSettings = new FontSettings();
//            fontSettings.setFontsFolder("/usr/share/fonts/windows"+File.separator,true);
//            doc.setFontSettings(fontSettings);
            doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
            // EPUB, XPS, SWF 相互转换
            long now = System.currentTimeMillis();
            System.out.println("pdf转换成功,共耗时:" + ((now - old) / 1000.0) + "秒"); // 转化用时
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }finally {
            if (os != null) {
                try {
                    os.flush();
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
public static boolean getLicense() {
        boolean result = false;
        try {
            InputStream is = Test.class.getClassLoader().getResourceAsStream("\\license.xml"); // license.xml应放在资源路径下
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
}

当文档中含有中文字符时,该段代码的执行需要调用操作系统的本地字体库支持,否则所有中文字符都将乱码。

该段代码如果想要在Linux服务器上完美运行,需要给Linux服务器安装中文字体库。可以看最后Java使用Spire.Pdf或Aspose-Words实现Word转换Pdf在Linux服务器上的中文乱码问题

3、spire.doc.free

Spire.Doc for Java是一个专业的 Word API,它使 Java 应用程序能够创建、转换、操作和打印 Word文档,而无需依赖 Microsoft Word。通过使用这个多功能库,开发人员可以轻松处理大量任务,例如插入图像、超链接、 数字签名、书签和水印、设置页眉和页脚、创建表格、设置背景图像以及添加脚注和尾注。此外,Spire.Doc for Java 支持从Word 到 PDF、XPS、Image、EPUB、HTML、TXT、ODT、RTF、WordML、WordXML 等文件格式转换。

注意:免费版Free Spire.Doc for Java 仅限于 500 个段落和 25 个表格。在读取或写入文件期间会强制执行此限制。将Word文档转换为PDF和XPS文件时,您只能获取PDF文件的前3页。

官网:https://www.e-iceblue.com/Introduce/doc-for-java.html

java word转pdf,笔记总结,java,word,pdf

下载 Spire.Doc for Java 开始免费试用:https://www.e-iceblue.com/Download/doc-for-java.html

引入依赖:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>


<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.doc.free</artifactId>
    <version>5.2.0</version>
</dependency>

代码如下:

import com.spire.doc.FileFormat;

private static void spireWordToPdf() throws IOException {
    //实例化Document类的对象
    com.spire.doc.Document doc = new com.spire.doc.Document();

    // 下载Word文件
//        URL url = new URL("http://xxxx/ExportWord_230724_172956.docx");
//        InputStream inputStream = url.openStream();
//        doc.loadFromStream(inputStream,FileFormat.Docx);
    //加载Word
    doc.loadFromFile("D:\\GoogleDownload\\ExportWord_230803_032555.docx");
    //保存为PDF格式

    doc.saveToFile("C:\\Users\\WPC\\Desktop\\test.pdf", FileFormat.PDF);
}

该段代码如果想要在Linux服务器上完美运行,需要给Linux服务器安装中文字体库。可以看最后Java使用Spire.Pdf或Aspose-Words实现Word转换Pdf在Linux服务器上的中文乱码问题

4、documents4j

官网:https://documents4j.com/#/

GitHub:https://github.com/documents4j/documents4j

documents4j 是一个跨平台的文档转换库,并且可以在 Linux 上进行 Word 转 PDF 的操作。

它利用 Microsft Office 的 APIs 来进行文档转换,因此需要在Linux上安装 OpenOffice/LibreOffice 编辑器。

以下是在Linux环境下执行 Word 转 PDF 的基本步骤:

Ubuntu:使用以下命令安装

sudo apt-get install libreoffice

CentOS:使用以下命令安装

sudo yum install libreoffice

引入依赖:

<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.0.3</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.0.3</version>
</dependency>

代码如下:

import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;    

public static void word2pdf() throws IOException {
    // 参考:https:blog.csdn.net/ka3p06/article/details/125476270 通过documents4j实现
    InputStream docxInputStream = null;
    OutputStream outputStream = null;
    try {
        // 原word地址
//            docxInputStream = new FileInputStream("E:\\\\test2\\\\word模板.docx");
        URL url = new URL("http://xxxx/ExportWord_230724_172956.docx");
        docxInputStream = url.openStream();

        // 转换后pdf生成地址
        outputStream = new FileOutputStream("C:\\Users\\WPC\\Desktop\\test.pdf");
        IConverter converter = LocalConverter.builder().build();
        converter.convert(docxInputStream)
                .as(DocumentType.DOCX)
                .to(outputStream)
                .as(DocumentType.PDF).execute();
        // 关闭
        converter.shutDown();
        // 关闭
        outputStream.close();
        // 关闭
        docxInputStream.close();
    } catch (Exception e) {
        System.out.println("[documents4J] word转pdf失败:" + e.toString());
    } finally {
        if (outputStream != null) {
            outputStream.close();
        }
        if (docxInputStream != null) {
            docxInputStream.close();
        }
    }
}

Java使用Spire.Pdf或Aspose-Words实现Word转换Pdf在Linux服务器上的中文乱码问题

原因分析:

当Word文档中含有中文字符时,不管是使用Spire.Pdf或Aspose-Words实现Word转换Pdf,代码的执行都需要调用操作系统的本地字体库支持,否则所有中文字符都将乱码。

在Windows环境下没有问题但是在Linux环境下有问题,说明不是代码或者输入输出流编码的问题,根本原因是两个平台环境的问题。出现乱码说明Linux环境中没有相应的字体以供使用

如果你的代码想要在Linux服务器上完美运行,就需要给Linux服务器安装中文字体库

解决方案:

将转换无问题的Windows主机中的字体拷贝到Linux平台下进行安装,重启服务器后转换就不会出现乱码

Windows字体复制到Linux环境并安装

Windows字体库的位置是C:\Windows\fonts,这里面包含所有Windows下可用的字体

Linux字体库的位置是 /usr/share/Fonts

在该目录下新建一个目录,比如目录名叫 windows,然后将 Windows 字体库中你要的字体文件复制到新建的目录下(只需要复制*.ttc,和*.ttf格式的文件)

更改这些字体库的权限

sudo chmod 755 /usr/share/fonts/windows/*

然后进入Linux字体库

cd /usr/share/fonts/windows/

接着根据当前目录下的字体建立scale文件。PS:如果提示找不到这个命令,使用:yum install mkfontscale

sudo mkfontscale

接着建立dir文件。PS:如果提示找不到这个命令,使用:yum install fontconfig

sudo mkfontdir

然后运行

sudo fc-cache

最后需要重启一次服务器

如果是docker环境下

重复上面操作,不过进入的服务器是宿主机

**docker run -v /usr/share/fonts:/usr/share/fonts *****
docker启动时共享宿主机的字体库重启docker项目即可解决乱码问题文章来源地址https://www.toymoban.com/news/detail-714819.html

到了这里,关于Java将Word转换成PDF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 在java中如何使用openOffice进行格式转换,word,excel,ppt,pdf互相转换

    1.首先需要下载并安装openOffice,下载地址为: Apache OpenOffice download | SourceForge.net 2.安装后,可以测试下是否可用; 3.build.gradle中引入依赖: 4.创建工具类,启动openOffice服务的方法 5.结束openOffice服务的方法 7.在测试方法中进行格式转换,如,他可以是任意类型转换,如excel转换

    2024年02月14日
    浏览(37)
  • java使用poi-tl导出word及转换PDF后的合并导出pdf

    为某单位开发的一款项目申报审批系统,用户需求在申报阶段填写的信息资料能够导出PDF。且项目申报的报告正文为用户上传,所以需要合并导出。 在项目初期阶段使用的是PDF的预设模板导出,因为以前使用过,比较熟悉。所以优先选择此方法,但项目测试阶段发现问题,因

    2024年02月06日
    浏览(62)
  • 用Aspose-Java免费实现 PDF、Word、Excel、Word互相转换并将转换过得文件上传OSS,返回转换后的文件路径

    github代码地址 https://github.com/Tom-shushu/work-study 接口文档有道云 https://note.youdao.com/s/GShGsYE8 接口文档离线版本 https://files.cnblogs.com/files/Tom-shushu/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3.rar?t=1682958343download=true 为什么发布这篇文档转换的文章呢?因为上周我要将一个PDF转换为Word,结果百度谷歌

    2024年02月02日
    浏览(40)
  • Java 使用 poi 和 aspose 实现 word 模板数据写入并转换 pdf 增加水印

    本项目所有源码和依赖资源都在文章顶部链接,有需要可以下载使用 1. 需求描述 从指定位置读取一个 word 模板 获取业务数据并写入该 word 模板,生成新的 word 文档 将新生成的 word 文档转换为 pdf 格式 对 pdf 文档添加水印 2. 效果预览 word 模板 带水印的 pdf 文档 3. 实现思路

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

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

    2024年02月03日
    浏览(42)
  • Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理

    感谢小伙伴儿的分享: ● 不羁 ● 郭中天 整合调整后的工具类Gitee地址:https://gitee.com/yuanzhengme/java_application_aspose_demo ● WordToPdfUtil用于将word文档转换为pdf格式的工具类 ● ExcelToPdfUtil用于将excel文档转换为pdf格式的工具类 ● PdfToImageUtil用于将pdf文档转换为image格式的工具类

    2024年01月24日
    浏览(59)
  • java word转pdf,word模板

    maven poi-tl语法参考文档 http://deepoove.com/poi-tl/ 测试poi-tl 测试word转pdf test.docx 截图 template.docx截图 效果截图

    2024年02月06日
    浏览(34)
  • java实现图片、word、pdf等多文件融合到一个pdf(word转pdf)

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

    2024年02月15日
    浏览(35)
  • Java根据word模板生成word文档并转成PDF文件

    定义完我们的模板之后,我们要将文档保存为xml的格式 生成的xml格式看起来比较乱,没有层次感, 所以需要格式化一下 格式化 基础信息的定义 基础信息的定义只要保证我们转化成的xml文件中的${name}等格式没错误即可 表格的定义 遍历实现,表格的数据填充 在xml文件中我们的

    2024年02月09日
    浏览(44)
  • java实现pdf转word

    1.java实现pdf转word。 2.纯免费开源。 3.pdf解析完会生成word文件和图片文件夹。 4.无页码限制,文本类型生成到word中,图片生成到图片文件夹中。 5.弊端:需手动将图片与文本整合成一个word文件。 仅提供一个pdf转word的实现方案,代码粗糙,老铁轻喷。 jar包地址:https://downlo

    2024年03月10日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包