java中html网页转化成pdf(itext)

2023-11-14

Java 实现 HTML 页面转 PDF 解决方案

一、添加 maven 依赖

<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itext-asian</artifactId>
  <version>5.2.0</version>
</dependency>
<dependency>
  <groupId>org.xhtmlrenderer</groupId>
  <artifactId>core-renderer</artifactId>
  <version>R8</version>
</dependency>

二、java代码实现

@ResponseBody
    @RequestMapping(value = "/saveNotification.do",method=RequestMethod.POST)
    public void saveNotification(HttpServletRequest request, HttpServletResponse response){
        JSONObject resultsObj = new JSONObject();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String date = sdf.format(new Date());
        String targetPath = request.getServletContext().getRealPath(File.separator);   //项目根路径
        String htmlFile = targetPath + "/html/custormer_notification.html";    //目标html网页的地址
        String pdfPath = targetPath + "/pdf/";//pdf储存位置
        String pdfFile = pdfPath + date + ".pdf";//储存的pdf文件路径
        File filePath = new File(pdfPath);
        //判断此路径文件夹是否存在
        if (!filePath.exists()) {
            //如果不存在 ,则创建文件夹/目录
            filePath.mkdirs();
        }
        /*创建 内存中的File对象*/
        File file = new File(pdfFile);
        //如果有重名文件存在则删除文件,对象对应的硬盘必须删不能存在,如果已经存在 则会抛出IOException异常
        if (file.exists()) {
            file.delete();
        }
        try {
            OutputStream os = null;
            ITextRenderer renderer = new ITextRenderer();
            /*第一种*/
//            renderer.setDocument(new File(htmlFile).toURI().toString());
            /*第二种*/
            htmlFile = htmlFile.replace("\\", "/");
            File html_file = new File(htmlFile);
            FileInputStream inputStream = new FileInputStream(html_file);
            //流转换成字符串
            StringBuffer out = new StringBuffer();
            byte[] b = new byte[4096];
            for (int n; (n = inputStream.read(b)) != -1;) {
                out.append(new String(b, 0, n));
            }
            String html = out.toString();
            renderer.setDocumentFromString(html);
            //解决中文支持
            ITextFontResolver fontResolver = renderer.getFontResolver();
            if("linux".equals(getCurrentOperatingSystem())){
                fontResolver.addFont("/usr/share/fonts/chiness/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            }else{
                fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
            os = new FileOutputStream(pdfFile);
            renderer.layout();
            renderer.createPDF(os);
            renderer.finishPDF();
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

public String getCurrentOperatingSystem(){
    String os = System.getProperty("os.name").toLowerCase();
    System.out.println("---------当前操作系统是-----------" + os);
    return os;
}

三、注意事项:

1、输入的 HTML 页面必须是标准的 XHTML 页面。页面的顶上必须是这样的格式:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

2、语法必须是标准的 HTML 语法:所有标签都必须闭合

3、CSS 中必须指定字体,然后在 Java 代码中设置相应的字体

body { font-family: SimSun;}//此字体对应Java代码中的simsun.ttc,如果需要其他字体,则需要查询相关资料去
/*设定纸张大小  A4纸*/
@page{ size: a4; }
table标签添加 style="table-layout:fixed;word-break:break-strict;"

四、本人踩过的坑:

1、建议自己先编写一个简单的标准html网页进行测试,因为复杂的网页中有的css样式不支持此方法

2、在项目实际应用中会遇到pdf文档右边中文显示不全的问题,原因是itext源码问题,老外做的东西,没有考虑到中文问题。默认提供的包里,中文不会换行,有人修改了源代码,解决了这个问题。下载地址: 【https://www.iteye.com/topic/509417?page=6#1279762】  需要注意的是,在官网提供的jar包里,有两个包,一个是core-renderer.jar,另一个是core-renderer-minimal.jar。引用时,只需引用前者就行。

五、解决中文换行问题:

1、在resources目录下新建lib文件夹,将上面下载的jar包放在此文件夹下

2、在pom.xml文件中引入此本地jar包

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>core-renderer</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/core-renderer.jar</systemPath>
</dependency>
<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.0.8</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/itext-2.0.8.jar</systemPath>
</dependency>

3、添加maven打包资源位置

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
                <compilerArguments>
                    <extdirs>${project.basedir}/src/main/resources/lib</extdirs>
                </compilerArguments>
            </configuration>
        </plugin>
    </plugins>
</build>

五、解决pdf文件在windows系统和Linux系统在文字显示问题:

windows系统下,此处c:/Windows/Fonts/simsun.ttc默认自带字体,但是linux系统下,此处/usr/share/fonts/chiness/simsun.ttc是不存在字体样式的,而我们的项目需要部署在linux服务器上,所有我的解决办法是:

将windows系统中的simsun.ttc文件copy在项目中,如图所示:

然后在代码中引用项目中的字体路径,如图:

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中html网页转化成pdf(itext) 的相关文章

  • 从 PDF 中提取不可选择的内容

    我正在使用 Apache PDFBox 从 PDF 文件中提取页面 但找不到提取不可选择的内容 文本或图像 的方法 从 PDF 文件中选择内容是没有问题的 请注意 相关 PDF 在复制内容方面没有任何限制 至少从我在文件的 文档限制摘要 中
  • Java Arraylist of object 按日期从数组列表中删除元素

    这是我的数组列表 ArrayList
  • 如何以编程方式检查应用程序是否在调试模式下运行?

    我必须在应用程序中的某个位置确定我的应用程序是在调试模式还是实时模式下运行 是否有任何函数或代码可用于检查 在开 关两种情况下都会返回 true false 如果是这样 请帮助我 提前致谢 从问题中尚不清楚调试模式是否指的是 应用程序是否可
  • 使用SimpleMailMessage类发送邮件时如何使java字符串着色

    我正在使用 java 中的 SimpleMailMessage 类发送邮件 我将 spring 与 hibernate 结合使用 我想在发送邮件时将特定字符串设置为彩色 Code String emailBody Dear username
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • 模拟框架对我有什么作用?

    我听说有些我无法交谈的人是 jmock 的忠实粉丝 我已经做了以测试为中心的开发多年 所以我浏览了网站并查看了一些文档 但仍然不知道它有什么好处 我对春天也有同样的问题 如果您已经了解它是什么 他们的文档会很好地解释它 所以我并不认为 jm
  • 用户“root”@“localhost”的访问被拒绝

    我正在尝试从数据库中获取记录 但我面临这个访问被拒绝的问题 我尝试了 Stack Overflow 上提到的其他解决方案 例如向用户授予权限 但没有任何效果 访问数据库的代码 public void service HttpServletR
  • Android - Java - 发送 facebook 聊天消息的意图(facebook 禁用 xmpp)

    Facebook 已弃用 xmpp API 有没有办法打开意图 或将数据传递到fb 以在Android设备上发送聊天消息 设备上安装的 Facebook 和 Messenger 应用 谢谢 您需要将 uri 传递给意图 这里10000572
  • 如何用java对jpg进行像素化?

    我正在尝试使用 Java 6 对 JPEG 进行像素化 但运气不佳 它需要使用 Java 而不是像 Photoshop 这样的图像处理程序 并且它需要看起来像老派 像这样 有谁能够帮助我 使用java awt image javadoc h
  • java.sql.SQLException: - ORA-01000: 超出最大打开游标数

    我收到 ORA 01000 SQL 异常 所以我有一些与之相关的疑问 最大打开游标是否与 JDBC 连接数完全相关 或者它们也与我们为单个连接创建的语句和结果集对象相关吗 我们正在使用连接池 有没有办法配置数据库中语句 结果集对象的数量 如
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 用java解密AES加密文件

    我有一个使用 AES 使用 java 应用程序加密的文件 我还有一个加密的密钥文件 但我不明白如何使用密钥来解密文件 大多数教程和示例都会在一个地方创建临时随机密钥 加密文件和解密 所以 问题是如何指定解密时必须使用的密钥 EDIT 我发现
  • 如何在 Eclipse 中使用 Hibernate Tools 生成 DAO?

    我在用着 Eclipse Java EE IDE Web 开发人员 版本 Indigo 发布 使用 hibernate 工具 我对 Eclipse 中的 hibernate 很陌生 所以我学习如何配置 hibernate 并使用注释生成 P
  • 如何迭代SparseArray?

    有没有办法迭代 Java SparseArray 适用于 Android 我用了sparsearray通过索引轻松获取值 我找不到 看来我找到了解决方案 我没有正确注意到keyAt index 功能 所以我会这样做 for int i 0
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • 当相应的 JTextfield 为空时,如何填充 JTable 中的所有项目

    我正在 Java 项目中设计一个高级搜索选项sqlite在 NetBeans 中 有5种不同JTextfields和 5 列 我想填充JTable具有相应的匹配标准 如果一个JTextfield为空 那么它应该选择该列的所有项目 我使用的查
  • java.lang.NoClassDefFoundError:com.google.ads.AdView

    我正在尝试将 admob 广告合并到我的应用程序中 到目前为止我已经添加了以下代码 在我的应用程序主要活动的 onCreate 方法中 adView new AdView this AdSize BANNER my code number
  • PSQLException:错误:关系“TABLE_NAME”不存在

    我正在尝试在 PostgreSQL 8 4 2 DB 上运行休眠 每当我尝试运行简单的java代码时 例如 List
  • gwt - 在 RPC 调用中使用 List

    我有一个 RPC 服务 方法如下 public List
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件

随机推荐

  • Android打32/64位兼容包,ABI Filter的使用及其原理

    问题 针对现在VIVO oppo应用平台 打包上传时需要打兼容包的问题 这里就需要注意设置ABI Filter的问题 通过各种百度和千度后 发现唯一一个有问题的帖子竟然要收费观看 于是 这里记录一下 如何处理打32 64位兼容包的问题 1
  • 哈希冲突

    在保存元素不是固定范围时 哈希冲突有可能避免吗 不能避免 因为存储的元素范围远远大于数组的长度 但可以尽可能的减少冲突 那么如何减少 数组大小用素数 Java中不太用 当 index hashValue arr length 时 hash函
  • C语言中的&&符号用法

    在用KEIL5进行编程时 发现这些问题 if RX buf 5 FUNCSTOP RX buf 5 0x01 是逻辑运算符 表示逻辑与 是位运算符 表示按位与 1 2 0 条件判断为假 1 2 1 此时条件判断为真
  • Binary Search Tree

    二叉查找树 Binary Search Tree 又 二叉搜索树 二叉排序树 它或者是一棵空树 或者是具有下列性质的二叉树 a 若它的左子树不空 则左子树上所有结点的值均小于它的根结点的值 b 若它的右子树不空 则右子树上所有结点的值均大于
  • 计算机速度快的秘诀二进制,比二进制计算机速度至少快1到3.6倍的二进制小孔倒像制计算机.pdf...

    该文章介绍了一种 二进制小孔倒像制 计算机 其理论运算速度比普通二进制计算机快1 3 6倍 该计算机从原理来看 较接近于前苏联研制的三进制计算机 Generated by Foxit PDF Creator Foxit Software F
  • PHP头条爬虫,今日头条爬虫分析-爬取用户发的所有内容

    今日头条的用户页数据爬取跟频道页的数据爬取大部分很类似 但稍微有一点不一样 就是用户主页的接口signature有点不一样 需要将当前爬取的用户id和分页时间戳一起作为入参传递进去才能获取到真正的signature 除了这一点差异外其他的都
  • nova mitaka ReleaseNotes

    nova mitaka ReleaseNotes nova mitaka ReleaseNotes 概要 新特性 升级注意点 废弃列表主要针对配置项 概要 API的微版本号增加到了v2 25 新增数据库nova api 新增nova man
  • 云盘下载利器proxyee-down

    前几年360百度腾讯等大佬把用户都养成了使用云盘下载的习惯 但是后期都改为收费服务 免费的基本也都限速了 弄得大家分享下载一些资源很麻烦 一个VS神马动辄几个GB 百度100k的龟速 好吧 感谢伟大的github 感谢monkeyWie 为
  • 关于副业怎么发快手引流,教你如何把快手变成自己的副业

    快手上面的赚钱玩法也分很多种 这里蜘蛛火讲几种暴利的玩法 分别是自己拍短视频 免费送 自己直播 和打板引流 自己拍短视频 如果确定是自己拍 首先要定位一个想切入的领域 比如水果电商 很多的农民平时在家乡种的果子都很不错 但是苦于没有办法宣传
  • 数字图像处理之浮雕效果——基于傅里叶变换的频域操作

    问题简述 这是信号与系统课程的一个课后作业 要求运用傅里叶变换的理论知识 在matlab中对数字图像进行浮雕效果的处理 浮雕效果和图像边缘的检测差不多 学习过深度学习的同学可能会想到使用核对图像进行卷积操作 吴恩达老师在DeepLearni
  • Python之字典一个key对应多个value

    python的字典是一个key对应一个value 如果想要一个key对应多个value 那么可以用以下几种方法来实现 方法一 创建key对应列表 name list Mary Jack age list 10 12 stu dict nam
  • C++中 语句 #ifndef …详解

    C 中 语句 ifndef define endif 其作用是防止头文件的重复包含和编译 如果被定义则返回假 如果没有被定义则返回真 需要注意的是 ifndef起到的效果是防止一个源文件两次包含同一个头文件 而不是防止两个源文件包含同一个头
  • spark streaming job监控

    定时检查spark streaming job 运行状态保存到mysql中 1 python3保存数据到mysql vi rlt log job dinc py import pymysql import logging import pa
  • ansys选择一个面上所有节点_利用APDL命令选择椭球面上的节点

    微信公众号 CAE技术分享 问题的背景 笔者在利用Workbench的二次开发功能实现某模型的参数化建模 分网 加载时 由于workbench开发接口的限制 需要结合DM模块 MAPDL模块 Mesh模块 FEM模块以及Mechnical模
  • ELK日志分析系统原理与部署

    文章目录 一 ELK日志分析系统简介 1 1ELK日志分析系统组成 1 2日志处理步骤 二 三款软件各自概念 2 1Elasticsearch介绍 2 2Logstash介绍 2 3Kibana介绍 三 ELK日志分析系统部署 3 1实验环
  • Leetcode刷题之回文链表和交换链表中的结点

    竭力履行你的义务 你应该就会知道 你到底有多大的价值 列夫 托尔斯泰 目录 一 回文链表 1 快慢指针 2 把值存入数组中 然后使用双指针 二 交换链表中的结点 1 快慢指针 一 回文链表 给你一个单链表的头节点 head 请你判断该链表是
  • Spring 框架中都用到了哪些设计模式

    1 工厂模式 BeanFactory就是简单工厂模式的体现 用来创建对象的实例 2 单例模式 Bean默认为单例模式 3 代理模式 Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术 4 模板方法 用来解决代码重复的问
  • Python:Docx文档模板创建使用

    博文作者 wangzirui32 喜欢的可以 点赞 收藏 关注哦 本文首发于CSDN 未经许可禁止转载 Hello 大家好 我是wangzirui32 今天我们来学习Docx文档模板创建与使用 开始学习吧 1 Docxtpl Docxtpl
  • 服务器加cpu显示broadwell,英特尔新的Broadwell Xeon服务器CPU每个插槽可提供多达22个内核...

    英特尔的主流消费类处理器主要是双核和四核处理器 但是服务器CPU的性能要高得多 恰当的例子 基于Broadwell的新型Xeon E5 2600 v4系列中最昂贵的成员具有高达22个内核 运行频率为2 2GHz 而所有这些内核都只能装在一个
  • java中html网页转化成pdf(itext)

    Java 实现 HTML 页面转 PDF 解决方案 一 添加 maven 依赖