url转pdf或者html转pdf工具 — iText实现url转pdf

url转pdf或者html转pdf工具 — iText实现url转pdf

参考资料:

https://kb.itextpdf.com/itext/can-i-generate-a-pdf-from-a-url-instead-of-from-a-
http://www.micmiu.com/opensource/expdoc/itext-pdf-demo/
https://blog.51cto.com/u_16237557/7263784

iText:iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。
一种生成PDF报表的Java组件。

iText的安装非常方便,在 http://www.lowagie.com/iText/download.html - downoad 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径在程序中就可以使用iText类库了。

  • 如果需要自己编译iText包,需要用到第三方的jar:bcprov、bcmail 、bctsp.

  • 如果用到中文,需要CJK字体的扩展包:iTextAsian.jar

    默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。通过下面的代码就可以在文档中使用中文了:

    BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT EMBEDDED);
    com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL):
    Paragraph pragraph=new Paragraph("你好",FontChinese);
    

    http://prdownloads.sourceforge.net/itext/iTextAsian.jar

  • 如果用到特殊符号的,需要另一个扩展包:itext-hyph-xml.jar.

  • 上述提到的所有lib包,都包含在它的发布版本里。

用iText生成PDF文档需要5个步骤:

  1. 建立Document()实例

    Document document = new Document();
    

    document构建函数有三个:

    public Document();
    public Document(Rectangle pagesize);public Document(Rectangle pagesize.
    int marginLeft,
    int marginRight,
    int marginTop,
    int marginBottom);
    /*
    构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距
    通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、 11X17、LEDGER、NOTE、BO-B5、ARCH A-ARCH E、FLSA和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144,720);自定义纸张。通过Rectangle方法rotate()可以将页面设置成横向。
    */
    
  2. 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。

    PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF"));
    

    文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存盘成需要的格式,如PDFWriter可以将文档存成PDF文件,HtmlWriter可以将文档存成html文件

  3. 打开文档

    document.open();
    

    打开文档后可以设定文档的标题,作者,关键字,装订方法等…

  4. 向文档中添加内容

    document.add(new Paragraph("Hello World"));
    

    向文档添加的内容都是以对象为单位,如Phrase,Paragraph,Table等。

    文本处理:iText中用文本框(Chunk),短语(Phrase)和段落(paragraph)处理文本。

    Chunk是处理文本的最小单位

  5. 关闭文档

    document.close();
    

通过上面5个步骤就能生成一个Helloworld.PDF,文件内容是“Hello World”

html转pdf

  • 直接把HTML转成单个PDF文件
  • 把HTML内容转成PDF的元素Element,对应已有的PDF文档,可以把转换后的Element追加到document中,生成PDF文件
/*直接转pdf*/
String htmlFile = "html的地址   .../xx.html";
String pdfFile = "输出的pdf的地址   .../xxx.pdf";InputStream htmlFileStream = new FileInputStream(htmlFile);/*中文字体定义*/
//使用BaseFont类创建一个新的字体对象bfCN,这个字体是轻的宋体(STSongStd-Light),它是Unicode的GB2312版本(UniGB-UCS2-H)。
BaseFont bfCN = BaseFont.creatFont("STSongStd-Light", "UniGB-UCS2-H", false);//创建一个新的中文字体对象chFont,字体大小为14,样式为正常,颜色为蓝色。
Font chFont = new Font(bfCN, 12, Font.NORMAL, BaseColor.BLUE);//创建一个新的段落字体对象secFont,字体大小为12,样式为正常,颜色为一种亮白色。
Font secFont = new Font(bfCN, 2, Font.NORMAL, new BaseColor(0, 204, 255));/*构建document实例*/
Document document = new Document();
/*建立书写器wirter与document关联*/
PdfWriter pdfwriter = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));pdfwriter.setViewerPreferences(PdfWriter.HideToolbar);
/*打开文档*/
document.open();
//文档添加内容
//html文件
InputStreamReader isr = new InputStreamReader(htmlFileStream, "UTF-8");
//默认参数转换
XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document, isr);
//关闭文档
document.close();

URL转PDF

  • 如果URL地址内容包含中文字符,需要XML Worker能支持中文字符转换(详见:http://www.micmiu.com/opensource/expdoc/itext-xml-worker-cn/)

  • Java 的HTML解析器,这里选择 :jsoup (官网:http://jsoup.org/),如果是 maven 构建项目的,直接在pom文件中增加jsoup的依赖配置即可:

    <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.7.1</version><type>jar</type><scope>compile</scope>
    </dependency>
    
    - `info[0]`:第一个元素包含博客文章的标题。它从 HTML 元素 `<h2 class="title">` 中提取文本内容。- `info[1]`:第二个元素捕获博客文章的类别。它查找带有 `rel=category tag` 属性的 `<a>` 元素,并提取 `href` 属性,去除特定的 URL 前缀。- `info[2]`:这个元素包含博客文章的日期。它从具有类 `post-info-date` 的 HTML 元素中提取文本内容,使用字符串 "日期" 进行拆分,并保留其后的部分,修剪任何前导或尾随空格。- `info[3]`:最后一个元素表示博客文章的内容。它从具有类 `entry` 的 `<div>` 元素中提取 HTML 内容,可能通过名为 `formatContentTag` 的函数进行格式化。
    /*** 根据URL提前blog的基本信息,返回结果>>:[主题 ,分类,日期,内容]等.** @param blogURL* @return* @throws Exception*/public static String[] extractBlogInfo(String blogURL) throws Exception {String[] info = new String[4];org.jsoup.nodes.Document doc = Jsoup.connect(blogURL).get();org.jsoup.nodes.Element e_title = doc.select("h2.title").first();info[0] = e_title.text();	
    org.jsoup.nodes.Element e_category = doc.select("a[rel=category tag]").first();info[1] = e_category.attr("href").replace("http://www.micmiu.com/", "");org.jsoup.nodes.Element e_date = doc.select("span.post-info-date").first();String dateStr = e_date.text().split("日期")[1].trim();info[2] = dateStr;org.jsoup.nodes.Element entry = doc.select("div.entry").first();info[3] = formatContentTag(entry);return info;
    }/*** 格式化 img标签** @param entry* @return*/
    private static String formatContentTag(org.jsoup.nodes.Element entry) {try {entry.select("div").remove();// 把 <a href="*.jpg" ><img src="*.jpg"/></a> 替换为 <img// src="*.jpg"/>for (org.jsoup.nodes.Element imgEle : entry.select("a[href~=(?i)\\.(png|jpe?g)]")) {imgEle.replaceWith(imgEle.select("img").first());}return entry.html();} catch (Exception e) {return "";}
    }/*** 把String 转为 InputStream** @param content* @return*/
    public static InputStream parse2Stream(String content) {try {ByteArrayInputStream stream = new ByteArrayInputStream(content.getBytes("utf-8"));return stream;} catch (Exception e) {return null;}
    }
    
    /*
    HTML文件转换为PDF
    */
    String bolgURL = ",,,,";
    String pdfFile = "输出的pdf路径";/*中文字体定义*/
    //使用BaseFont类创建一个新的字体对象bfCN,这个字体是轻的宋体(STSongStd-Light),它是Unicode的GB2312版本(UniGB-UCS2-H)。
    BaseFont bfCN = BaseFont.creatFont("STSongStd-Light", "UniGB-UCS2-H", false);//创建一个新的中文字体对象chFont,字体大小为14,样式为正常,颜色为蓝色。
    Font chFont = new Font(bfCN, 12, Font.NORMAL, BaseColor.BLUE);//创建一个新的段落字体对象secFont,字体大小为12,样式为正常,颜色为一种亮白色。
    Font secFont = new Font(bfCN, 2, Font.NORMAL, new BaseColor(0, 204, 255));//创建一个新的文本字体对象textFont,字体大小为12,样式为正常,颜色为黑色。
    Font textFont = new Font(bfCN, 12, Font.NORMAL, BaseColor.BLACK);//创建一个新的PDF文档对象。
    Document document = new Document();//将PDF文档写入指定的文件输出流中。
    PdfWriter pdfwriter = PdfWriter.getInstance(document, new FileOutStream(pdfFile));//设置PDF文件的查看器偏好,隐藏工具栏。
    pdfwriter.setViewerPreferences(PdfWriter.HideToolbar);document.open();Sting[] blogInfo = extractBlogInfo(blogURL);//自定义的函数,提取信息//将HTML代码解析为PDF文档的一部分。
    XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document,parse2Stream(blogInfo[3]));document.close();
    

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

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

相关文章

sensitive-word 敏感词/脏词开源工具-v.0.10.0-脏词分类标签支持

sensitive-word sensitive-word 基于 DFA 算法实现的高性能敏感词工具。 创作目的 实现一款好用敏感词工具。 基于 DFA 算法实现&#xff0c;目前敏感词库内容收录 6W&#xff08;源文件 18W&#xff0c;经过一次删减&#xff09;。 后期将进行持续优化和补充敏感词库&…

几种常用的压力测试工具

1. JMeter 官网: Apache JMeter简介: Apache JMeter 是一个开源软件&#xff0c;主要用于性能测试和压力测试。它可以用来测试静态和动态资源&#xff0c;如文件、Web服务、REST API等。下载与使用: 访问官网下载安装包。解压安装包并运行 JMeter。通过创建测试计划来设置压力…

2023年终总结-轻舟已过万重山

自我介绍 高考大省的读书人 白&#xff0c;陇西布衣&#xff0c;流落楚、汉。-与韩荆州书 我来自孔孟故里山东济宁&#xff0c;也许是小学时的某一天&#xff0c;我第一次接触到了电脑&#xff0c;从此对它产生了强烈的兴趣&#xff0c;高中我有一个愿望&#xff1a;成为一名计…

设计模式再探——装饰模式

目录 一、背景介绍二、思路&方案三、过程1.装饰模式简介2.装饰模式的类图3.装饰模式代码4.装饰模式&#xff0c;职责父类拆分的奥义5.装饰模式&#xff0c;部件抽象类的无中生有 四、总结五、升华 一、背景介绍 最近公司在做架构模型的时候&#xff0c;涉及到装饰模式的研…

html网页设计 01marquee标签广告滚动(1)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><!-- scrollamount:数字越大&#xff0c;滚动越快direction:滚动方向滚动的类型behaior"slide",文字滚动到边界后就会…

Python中的lambda匿名函数详解以及三种经典使用场景

lambda匿名函数 匿名函数&#xff0c;顾名思义就是不需要具体定义函数名的函数。我们首先抛开复杂的定义&#xff0c;看两个具体例子。 先看一个无参数函数的例子。假设我们需要一个return 1的函数&#xff0c;如果使用普通的函数定义方式&#xff0c;其代码为&#xff1a; …

vuepress-----20、全文搜索

默认主题自带的搜索, 只会为页面的标题、h2、h3 以及 tags构建搜索索引。所以尽量将围绕知识点的关键字体现到标题上。而 tags 更为灵活&#xff0c;可以把相关的能想到的关键字都配置到 tags 中&#xff0c;以方便搜索。 默认插件介绍 (opens new window) 默认主体配置 (ope…

电子秤ADC芯片CS1237技术资料问题合集

问题11&#xff1a;实际应用中&#xff0c;多个称重传感器应该怎么与ADC连接&#xff1f; 解答&#xff1a;如果传感器是测量同一物体&#xff08;例如&#xff1a;厨房垃圾处理器&#xff09;&#xff0c;一般建议使用并联的方式。则相同类型的信号线连接在一起。对于传感器的…

C语言指针基础题(一)

目录 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四题目解析答案 例题五题目解析答案 例题六题目解析答案 例题七题目解析答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x…

C++ 教程 - 01 基础篇

文章目录 C介绍环境配置第一个cpp程序案例练习 变量常量关系运算符逻辑运算符条件运算符位运算符类型转换分支循环程序调用综合案例 C介绍 基于C语言&#xff0c;继承了C的所有语法&#xff1b; 静态类型语言&#xff0c;需要先编译&#xff0c;再执行&#xff1b; 贴近底层硬…

雪花算法:分布式系统的关键艺术

导言 在探索分布式系统的奥秘时&#xff0c;我们经常遇到一个看似简单却极其关键的挑战&#xff1a;如何高效、可靠地生成唯一的标识符&#xff08;ID&#xff09;。这不仅是技术的问题&#xff0c;更是一种艺术。让我们深入探讨雪花算法&#xff08;Snowflake Algorithm&…

windows下分卷解压文件

我的文件是这样的&#xff1a; 存放路径为&#xff1a;C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要进入分卷文件的目录cd&#xff1a; 第一步&#xff1a;cd /path/o/分卷问文件目录 第二步&#xff1a; 执行之后的结果(红色框出来的)&#xff1a; …

​functools --- 高阶函数和可调用对象上的操作​

源代码: Lib/functools.py functools 模块应用于高阶函数&#xff0c;即参数或&#xff08;和&#xff09;返回值为其他函数的函数。 通常来说&#xff0c;此模块的功能适用于所有可调用对象。 functools 模块定义了以下函数: functools.cache(user_function) 简单轻量级未绑…

Vellum —— Fluid

目录 Vellum fluids setups Fluid tips and troubleshooting Fluid phases Vellum fluids and soft bodies Vellum fluid vs FLIP fluid Vellum fluids setups Vellum fluid solver是基于粒子流体的解算框架&#xff0c;被完全集成到了Vellum动力学系统&#xff08;可与gr…

王道数据结构课后代码题 p149 第3—— 7(c语言代码实现)

目录 3.编写后序遍历二叉树的非递归算法 4.试给出二叉树的自下而上、自右到左的层次遍历算法 &#xff08;有图解代码详解&#xff09;c语言代码实现 5.假设二叉树采用二叉链表存储结构&#xff0c;设计一个非递归算法求二叉树的高度。 ​编辑 6.设一棵二叉树中各结点的值互不…

普冉(PUYA)单片机开发笔记(7): ADC-轮询式多路采样

概述 应用中经常会有使用单片机进行模数转换的需求。PY32F003 具有 1 个 12 位的模拟数字转换器&#xff08;ADC&#xff09;&#xff0c;今天我们一起来使用一下这个 ADC。 数据手册中对 ADC 简介如下。 SAR ADC&#xff1a;逐次逼近式 ADC&#xff0c;原理参见“参考链接&a…

1830_emacs lisp的交互式模式

org-mode的标记语法 Grey 全部学习汇总&#xff1a; GitHub - GreyZhang/g_org: my learning trip for org-mode 交互式模式 emacs的交互式模式让我对emacs的生命力有了更进一步的认识&#xff0c;但是我并没有找到什么特别丰富的资料做这方面的学习与分析。尤其是理论与实…

class070 子数组最大累加和问题与扩展-上【算法】

class070 子数组最大累加和问题与扩展-上【算法】 code1 53. 最大子数组和 // 累加和最大子数组和 // 给你一个整数数组 nums // 请你找出一个具有最大累加和的非空子数组 // 返回其最大累加和 // 测试链接 : https://leetcode.cn/problems/maximum-subarray/ dp[i]&#xff…

【Docker】Docker Compose,yml 配置指令参考的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

基于c++版数据结构基于数组栈改-Python思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…