实现Word转Pdf文件

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

在项目中需要以Word文件为模板,填充指定数据,并转换为Pdf文件。可以分为两步,第一步使用POI进行文本替换,第二步把替换后的Word转换为pdf文件。

当前遇到的问题是网上所有的转换工具依赖的包都过大,一般要30M以上。而自己通过Poi实现转换的成本又太高,且转换效果不够理想。最终尝试一下,先从Word转换为HTML,然后再从HTML转换为pdf。

虽然转换成功了,但是由于在从word转换给html时使用了ooxml-schema.jar包,此包有十几兆,总依赖仍旧超过30M。最终放弃了此方法。当过程值得记录下来,以供以后参考。

1.Word转换为html

除了poi相关包(我当前使用的4.1.2版本)以外,还需要ooxml-schemas.jar和xdocreport.jar,依赖配置如下:

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>ooxml-schemas</artifactId>
                <version>1.4</version>
            </dependency>
            <dependency>
                <groupId>fr.opensagres.xdocreport</groupId>
                <artifactId>xdocreport</artifactId>
                <version>2.0.2</version>
            </dependency>

代码实现及注释如下:

 /**
     * docx文件转html
     * 参考: https://wooaooo.com/2022/02/12/Java/POI/java-poi5.2.0-word-to-html/
     * @param wordInput word文件输入流。
     * @param  data 需要填充的数据。
     */
    public static String word2007ToHtml(InputStream wordInput, Map<String, String> data)
            throws IOException {

        // 加载word文档生成 XWPFDocument对象
        XWPFDocument document = new XWPFDocument(wordInput);

        //  带图片的word,则将图片转为base64编码,保存在一个页面中
        XHTMLOptions options = XHTMLOptions.create().indent(3).setImageManager(new Base64EmbedImgManager());
        //若设置true,表示外层没有html\head\body标签,设为false,保留html等标签。
        options.setFragment(true);
        //转换为html
        StringWriter writer = new StringWriter();
        XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
        xhtmlConverter.convert(document, writer, options);
        String html = writer.toString();
        // 解析html并优化布局
        Document doc = Jsoup.parseBodyFragment(html);
        //去掉页边距和固定宽度
        Elements elements = doc.getElementsByTag("div");
        for(Element element : elements){
            element.attr("style","line-height:2em;margin-left: 3em; margin-right: 3em;");
        }
        //设置所有table的样式
        Elements tables = doc.getElementsByTag("table");
        for (Element table : tables) {
            table.attr("style", "border-collapse: collapse;");
        }
        //文本替换。
        html = doc.outerHtml();
        for(Map.Entry<String,String> item : data.entrySet()){
            html = html.replace(item.getKey(),item.getValue());
        }
        return html;
    }

2.html转换为pdf

需要用到的jar包配置如下:

            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itext7-core</artifactId>
                <version>${itextpdf.version}</version>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>font-asian</artifactId>
                <version>${itextpdf.version}</version>
            </dependency>
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>html2pdf</artifactId>
                <version>3.0.3</version>
            </dependency>

代码实现及注释如下:

    /**
     * html转换为pdf
     * @param html html文本内容
     * @param output pdf文件输出
     */
    public static void htmlToPdf(String html, OutputStream output) throws IOException {
        //转换时参数配置,例如字体,依赖图片等文件路径
        ConverterProperties properties = new ConverterProperties();
        //必须设置字体,否则转换的pdf文件不显示汉字
        FontProvider fp = new FontProvider();
        fp.addFont(FontProgramFactory.createFont("STSong-Light"),"UniGB-UCS2-H");
        properties.setFontProvider(fp);
        //转换
        try(PdfDocument pdfDocument = new PdfDocument(new PdfWriter(output))){
            //设置pdf页面大小为A4
            pdfDocument.setDefaultPageSize(PageSize.A4);
            HtmlConverter.convertToPdf(html,pdfDocument,properties);
        }
    }

3.其他实现word转换pdf的方法

其他实现word转换为pdf的方法可以参考:Java开发中Word转PDF文件5种方案横向评测,我最终选择的是aspose-words,因为其转换效果比较好,依赖包相对比较小,且代码量少。

放弃了通过html转换pdf后,就可以直接通过Word转换为pdf了。需要通过poi-tl.jar来实现word中的数据替换,然后再通过aspose-words.jar转换为pdf。依赖包如下:

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>4.1.2</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.1.2</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>4.1.2</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.deepoove</groupId>
      <artifactId>poi-tl</artifactId>
      <version>1.10.5</version>
    </dependency>
    <dependency>
      <groupId>com.luhuiguo</groupId>
      <artifactId>aspose-words</artifactId>
      <version>23.1</version>
    </dependency>

代码实现相当简单,如下:

package com.zhengzhaoxi.web.common;

import com.aspose.words.Document;
import com.aspose.words.PdfSaveOptions;
import com.deepoove.poi.XWPFTemplate;

import java.io.*;
import java.util.Map;

/**
 * Word工具类
 * @author donghx
 * @author 2023-06-14
 */
public class WordUtils {

    /**
     * 填充数据
     * @param input 输入word文件数据流
     * @param data 需要替换的数据映射
     * @param output 输出的word文件数据量
     * @throws IOException
     */
    public static void fillData(InputStream input, Map<String, Object> data, OutputStream output) throws IOException {
        //使用poi-tl.jar中的类填充数据
        try(XWPFTemplate template = XWPFTemplate.compile(input) ){
            template.render(data).writeAndClose(output);
        }catch (Exception ex){
            throw ex;
        }
    }

    /**
     * word转换为pdf
     * @param wordInput word文件输入流
     * @param pdfOutput pdf文件输出流
     * @throws Exception
     */
    public static void wordToPdf(InputStream wordInput, OutputStream pdfOutput) throws Exception {
        //通过aspose-words.jar中的类转换文件
        Document wordDoc = new Document(wordInput);
        if(SystemUtils.isLinux()){
            //设置汉字字体,否则转换后的文档汉字会乱码。
            FontSettings settings = new FontSettings();
            settings.setFontsFolder("/mydata/fonts",false);
            wordDoc.setFontSettings(settings);
        }
        PdfSaveOptions pso = new PdfSaveOptions();
        wordDoc.save(pdfOutput, pso);
    }
}

在word转换为pdf方法中,必须设置中文字体所在的目录。有两种方法:文章来源地址https://www.toymoban.com/news/detail-487308.html

  1. 把字体防止在目录/usr/share/fonts/下面,需要使用命令fontconfig 和mkfontscale 配置系统字体。
  2. 直接把字体复制到指定目录下,并在代码中指定此目录即可,如上面的示例。字体文件可以从Windows操作系统中复制过去。Windows字体目录为:C:\Windows\Fonts

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

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

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

相关文章

  • QT技术实现Word模板编辑及转PDF

    本文详细介绍了如何使用QT技术进行Word模板的编辑,包括添加书签、替换文本和图片等操作,以及如何将Word文档转换为PDF格式。

    2024年02月12日
    浏览(34)
  • Uipath 读取Word模板实现录用通知书PDF批量生成

    本文主要讲解如何使用Uipath 读取Excel 面试人员信息表,读取Word模板,再批量生成录用通知书PDF文件,该自动化大大提高了HR 的工作效率。 注:本方案实现采用无代码模式,通过拖拉控件实现。 本示例采用简单的序列流程图实现,如下图: 注:实际开发采用企业级开发框架

    2024年02月21日
    浏览(27)
  • Excel表格数据填充到word模板中

            这个需求源于要批量生成模板一样的word文档。当然可以直接使用word的邮件合并功能,点菜单就可以实现,示例代码如下:        要使用这些代码,需要引用2个库microsoft word,microsoft office,如果使用到客体界面的话,还要引用microsoft Forms。本代码可以同时利用两个

    2024年02月15日
    浏览(30)
  • 【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

    这篇文章,主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 (1)自定义PDTextStripper类 (2)创建Key

    2024年02月16日
    浏览(49)
  • poi-tl设置图片(通过word模板替换关键字,然后转pdf文件并下载)

    选中图片右击  选择设置图片格式   例如word模板   maven依赖   读取  代码

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

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

    2024年02月08日
    浏览(38)
  • 【Java】制作pdf模板使用后端程序填充字段生成pdf或者图片

    自行下载安装; 打开pdf文件,表单-添加或编辑域 添加文本域,调整大小,可以编辑域的名字,默认fill_1这种名字。域鼠标右键-属性,可以调整字体大小等样式,编辑好还可以锁定; 编辑好保存,这个pdf文件就可以当模板使用了; 防止中文乱码,需要在网上下载字体ttf文件

    2024年01月21日
    浏览(37)
  • 实现Word转Pdf文件

    在项目中需要以Word文件为模板,填充指定数据,并转换为Pdf文件。可以分为两步,第一步使用POI进行文本替换,第二步把替换后的Word转换为pdf文件。 当前遇到的问题是网上所有的转换工具依赖的包都过大,一般要30M以上。而自己通过Poi实现转换的成本又太高,且转换效果不

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

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

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

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

    2024年02月11日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包