HTML页面转pdf_IT-along的博客-程序员秘密_html转pdf

技术标签: 经验分享  html转pdf  java  

HTML页面转pdf

工作时,直接传个HTML页面给我,我人被整懵了,通过学习也是解决了这个问题,记录一下

使用 flying-saucer-pdf 将HTML转成pdf

//传入Html页面的String
pubilc void htmlToPdf(String rs){
    
    //String rs = "";
    //截取掉rs中的js部分,js中&可能导致报错
    rs = rs.replace(rs.substring(rs.indexOf("<script type=\"text/javascript\">"), rs.lastIndexOf("</script>") + 9), "");
    //用uuid作为文件名
    String uuid = UUID.randomUUID().toString().replaceAll("-","");
    //new一个新文件夹
    localPath = "D:/along";
    File fnewpath = new File(localPath);
    //判断文件夹是否存在
    if (!fnewpath.exists()) {
    
        fnewpath.mkdirs();
    }
    //在文件夹下建一个HTML文件
    String path = localPath + File.separator + uuid + ".html";
    File fileHtml = new File(path);
    //判断HTML文件是否存在,不存在就新建HTML文件
    if (!fileHtml.exists()) {
    
        fileHtml.createNewFile();
    }
    //用字节流将rs写入HTML文件中
    FileUtil.writeFile(rs, path, SwitchConstant.CHARSET_UTF8);
    
    //是要用HTML文件转成pdf的同学,可以从这开始,自己看着修改
    //创建pdf文件
    String destPath = localPath + File.separator + uuid + ".pdf";
    ITextRenderer renderer = new ITextRenderer();
    OutputStream os = new FileOutputStream(destPath);
    //用文件写入
    renderer.setDocument(fileHtml);
    //下面这个方法是直接将HTML页面的String传进去就好,就不需要传教HTML文件了
    //renderer.setDocumentFromString(rs);
    ITextFontResolver resolver = renderer.getFontResolver();
    //添加字体,解决中文不显示的问题
    //将msyh.ttc文件放在resources/fonts/msyh.ttc
    ClassPathResource classPathResource = new ClassPathResource("fonts/msyh.ttc");
    //获取字体文件所在路径
    String resourcesDir = classPathResource.getPath();
    //添加字体,解决中文不显示的问题 注:HTML中什么字体这里就要设置什么字体
    resolver.addFont(resourcesDir, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    renderer.layout();
    //复制到pdf
    renderer.createPDF(os);
    os.close();
}

public class FileUtil {
    
    /**
	 * 写文件
	 *
	 * @param fileContent 文件内容
	 * @param fileName    文件生成路径(包含文件名)
	 * @param encoding    编码
	 */
	public static void writeFile(String fileContent, String fileName, String encoding) {
    
		try {
    
			FileOutputStream fos = new FileOutputStream(fileName);
			fos.write(fileContent.getBytes(encoding));
			fos.flush();
			fos.close();
		} catch (Exception e) {
    
			e.printStackTrace();
		}
	}
}

需要导入flying-saucer-pdf这个包

<!-- flying-saucer-pdf 将HTML转成pdf需要的包 -->
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf</artifactId>
    <version>9.1.18</version>
</dependency>

注意:这时候生成的pdf后面会有一个空白页

这个原因我也是看了大佬的这篇博客才知道的,然后就用了他的方法解决了这个问题,十分感谢

(53条消息) 浏览器打印 HTML 页面时,底部出现 空白页 的解决办法(原因是body元素自带8px 的margin外边距!!!)_倒吃甘蔗的博客-程序员秘密_浏览器打印页面空白

(53条消息) java 用PDFBox 删除 PDF文件中的一页 ,空白页啥的,此处删除最后一页为例 spring boot_倒吃甘蔗的博客-程序员秘密_java pdf删除最后一页

//去除pdf最后一页 传入文件路径文件名
private void cutPdf(String pdfPath) {
    
    File file = new File(pdfPath);
    PDDocument document = new PDDocument();
    try {
    
        document = PDDocument.load(file);
    } catch (Exception e) {
    
        e.printStackTrace();
    }
    //获取当前文件的页数
    int noOfPages = document.getNumberOfPages();
    System.out.println(noOfPages);
    //去除文件的最后一页
    document.removePage(noOfPages - 1);
    try {
    
        document.save(pdfPath);
        document.close();
    } catch (Exception e) {
    
        e.printStackTrace();
    }
}

需要导入pdfbox-app包

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox-app</artifactId>
    <version>1.8.10</version>
</dependency>

感谢阅读点个赞吧!!!

    //下面这个方法是直接将HTML页面的String传进去就好,就不需要传教HTML文件了
    renderer.setDocumentFromString(rs);

注:想要透彻学习一个类的用法,建议点进去多看看它的方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41116908/article/details/122946547

智能推荐

【爱心表白-----使用HTML+CSS+JS实现(效果+源代码)】_追光者♂的博客-程序员秘密_css3表白

效果可以随着鼠标的移动,来改变转动方向哦!同时每次刷新,也会更新爱心的颜色~~源代码index.html&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;head&gt;&lt;title&gt;three.js canvas - particles with shapes&lt;/title&gt;&lt;meta charset="utf-8"&gt;&lt;meta name="viewport" content="width=devic

Java GZIPOutputStream流压缩文件_3075763007的博客-程序员秘密

不多说,直接上代码public static void main(String[] args) throws Exception{ //压缩文件 File src = new File(&quot;e:/xx/aa.txt&quot;); File zipFile = new File(&quot;e:/xx/a.zip&quot;); FileOutputStream fos = new FileOu...

全球与中国保健品OEM和ODM市场现状调查及投资规划建议报告2022-2028年_普通网友的博客-程序员秘密

全球与中国保健品OEM和ODM市场现状调查及投资规划建议报告2022-2028年【报告目录】:本文研究全球及中国市场保健品OEM和ODM现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美、欧洲、中国、日本、东南亚和印度等地区的现状及未来发展趋势。2021年全球保健品OEM和ODM市场销售额达到了 亿美元,预计2028年将达到 亿美元,年复合增长率(CAGR)为 %(2022-2028)。地区层面来看,中国市场在过去几年变化较快,2021年市场规模为 百万美元,约占全球的 %...

获取byte的高四位和低四位_我是个杀手也是个浪漫的Hero的博客-程序员秘密

1.public static int getHeight4(byte data){//获取高四位 int height; height = ((data & 0xf0) >> 4); return height;}public static int getLow4(byte data){//获取低四位 int low; low = (data & 0

python cv2图片剪裁_FormatFa的博客-程序员秘密_cv2裁剪图片

import cv2#读取图片#获取宽度和高度height=len(img)width=len(img[0])print(img)img=img[int(height/2):height,0:width]height=len(img)width=len(img[0])print('图片大小%dX%d'%(width,height))#显示图片cv2.imshow('title',img)cv2.w...

理论+实战,一文详解最常使用的10个聚类算法(附代码)_Python数据挖掘的博客-程序员秘密_聚类算法实战

聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每种算法的不同配置。在本教程中,你将发现如何在 python 中安装和使用顶级聚类算法。喜欢记得点赞、关注、收藏。【注】完整版代码、数据、技术交流,文末获取。完成本教程后,你将知道:聚类是在输入数据的特征空间中查找自然组的无监督问题。对于所有数据集,有许多不同的聚类算法和单一的最佳方法。

随便推点

linux dtb在哪个目录,ZedBoard移植嵌入式Linux教程(9,10)——编译设备树dts为dtb,制作根文件系统..._weixin_39934613的博客-程序员秘密

九、编译设备树dts为dtb前面的linux内核源码目录中已经包含了设备树编译器Device Tree Compiler(dtc),在目录arch/arm/boot/dts/目录下。将前面生成的xilinx.dts文件拷贝到ubuntu下,使用如下命令进行编译dtc -I dts -O dtb -o devicetree.dtb xilinx.dts上面Dtc编译器有几个选项和参数:-I是输入文件...

batchsize和数据量设置比例_pytorch如何设置batch-size和num_workers,避免超显存, 并提高实验速度?..._蓝青美玉的博客-程序员秘密

forvalidation_batch_sizeandtest_batch_size, you should pick the largest batch size that your hardware can handle without running out of memory and crashing.Finding this is usually a simple trial and e...

Linux文本撤销修改,5个'chattr'命令使重要文件在Linux中不可更改(不可更改)_古都大同的博客-程序员秘密

chattr命令 (更改属性)是一个命令行Linux工具,用于设置/取消某些属性在Linux系统中的文件,以确保意外删除或重要的文件和文件夹的修改,即使你登录为root用户。在Linux本机文件系统,即ext2,ext3,ext4,btrfs等支持所有的标志,虽然所有的标志将不支持所有非本地FS。即使属性具有chattr命令的集合,也不能删除或修改文件/文件夹,即使一个属性具有完全权限。5 cha...

Android中内容观察者的使用---- ContentObserver类详解 (转)_zolaZhang的博客-程序员秘密

地址:http://blog.csdn.net/qinjuning  前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了     ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对ContentObserver做下总结。           ContentObserver——内容观

西门子博途1200码垛机、立体仓库程序(带注释),程序应用到 变频器、触摸屏、步进电机、工业机器人、视觉相机。_「已注销」的博客-程序员秘密

西门子博途1200码垛机、立体仓库程序(带注释),程序应用到 变频器、触摸屏、步进电机、工业机器人、视觉相机。

多个平台的 Java Launcher 脚本_weixin_45110404的博客-程序员秘密

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)④【Web前端】从HT...

推荐文章

热门文章

相关标签