java程序设计基础第七版pdf_java程序设计教程第三版pdf

前言

我们之前使用js库html2canvas + jspdf实现html转PDF、图片,并下载(详情请戳:html页面转PDF、图片操作记录),大致原理是将页面塞到画布里,以图片的方式放到PDF中,生成的文件比较大,文本记录Java使用iText7生成PDF

iText 7是iText强大的PDF工具包的最新版本,用于PDF生成,PDF编程,处理和操作,如数字签名等

官方文档:https://kb.itextpdf.com/home/it7kb/ebooks

简单生成PDF

官方文档:https://kb.itextpdf.com/home/it7kb/ebooks/itext-7-jump-start-tutorial-for-java

根据文档说明,我们引入依赖

<properties> <!-- 省略其他部分...--> <itext7.version>7.1.7</itext7.version> </properties> <dependencies> <!-- 省略其他部分...--> <!-- itextpdf --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>kernel</artifactId> <version>${itext7.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>io</artifactId> <version>${itext7.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>layout</artifactId> <version>${itext7.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>forms</artifactId> <version>${itext7.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>pdfa</artifactId> <version>${itext7.version}</version> </dependency> </dependencies>

代码

package cn.huanzi.qch.util; import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.io.image.ImageDataFactory; import com.itextpdf.kernel.colors.Color; import com.itextpdf.kernel.colors.DeviceRgb; import com.itextpdf.kernel.events.Event; import com.itextpdf.kernel.events.IEventHandler; import com.itextpdf.kernel.events.PdfDocumentEvent; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.action.PdfAction; import com.itextpdf.kernel.pdf.annot.PdfLinkAnnotation; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.layout.Canvas; import com.itextpdf.layout.Document; import com.itextpdf.layout.Style; import com.itextpdf.layout.element.*; import com.itextpdf.layout.font.FontProvider; import com.itextpdf.layout.property.TextAlignment; import com.itextpdf.layout.property.VerticalAlignment; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * itextpdf 工具类 * iText 7是iText强大的PDF工具包的最新版本,用于PDF生成,PDF编程,处理和操作,如数字签名等。 * https://kb.itextpdf.com/home/it7kb/ebooks */ public class ITextPdfUtil { //字体,我这里使用系统自带的simhei黑体 private static final String FONT = "C:/Windows/Fonts/simhei.ttf"; //html转pdf public static void html2pdf(){ String html = ""; //从html文件读取内容 StringBuilder stringBuilder = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new FileReader("E:\\Java\\html2pdf.html"));){ for (Object o : reader.lines().toArray()) { stringBuilder.append(o); } }catch (Exception e){ e.printStackTrace(); } html = stringBuilder.toString(); try (PdfWriter writer = new PdfWriter("E:\\Java\\html2pdf.pdf"); PdfDocument pdf = new PdfDocument(writer); ){ //转换器属性设置 ConverterProperties props = new ConverterProperties(); //字体 props.setFontProvider(new FontProvider()); props.getFontProvider().addFont(ITextPdfUtil.FONT); //为img图片配置基础路径 props.setBaseUri("D:\\XFT User\\Pictures\\"); //HtmlConverter.convertToDocument Document document = HtmlConverter.convertToDocument(html, pdf, props); //设置文档属性 pdf.getDocumentInfo().setAuthor("huanzi-qch"); pdf.getDocumentInfo().setTitle("IText测试html2pdf"); pdf.getDocumentInfo().setSubject("XXX公司"); pdf.getDocumentInfo().setMoreInfo("1","111"); pdf.getDocumentInfo().setCreator("huanzi"); pdf.getDocumentInfo().setKeywords("IText"); //注册事件监听 pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler()); //设置字体 document.setFont(ITextPdfUtil.getPdfFont()); //页边距 document.setMargins(0, 0, 0, 0); document.close(); System.out.println("操作完成!"); }catch (IOException e){ e.printStackTrace(); System.err.println("操作异常..."); } } //生成简单PDF public static void test(){ //语法糖 try (PdfWriter writer = new PdfWriter("E:\\Java\\test.pdf"); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf, PageSize.A4.rotate()); ){ //设置文档属性 pdf.getDocumentInfo().setAuthor("huanzi-qch"); pdf.getDocumentInfo().setTitle("IText测试PDF"); pdf.getDocumentInfo().setSubject("XXX公司"); pdf.getDocumentInfo().setMoreInfo("1","111"); pdf.getDocumentInfo().setCreator("huanzi"); pdf.getDocumentInfo().setKeywords("IText"); //注册事件监听 pdf.addEventHandler(PdfDocumentEvent.END_PAGE, new MyEventHandler()); //设置字体 document.setFont(ITextPdfUtil.getPdfFont()); //页边距 document.setMargins(20, 20, 20, 20); //简单文字 document.add(new Paragraph("简单文字")); document.add(new Paragraph("Hello Word!").add(new Tab()).add(new Text("你好!").addStyle(new Style().setFontSize(24)))); //简单图片 document.add(new Paragraph("简单图片")); document.add(new Image(ImageDataFactory.create("D:\\XFT User\\Pictures\\logo.png"))); //简单表格 document.add(new Paragraph("简单表格")); Table table = new Table(new float{3, 3, 4}); PdfFont font = ITextPdfUtil.getPdfFont(); //标题、内容 process(table, "姓名;年龄;电话号码", font, true); for (int i = 0; i < 5; i++) { process(table, "张三"+i+";"+(18+i)+";1500000000"+i, font, false); } document.add(table); //超链接 document.add(new Paragraph("超链接")); PdfLinkAnnotation annotation = new PdfLinkAnnotation(new Rectangle(0, 0)); annotation.setAction(PdfAction.createURI("https://itextpdf.com/")); Paragraph p = new Paragraph("更多精彩内容,猛戳:").add(new Link("这里", annotation)); document.add(p); //换一页 //document.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); document.close(); System.out.println("操作完成!"); } catch (IOException e) { e.printStackTrace(); System.err.println("操作异常..."); } } //获取统一字体 public static PdfFont getPdfFont(){ PdfFont pdfFont = null; try { pdfFont = PdfFontFactory.createFont(ITextPdfUtil.FONT, PdfEncodings.IDENTITY_H,true); } catch (IOException e) { e.printStackTrace(); } return pdfFont; } //设置表格内容 public static void process(Table table, String line, PdfFont font, boolean isHeader) { String split = line.split(";"); for (String s : split) { Cell cell = new Cell().add(new Paragraph(s).setFont(font)); if (isHeader) { table.addHeaderCell(cell); } else { table.addCell(cell); } } } /** * 自定义事件监听 * * 背景颜色 * 页脚页眉 * 文字水印 * * 也可以分成多个EventHandler */ protected static class MyEventHandler implements IEventHandler { @Override public void handleEvent(Event event) { PdfDocumentEvent docEvent = (PdfDocumentEvent) event; PdfDocument pdfDoc = docEvent.getDocument(); PdfPage page = docEvent.getPage(); int pageNumber = pdfDoc.getPageNumber(page); Rectangle pageSize = page.getPageSize(); PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc); //背景颜色 Color backgroundColor = new DeviceRgb(245, 245, 245);; pdfCanvas.saveState() .setFillColor(backgroundColor) .rectangle(pageSize.getLeft(), pageSize.getBottom(),pageSize.getWidth(), pageSize.getHeight()) .fill().restoreState(); //页脚页眉 PdfFont pdfFont = ITextPdfUtil.getPdfFont(); String header = "我是页眉"; String footer = "第 "+pageNumber+" 页"; pdfCanvas.beginText() .setFontAndSize(pdfFont, 9) .moveText((pageSize.getWidth() / 2) - (pdfFont.getWidth(header) / 200), pageSize.getTop() - 20) .showText(header) .moveText((pdfFont.getWidth(header) / 200) - (pdfFont.getWidth(footer) / 200), -pageSize.getTop() + 30) .showText(footer) .endText(); //文字水印 Canvas canvas = new Canvas(pdfCanvas, pdfDoc, page.getPageSize()); canvas.setFontColor(new DeviceRgb(200, 200, 200)); canvas.setProperty(20, 20); canvas.setFont(pdfFont); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { canvas.showTextAligned(new Paragraph("我是文字水印").setOpacity(0.8f),(150 + i * 300), (160 + j * 150), pdfDoc.getPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); } } pdfCanvas.release(); } } //测试 public static void main(String args) { test(); //html2pdf(); } }

效果

java程序设计基础第七版pdf_java程序设计教程第三版pdf

生成的PDF

java程序设计基础第七版pdf_java程序设计教程第三版pdf

文档属性

java程序设计基础第七版pdf_java程序设计教程第三版pdf

HTML转PDF

官方文档:https://kb.itextpdf.com/home/it7kb/ebooks/itext-7-converting-html-to-pdf-with-pdfhtml

pdfHTML是iText 7的一个附加组件,需要添加依赖

<properties> <!-- 省略其他部分...--> <itext7.html2pdf.version>2.1.4</itext7.html2pdf.version> </properties> <dependencies> <!-- 省略其他部分...--> <!-- itextpdf html2pdf组件--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>${itext7.html2pdf.version}</version> </dependency> </dependencies>

代码

代码同上,仅main测试函数不同!

//测试 public static void main(String args) { //test(); html2pdf(); }

PS:html内容往下拉  

效果

java程序设计基础第七版pdf_java程序设计教程第三版pdf

html页面

<!DOCTYPE html> <html> <head> <title>简单简历</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate"/> <meta http-equiv="pragma" content="no-cache"/> <meta http-equiv="expires" content="0"/> <!-- 自定义样式 --> <style> *{ font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif; } body { margin: 0; padding: 0; } a { text-decoration: none; padding: 0; margin: 5px 0; color: black; } a:hover { color: #5c8dff; } b{ margin: 0 10px; } /* 主体 */ .main { /*margin: 0 auto;*/ /*width: 770px;*/ /*box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);*/ /*border: 1px solid #dad8d8;*/ /*background: #fbfbfb;*/ } /* 1级标题 */ h3.list1 { color: #409EFF; border-bottom: 1px solid #409EFF; padding: 5px; margin: 50px 0 0 0; } /* 大模块 */ .block,.block1 { /*background: #efefef;*/ /*border: 1px solid #dad8d8;*/ margin: 0 0 20px 0; padding: 0 10px; } .block,.block1 p { text-indent:2em; } .block:hover { background: #eeeeee; } .block1:hover { background: #cecece; } .button-list{ text-align: center; margin: 20px auto; padding: 10px; width: 1024px; } </style> </head> <body> <!-- 简历主体 --> <div id="body" class="main"> <div class="section"> <div class="module"> <h3 class="list1" style="margin: 0;">基本信息</h3> <div class="block"> <p>XXX<b>/</b>男<b>/</b>25岁</p> <p>本科<b>/</b>XX学校<b>/</b>XX专业<b>/</b>2014-2018</p> <p>工龄:X年</p> <p>手机:XXXXXXXXXX</p> <p>邮箱:XXXXX@qq.com</p> <p>GitHub:<a href="https://github.com/huanzi-qch">https://github.com/huanzi-qch</a></p> <p>博客园:<a href="https://www.cnblogs.com/huanzi-qch">https://www.cnblogs.com/huanzi-qch</a></p> <br/> <p>求职岗位:Java开发<b>/</b>目标城市:南宁市<b>/</b>期望薪资:面议</p> <p>注:已离职,一个月可到岗</p> <img style="position: relative;top: -350px;left: 500px;width: 100px;height: 130px;" src="logo.png"/> </div> </div> <div class="module"> <h3 class="list1">技能清单</h3> <div class="block"> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> <p>熟悉XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。</p> </div> </div> <div class="module"> <h3 class="list1">工作经历</h3> <div class="block"> <p>XXX技术有限公司<b>/</b>Java开发工程师<b>/</b>2018.01 - 至今</p> <p>参与多个项目开发、测试、部署等工作,包括:</p> <p>1、XXX。</p> <p>2、XXX。</p> <p>3、XXX。</p> </div> </div> <div class="module"> <h3 class="list1">项目经历</h3> <div class="block"> <h4 class="list2">项目1</h4> <div class="block1"> <p>项目名称:XXX(2020-11 —2021-11)</p> <p>项目介绍:XXXXXXXXXXXXXXX。</p> <p>技术架构:XXX + XXX + XXX。</p> <p>职责描述:</p> <p>1、XXXX。</p> <p>2、XXXX。</p> <p>3、XXXX。</p> <p>4、XXXX。</p> </div> <h4 class="list2">项目2</h4> <div class="block1"> <p>项目名称:XXX(2020-11 —2021-11)</p> <p>项目介绍:XXXXXXXXXXXXXXX。</p> <p>技术架构:SpringBoot + Vue + Element-UI + ECharts。</p> <p>职责描述:</p> <p>1、XXXX。</p> <p>2、XXXX。</p> <p>3、XXXX。</p> <p>4、XXXX。</p> </div> </div> </div> <div class="module"> <h3 class="list1">自我评价</h3> <div class="block"> <p>1、XXXX;</p> <p>2、XXXX;</p> <p>3、XXXX;</p> </div> </div> </div> </div> </body> </html>

java程序设计基础第七版pdf_java程序设计教程第三版pdf

生成的PDF

java程序设计基础第七版pdf_java程序设计教程第三版pdf

后记

不管是前端生成PDF,还是后端生成PDF,能实现需求就是好技术!   

版权声明

作者:huanzi-qch

出处:https://www.cnblogs.com/huanzi-qch

若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.

本文【java程序设计基础第七版pdf_java程序设计教程第三版pdf】由作者: Web服务 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4181.html

(0)
上一篇 2023-03-10 08:23:00
下一篇 2023-03-10 08:32:22

相关推荐

  • HTML 教程 | 菜鸟教程

    HTML 教程- (HTML5 标准) 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点,HTML 运行在浏览器上,由浏览器来解析。 在本教程中,您将学习如何使用 HTML 来创建站点。 HTML 很容易学习!相信您能很快学会它! H…

    2023-03-12
    600
  • 计算机二级c语言试题题库及答案

    C语言永远不会过时 其实学编程关键是学习其思想,如果你精通了一门,再去学其他的时候也很容易上手。C不会过时的,尤其是在unix、linux操作平台上,学好C是必须的。 C跟C++在很多方面也是兼容的,c是c++的基础。 再者c能从很大的程度上帮你了解计算机的发展史,数据结构等方面的知识,很多软件、甚至操作系统中的很大部分是用c来实现的。 还有一些电器芯片的程…

    2023-03-11
    900
  • css鼠标样式小手_鼠标的小手css

    网站开发简介 网站开发包括前端和后端,后端是服务器,用来存储数据和设计业务逻辑,前端用来展示网站效果。 网站是多个网页的集合,网页是纯文本格式的文件,浏览器就是将这些纯文本格式的文件渲染成网页。 HTML简介 HTML是超文本标记语言(HyperText Markup Language),是一种用于创建网页的标准标记语言,HTML由一个个标签组成,文件的后缀…

    2023-03-09
    700
  • js确定取消对话框样式 js弹出框确定和取消

    为了避免误删数据,删除前应该不要嫌麻烦弹出一个确认/取消询问窗口,以前免错删数据后无法恢复。网站的数据删除由用 户在客户端发起,所以弹出确认/取消询问窗口由javascript来完成,它弹出的询问窗口跟Windows系统弹出的一样。 javascript删除前弹出一个确认/取消询问窗口有几种方法,我们只介绍一种方便调用的方法,这样既便于在 javascrip…

    2023-03-17
    300
  • python的readlines函数_python中readlines

    一、Python绝对路径和相对路径 明确一个文件所在的路径,有 2 种表示方式,分别是: ◆绝对路径:总是从根文件夹开始,Window 系统中以盘符(C:、D:)作为根文件夹,而 OS X 或者 Linux 系统中以 / 作为根文件夹。 ◆ 相对路径:指的是文件相对于当前工作目录所在的位置。例如,当前工作目录为 "C:\Windows\System…

    2023-03-10
    400
  • until和not until的区别

    强调句的用法大家肯定已经很熟悉了,尤其是it做形式主语的强调句型。可是当句子里有not…until…的时候,很多朋友还是会搞混。今天我就跟大家一起挖一挖not…until…的强调句用法。 强调句的结构很简单,就是It is+被强调部分+that/who+…。比如陈述句:Tom lent me money when I was in trouble.我需要强调…

    2023-03-12
    600
  • socket技术详解看清socket编程

    我相信大家刚开始学socket的时候,都跟我一样。 云里雾里的,对socket的概念很模糊。 这篇文章我打算从一个初学者的角度开始聊起,让大家了解下我眼里的socket是什么以及socket的原理和内核实现。 socket的概念 故事要从一个插头说起。 插头与插座 当我将插头插入插座,那看起来就像是将两者连起来了。 风扇与电力系统建立"连接&#03…

    2023-03-10
    800
  • Shell语言是不是图灵完备?_shell脚本是什么语言

    计算机编程语言可用于将指令传达给计算机。它们基于某些句法和语义规则,定义了编程语言中每种结构的含义。 现在我得到了一个凡是可以找得到的每种编程语言的列表。我将它们分为以下几类: 解释型编程语言 函数式编程语言 编译型编程语言 过程式编程语言 脚本编程语言 标记编程语言 基于逻辑的编程语言 并发编程语言 面向对象编程语言 解释型编程语言 解释型语言是这样一种编…

    2023-03-09
    600
  • html文本框前面怎么添加文字

    文本格式标记 以下HTML标记用于格式化网页上文本的外观。这可以使网页变得更加生动,但是,文本格式的太多变化也会使人不快。 标题 – <head> </head> head标记有6个级别可用,从h1用于最大和最重要的标题,到h6是最小的标题。 粗体 – <b> </b> b标记之间的文本…

    2023-03-11
    000
  • 集合java一个集合包含另两个集合_JAVA中的集合

    1. JAVA 集合 1.1. 接口继承关系和实现 集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。 1. Collection:Collection 是集合 List、Set、Queue 的最基本的接口。 2. Iterator:迭代器,可以通过迭代器遍历集合中的数据 3. Map:…

    2023-03-13
    400

发表回复

登录后才能评论
返回顶部
错说博客上线啦!