使用itextpdf5.x将网页转为PDF,并添页眉页脚页码

news2024/11/15 12:04:22

一、用到的Maven依赖

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.3</version>
        </dependency>

        <!-- 中文字体支持 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13</version>
        </dependency>

二、直接上代码

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.tool.xml.XMLWorkerHelper;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class HtmlToPdfWithHeadersFooters {

    public static void main(String[] args) {
       // String htmlFile = "D:\\opt\\upFiles\\temp\\模板测试3页面_17243805153171.html";
         String htmlFile = "D:\\opt\\upFiles\\temp\\模板测试3页面_17243757480651.html";
       // String htmlFile = "D:\\opt\\upFiles\\temp\\模板测试3页面_17242121319999.html";
        String pdfFile = "D:\\htmltopdftest\\pdf0001607.pdf";

        html2pdf(htmlFile, pdfFile);
    }

    public static void html2pdf(String htmlFile, String pdfFile) {
        try (FileOutputStream fos = new FileOutputStream(pdfFile)) {
            Document document = new Document(PageSize.A4, 36, 36, 36, 36); // 设置页边距
            PdfWriter writer = PdfWriter.getInstance(document, fos);
            document.open();

            // 注册页眉和页脚事件处理器
            writer.setPageEvent(new HeadersFootersHandler());
            InputStream inputStream = new FileInputStream(htmlFile);
            // 将 HTML 转换成 PDF
            XMLWorkerHelper.getInstance().parseXHtml(writer, document, inputStream);
            document.close();
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
    }

    static class HeadersFootersHandler extends PdfPageEventHelper {

        BaseFont baseFont;
        Font font ;

        {
            try {
                baseFont = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
                font = new Font(baseFont, 8, Font.NORMAL);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            PdfPTable table = new PdfPTable(1);
            table.setTotalWidth(document.right() - document.left());
            float pageWidth = document.right() - document.left();
            pageWidth = (pageWidth - 36)/2;
            table.setWidthPercentage(99);
            table.getDefaultCell().setBorder(2);
            table.getDefaultCell().setPadding(3);

            table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);

            // 添加页眉
            PdfPCell headerCell = new PdfPCell(new Paragraph("页眉:中国 ", font));
            headerCell.setBorder(0);
            headerCell.setPaddingBottom(0);
            table.addCell(headerCell);

            PdfPCell footerCell = new PdfPCell(new Paragraph("页码 " + writer.getPageNumber(), font));
            footerCell.setBorder(0);
            footerCell.setPaddingTop(10);
            table.addCell(footerCell);

            // 将页眉页脚添加到文档中
            float yHeader = document.top() + 20; // 页眉距离顶部的距离
            table.writeSelectedRows(0, -1, pageWidth, yHeader, writer.getDirectContent());
        }


    }
}

三、测试用的HTML文件

注意,HTML文件的内容必须严格遵守XHTML规范,否则会抛异常。

不知道怎么上传附件,我直接粘贴HTML的代码

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta><style type="text/css">body { font-family:arial,helvetica,sans-serif; font-size:16px }p {margin:3px; line-height:24px;} .mce-item-table[border="0"],.mce-item-table[border="0"] td{border: 0px dashed #bbb;}</style></head><body><html>
 <head></head>
 <body>
  <p><span id="billNum" class="mceNonEditable blmField" contenteditable="false">xxx</span></p>
  <p><span id="billBuildTime" class="mceNonEditable blmField" contenteditable="false">xxx</span></p>
  <p><span style="font-size: 48px; color: rgb(45, 194, 107);" data-mce-style="font-size: 48px; color: #2dc26b;">today&nbsp; &nbsp;is a good day!</span></p>
  <p><span style="font-size: 48px; color: rgb(45, 194, 107);" data-mce-style="font-size: 48px; color: #2dc26b;"><img src="http://192.168.105.151:7800/bsblm/sys/common/static/jeditor/icon_1724213898321.jpg" alt="" data-mce-src="http://192.168.105.151:7800/bsblm/sys/common/static/jeditor/icon_1724213898321.jpg" width="235" height="235"></img><br data-mce-bogus="1"></br></span></p>
  <p class="blm_template_break" style="page-break-before: always; margin: 0; padding: 0; text-align: center; color: #666;" contenteditable="false" data-mce-style="page-break-before: always; margin: 0; padding: 0; text-align: center; color: #666;"></p>
  <p>&nbsp;<span id="billStageType" class="mceNonEditable blmField" contenteditable="false">xxx</span></p>
  <p><span id="billSendTime" class="mceNonEditable blmField" contenteditable="false">xxx</span></p>
  <p><span style="font-size: 36px; font-family: SimSun, serif;" data-mce-style="font-size: 36px; font-family: SimSun, serif;"><strong><span style="color: rgb(230, 126, 35);" data-mce-style="color: #e67e23;">Happy BirthDay!</span></strong></span></p>
  <table style="border-collapse: collapse; width: 100%;" border="1">
   <colgroup>
    <col style="width: 20.0255%;"></col>
    <col style="width: 20.0255%;"></col>
    <col style="width: 20.0255%;"></col>
    <col style="width: 20.0255%;"></col>
    <col style="width: 20.0255%;"></col>
   </colgroup>
   <tbody>
    <tr>
     <td><span style="color: rgb(224, 62, 45);" data-mce-style="color: #e03e2d;">great!</span></td>
     <td><br></br></td>
     <td><br></br></td>
     <td><br></br></td>
     <td><br></br></td>
    </tr>
    <tr>
     <td><br></br></td>
     <td><span style="font-size: 24px; color: rgb(230, 126, 35);" data-mce-style="font-size: 24px; color: #e67e23;"><strong>good!</strong></span></td>
     <td><br></br></td>
     <td><br></br></td>
     <td><br></br></td>
    </tr>
    <tr>
     <td><br></br></td>
     <td><br></br></td>
     <td><br></br></td>
     <td><span style="font-size: 36px; color: rgb(224, 62, 45);" data-mce-style="font-size: 36px; color: #e03e2d;"><strong>Yes!</strong></span></td>
     <td><br></br></td>
    </tr>
   </tbody>
  </table>
  <p class="blm_template_break" style="page-break-before: always; margin: 0; padding: 0; text-align: center; color: #666;" contenteditable="false" data-mce-style="page-break-before: always; margin: 0; padding: 0; text-align: center; color: #666;"></p>
  <p>&nbsp;<span id="payForReason" class="mceNonEditable blmField" contenteditable="false">xxx</span></p>
  <p><span id="payForReason" class="mceNonEditable blmField" contenteditable="false">xxx</span></p>
  <p><span style="font-size: 36px; color: rgb(224, 62, 45);" data-mce-style="font-size: 36px; color: #e03e2d;">Thank you!</span></p>
  <p><br data-mce-bogus="1"></br></p>
  <p><br data-mce-bogus="1"></br></p>
  <p><br data-mce-bogus="1"></br></p>
 </body>
</html></body></html>

四、网页转PDF的效果

结果为三张PDF,不知道怎么上传附件,我直接上截图看看效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gameplay Ability System(通过表配置不同等级的伤害)

一、创建配置表 1、创建Excel表格&#xff0c;输入数据&#xff0c;表示1级的普攻伤害为5&#xff1b;2级的普攻伤害为15。 2、另存为.csv格式文件。 3、当然也可以通过记事本直接写成下图这样。 二、导入UE5处理 1、导入为CurveTable的稳定格式&#xff0c;命名为CT_MeleeA…

探索厦门凯酷全科技有限公司抖音小店的实用魅力

在数字化浪潮汹涌的今天&#xff0c;电商平台如雨后春笋般涌现&#xff0c;而抖音作为短视频与电商融合的佼佼者&#xff0c;更是为众多企业开辟了新的营销与销售渠道。厦门凯酷全科技有限公司&#xff0c;作为这股潮流中的一股清流&#xff0c;凭借其独特的产品定位与创新的营…

【网络】传输层协议——UDP协议

1.传输层协议 首先我们要明白&#xff0c;进入传输层&#xff0c;也就进入了操作系统内核。 因为应用层下面这几个就是操作系统内部 我们学传输层及其以下几层&#xff0c;也就是在学操作系统内核的网络模块。 1.1.传输层协议 传输层能够实现端到端的连接。比如说我们用QQ与…

嵌入式开发实训室解决方案

随着物联网、智能制造、汽车电子等技术的飞速发展&#xff0c;嵌入式系统作为这些领域的核心技术之一&#xff0c;其重要性日益凸显。为了满足职业院对嵌入式开发人才的需求&#xff0c;构建一个高效、全面的嵌入式开发实训室显得尤为重要。本文旨在提出一套综合性的嵌入式开发…

监控软件可以看到员工在干什么吗?逆天功能!

企业对于工作效率和信息安全重视程度的不断提升&#xff0c;监控软件作为管理工具之一&#xff0c;逐渐在各大公司中普及开来。 这些软件旨在通过监控员工电脑活动、网络通信、甚至物理环境等&#xff0c;来帮助管理者更好地了解员工工作状态&#xff0c;防止数据泄露&#xf…

JVM系列--运行时数据区

Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 1 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也叫PC寄存器&#xff0c;每个线程会通过程序计数器记录当前要执行的…

基于单片机的教室人数自动统计系统设计

摘 要&#xff1a; 以单片机 AT89C51 为核心&#xff0c;采用光电感应器和单片机系统的技术测量控制装置&#xff0c;同时利用红外装置采集信息&#xff0c;并将信号进行放大形成对应的高电平信号通过LED 显示反馈人数&#xff0c;从而达到管理的目的。文中对基于单片机的教室人…

【SQL】指定日期的产品价格

目录 题目 分析 代码 题目 产品数据表: Products ------------------------ | Column Name | Type | ------------------------ | product_id | int | | new_price | int | | change_date | date | ------------------------ (product_id, chang…

基于cubemx的STM32的freertos的串口通信

1、任务描述 使用freertos系统实现电脑调试助手和正点原子开发板STM32F103ZET6的串口通信。 2、cubemx设置 3、程序代码 &#xff08;1&#xff09;添加usart1.c #include "usart1.h"#include "usart.h"/**********重定义函数**********/struct __FILE …

Chat App 项目之解析(八)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读340次&#xff0c;点赞7次&#xff0c;收藏3次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了…

ArcGIS高/低聚类(Getis-Ord General G)——探究人口空间格局的20年变迁

先了解什么是高/低聚类&#xff1f; 高/低聚类 (Getis-Ord General G) 统计是一种用于检测空间数据中是否存在高值或低值聚类的统计方法&#xff0c;这种方法可以帮助我们理解数据点在空间上是否呈现某种聚集模式。 白话版&#xff1a;一句话就是判断数据在空间上有没有聚集。…

芯片后端之 PT 使用 report_timing 产生报告 之 -include_hierarchical_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max 我们使用命令 report_timing 报出的如上路…

基于Java语言的能源管理系统-水-电-气-热-油-数据采集系统源码

基于Java语言的能源管理系统-水电气热油数据采集系统源码 介绍 能源管理系统能源管理能源管理平台能源管理系统&#xff08;EMS&#xff09;能源监测能源管控能源系统能源监控能源预测&#xff0c;适用于高能耗企业能源企业 软件架构 软件功能 数据大屏 使用说明 参与贡献 …

【计算机三级-数据库技术】操作题大题(第八套)

第46题 &#xff08;1&#xff09; 1 (2) create table ( a1 int, a6 int, a10 int, Primary Key(a1, a6), Constraint fk_PerOrders Foreign Key (a1) References T1(a1), Constraint fk_PerOrders Foreign Key (a6) References T3(a6) ) 第47题 答案&#xff1a; [1]Pro…

Java语言程序设计——篇十七(3)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

聊聊最近大火的《黑神话·悟空》这款游戏

《黑神话悟空》游戏突然成为是一款备受瞩目的游戏&#xff0c;以下是对该游戏的详细介绍&#xff1a; 一、游戏基本信息 开发团队&#xff1a;游戏科学 游戏类型&#xff1a;动作角色扮演游戏&#xff08;ARPG&#xff09;背景设定&#xff1a;以中国四大名著之一《西游记》…

我的创作纪念日——128天

目录 机缘 收获 日常 成就 憧憬 机缘 作为一名计算机专业的大学生&#xff0c;我最初接触编程时&#xff0c;像大多数新手一样&#xff0c;充满了好奇与困惑。那时的我&#xff0c;常常在网上寻找答案&#xff0c;渴望能够找到一条通往编程世界的捷径。在浏览CSDN的过程中…

linux 系统备份与恢复方法及解决方案

&#x1f600;前言 本篇博文是关于 linux 系统备份与恢复&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x…

C语言 | Leetcode C语言题解之第367题有效的完全平方数

题目&#xff1a; 题解&#xff1a; bool isPerfectSquare(int num) {long long left0;long long rightnum;while(left<right){long long mid(leftright)/2;long long ansmid*mid;if(ans<num){leftmid1;}else if(ans>num){rightmid-1;}else{return true;}}return…

数据结构——冒泡、选择、插入和希尔排序

目录 引言 冒泡排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 选择排序 1.算法思想 2.算法步骤 3.代码实现 (1)优化前 (2)优化后 4.复杂度分析 插入排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 希尔排序 1.算法思想 2.算法步骤 3.代码实…