Java中将Html转换为PDF的方法和步骤

 更新时间:2023年06月15日 10:44:25   作者:掉头发的王富贵  
这篇文章主要介绍了Java中如何将Html转换为PDF的方法,文中有相关的代码示例和步骤讲解,感兴趣的同学可以参考阅读

Html分两种情况转换为Pdf:

第一种:html的文件

第二钟:html格式的字符串

我们先来讲一下第一种情况: 1.市面上有很多的html转pdf的方法,但是不是受限于中文的限制就是受限于css样式的丢失或者是对html的要求太严格。 所以我在做这个教程的时候找到了一个非常厉害的一个组件首先看一下他的官网: e-iceblue 他有商业版本和免费的版本,商业版本没购买之前是有水印的,但是可以转换10页,免费版本是没有水印的,但是只支持转换前三页。结合教程使用,我们使用他的免费版本,首先第一步导入他的jar包:

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

但是中央仓库是没有这个jar包的,所以我们还需要加一个他的jar包仓库地址:

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

2.第二步我们使用一下方式读取html文件的内容:

public class HtmlToPDFUtil {
 public static void main(String[] args) throws IOException{
        String inputHtml = "C:\\InputHtml.txt";
        //新建Document对象
        Document doc = new Document();
        //添加section
        Section sec = doc.addSection();
        String htmlText = readTextFromFile(inputHtml);
        //添加段落并写入HTML文本
        sec.addParagraph().appendHTML(htmlText);
        //将文档另存为PDF
        doc.saveToFile("C:\\HTMLstringToPDF.pdf", FileFormat.PDF);
        doc.dispose();
    }
 public static String readTextFromFile(String fileName) throws IOException {
        StringBuffer sb = new StringBuffer();
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        String content;
        while ((content = br.readLine()) != null) {
            sb.append(content);
        }
        return sb.toString();
    }
}

这个时候就会在c盘目录下生成InputHtml.txt对应的HTMLstringToPDF.pdf文件 第二种方法,html为文本格式的情况: 1.导入上的jar包之后之间将html的文本内容赋值给htmlTest

 public static void main(String[] args) throws IOException{
        //新建Document对象
        Document doc = new Document();
        //添加section
        Section sec = doc.addSection();
        String htmlText = " <tr>\n" +
                "        <td colspan=\"8\">\n" +
                "          <div class=\"yiban\">\n" +
                "            <span class=\"jiachu\">联系电话:<span>18888888888</span></span>\n" +
                "          </div>\n" +
                "          <div class=\"yiban\">\n" +
                "            <span class=\"jiachu\">送货单号:</span><span>1567894</span>\n" +
                "          </div>\n" +
                "        </td>\n" +
                "      </tr>";
        //添加段落并写入HTML文本
        sec.addParagraph().appendHTML(htmlText);
        //将文档另存为PDF
        doc.saveToFile("C:\\HTMLstringToPDF.pdf", FileFormat.PDF);
        doc.dispose();
    }

这个情况也是一样的

拓展:将生成的pdf文件返回给前端以供下载

需要一下的代码段,直接贴出来供大家参考:

 public static void downloadPdf(String fileName, String path) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = requestAttributes.getResponse();
        response.setContentType("application/force-download");
        try {
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        File file = new File(path);
        InputStream is = null;
        ServletOutputStream os = null;
        try {
            is = new FileInputStream(file);
            os = response.getOutputStream();
            int b;
            while ((b = is.read()) != -1) {
                os.write(b);
            }
        } catch (FileNotFoundException e) {
            ExceptionUtils.logError(e);
        } catch (IOException e) {
            ExceptionUtils.logError(e);
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != is) {
                    is.close();
                }
            } catch (IOException e) {
                ExceptionUtils.logError(e);
            }
        }
    }

这段Java代码演示了如何从本地服务器下载PDF文件并强制用户下载。在此代码中,通过ServletRequestAttributes获取当前请求的HttpServletResponse对象,并设置响应的content-typeContent-Disposition头信息,强制将网页作为附件进行下载保存。

接着,使用 FileInputStream 从指定路径打开该文件,并从响应对象获取输出流 ServletOutputStream,将文件内容通过循环一个字节一个字节读取写入输出流中,最终实现文件的下载。循环的过程中没有直接按块大小读取并写入,可能会对操作系统产生一些额外的负载,但是其功能简单易懂,可以适用于小型文档或者测试用例场景等;如果文件较大,可以改变循环体来调用更高效的I/O操作API实现数据的分块传输,避免内存泄漏。

最后在finally块中关闭输入和输出流,释放资源,防止出现问题可能导致的文件描述符泄露等安全隐患。

需要注意的是,在设定Content-Disposition头信息时有编码转换的处理,确保整个文件名不会受到URL编码而导致乱码问题。

使用该方法:

HtmlToPDFUtil.downloadPdf(fileName,tmplPath+fileName);

这样就会将pdf文件作为response返回给前端,前端做对应的操作就能将文件下载下来。

到此这篇关于Java中将Html转换为PDF的方法和步骤的文章就介绍到这了,更多相关Java Html转换为PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java遍历HashMap简单的方法

    java遍历HashMap简单的方法

    这篇文章主要介绍了java遍历HashMap简单的方法,以实例形式简单分析了采用java遍历HashMap的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • MyBatis update标签详解

    MyBatis update标签详解

    这篇文章主要介绍了MyBatis update标签,使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式,需要的朋友可以参考下
    2023-10-10
  • Java唤醒本地应用的两种方法详解

    Java唤醒本地应用的两种方法详解

    这篇文章主要为大家介绍了Java唤醒本地应用的两种方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • spring-boot-klock-starter V1.1 主体功能重大更新内容介绍

    spring-boot-klock-starter V1.1 主体功能重大更新内容介绍

    这篇文章主要介绍了spring-boot-klock-starter V1.1 主体功能重大更新内容描述,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 简单分析Java的求值策略原理

    简单分析Java的求值策略原理

    在本篇文章里小编给大家整理的是一篇关于简单分析Java的求值策略原理内容,有需要的朋友们可以学习下。
    2021-06-06
  • 微信公众号 网页授权登录及code been used解决详解

    微信公众号 网页授权登录及code been used解决详解

    这篇文章主要介绍了微信公众号 网页授权登录及code been used解决详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java Maven构建工具中mvnd和Gradle谁更快

    Java Maven构建工具中mvnd和Gradle谁更快

    这篇文章主要介绍了Java Maven构建工具中mvnd和Gradle谁更快,mvnd 是 Maven Daemon 的缩写 ,翻译成中文就是 Maven 守护进程,下文更多相关资料,需要的小伙伴可以参考一下
    2022-05-05
  • SpringBoot中的依赖管理详解

    SpringBoot中的依赖管理详解

    这篇文章主要介绍了SpringBoot中的依赖管理详解,传统的Spring框架实现一个Web服务,需要导入各种依赖JAR包,然后编写对应的XML配置文件等,相较而言,Spring Boot显得更加方便、快捷和高效,需要的朋友可以参考下
    2023-08-08
  • SpringBoot统一返回格式的方法详解

    SpringBoot统一返回格式的方法详解

    今天小编主要是和大家分享一个让代码变得更简洁的小技巧:统一返回格式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • Java forEach对原数组的操作过程

    Java forEach对原数组的操作过程

    forEach对于基本数据类型,是直接赋值,对于引用数据类型,是引用地址值,forEach遍历时,是创建的临时变量,引用的数据地址,本文给大家介绍Java forEach对原数组的操作过程,感兴趣的朋友一起看看吧
    2024-02-02

最新评论