从《Java核心技术卷Ⅱ》看Java操作pdf的工具类itext

Posted 哪 吒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从《Java核心技术卷Ⅱ》看Java操作pdf的工具类itext相关的知识,希望对你有一定的参考价值。

目录

一、什么是iText?

在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题。

二、引入jar

1、项目要使用iText,必须引入jar包

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

2、输出中文,还要引入下面itext-asian.jar

<dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itext-asian</artifactId>
     <version>5.2.0</version>
 </dependency>

3、设置pdf文件密码,还要引入下面bcprov-jdk15on.jar

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.47</version>
</dependency>

三、iText常用类

  1. com.itextpdf.text.Document:这是iText库中最常用的类,它代表了一个 pdf 实例。如果你需要从零开始生成一个pdf文件,你需要使用这个Document类。首先创建该实例,然后打开它,并添加内容,最后关闭该实例,即可生成一个pdf文件。
  2. com.itextpdf.text.Paragraph:表示一个缩进的文本段落,在段落中,你可以设置对齐方式,缩进,段落前后间隔等
  3. com.itextpdf.text.Chapter:表示 pdf 的一个章节,他通过一个Paragraph类型的标题和整形章数创建
  4. com.itextpdf.text.Font:这个类包含了所有规范好的字体,包括family of font,大小,样式和颜色,所有这些字体都被声明为静态常量
  5. com.itextpdf.text.List:表示一个列表;
  6. com.itextpdf.text.Anchor:表示一个锚,类似于html页面的链接。
  7. com.itextpdf.text.pdf.PdfWriter:当这个PdfWriter被添加到PdfDocument后,所有添加到Document的内容将会写入到与文件或网络关联的输出流中。
  8. com.itextpdf.text.pdf.PdfReader:用于读取 pdf 文件;

四、生成PDF步骤

1、创建文档

Document document = new Document();

2、通过书写器将文档写入磁盘

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createPDFWithColor.pdf"));

3、打开文档

document.open();

4、向文档中添加内容

document.add(new Paragraph("i love CSDN"));

5、关闭文档

document.close();

五、Java理论圣经 – Java核心技术

《Java核心技术》从1996年出版以来,至今更新了11版,每次Java发布长期支持版本后,凯.霍斯特曼都会将本书一并更新!
作者凯.霍斯特曼(Cay S.Horstmann)一直活跃在学术界与产业界。他曾是一家初创科技公司的副总裁兼首席技术官,并带领这家公司成功上市。
在美国圣何塞州立大学讲授计算机科学,长达30余年,为硅谷输送了大量的计算机专业人才。
他也是一位Java技术坚定的倡导者,常年在国际上的各类计算机峰会上进行技术分享,对Java的未来发展充满期待。
作为一本经典的Java开发畅销书,这本书得到大家的喜爱并且多年热度不减是有原因的,具体体现在以下几方面:
市面上Java的书那么多,为何这本能全球畅销二十余年,历久弥新呢?

1、全面清晰

《Java核心技术》分为I、II两卷,卷I:主要介绍Java语言的基础知识的专业级详解;卷II:主要介绍软件开发需要了解的高级主题。对Java程序开发做了全面的介绍。这本书的全面并非简单的罗列,而是通过周密组织,从Java繁杂的内容中整理出一条清晰的主线,构成一个完整的知识体系。
在卷1基础知识中,前2章就像是“序曲”,将介绍Java语言的背景和特点,并给出详细的安装指南来搭建学习Java开发的舞台。接下来几章中,Java程序中的各个主要演员悉数登场:封装、继承、接口、异常处理、泛型、集合。这些是Java开发的核心,利用这些知识,你完全可以编写实用的程序来解决实际问题。最后一章介绍并行,这也是当今应用的发展方向。整本书不仅让你深入了解设计和实现Java应用涉及的所有基础知识和Java特性,还会帮助你掌握开发Java程序所需的全部基本技能。

2、深入透彻

这本书很好地避免了开发基础书容易犯的“大而泛”的问题,尽管内容繁多,但对知识点的介绍并非泛泛而过。以对象构造为例,在准确理解构造器基本概念的基础上,深入分析了重载、默认字段初始化、无参数构造器、初始化块,调用其他构造器、对象析构等相关问题,使你能应对开发过程中可能遇到的具体问题,不仅知道怎么做,还能知道为什么这么做。

3、轻松上手

学习语言并不容易,特别是像Java这样庞大的语言。但这本书会让你的学习旅程更轻松。书中文字通俗易懂,时常以打比方的方式让我们对抽象的概念有一个具体的认识,给出了大量注释、提示和警告,这些都是作者实际经验的总结,会对编程实践大有裨益。全书提供了丰富的示例和代码清单,你可以利用书中介绍的开发环境轻松尝试。

六、从《Java核心技术卷Ⅱ》看Java操作pdf的工具类itext

1、卷Ⅰ主要介绍了Java语言的一些关键特性

从《Java核心技术》纵览Java全貌

2、本卷Ⅱ主要介绍编程人员进行专业软件开发时需要了解的高级主题

卷Ⅱ分为八章:

  1. 第1章 Java SE 8的流库,是小编认为的Java8最重磅的更新,真的好用到爆炸。【Java8 新特性 5】Java 8 stream的详细用法
  2. 第2章输入与输出讲解了输入/输出流、读写二进制数据、对象输入输出与序列化、操作文件、内存映射文件等知识点,更是对本文的一个更详尽的基础知识补充。
  3. 第3章 XML,XML的简单易于在任何应用程序中读/写数据,这使XML很快成为数据交换的唯一公共语言,设计xml的目的是用作数据交换,当然也可以用作保存数据。xml保存数据具有平台无关,规范化。通过提供方提供的读取程序就可以读取出xml数据。
  4. 第4章 网络,说句掏心窝子的话,代码测试部署完毕后,现场反馈的问题中,50%的问题都是源于网络。
  5. 第5章 数据库编程,简单的介绍了JDBC的设计、结构化查询语言、执行查询操作、可滚动和可更新的结果集、行集、元数据、事务、Web与企业应用中的连接管理等问题。
  6. 第6章 日期和时间API
  7. 第7章 国际化
  8. 第8章 脚本、编译与注解处理,简单介绍了Java平台的脚本 、脚本赋值与绑定、调用脚本的函数和方法。

七、代码实例

1、代码中的常量定义

package com.neusoft.guor.itext;

import ...

/**
 * itext PDF操作
 */
public class PDFInit 
    public static final String FILE_DIR = "E:\\\\guor\\\\itext\\\\";
    public static final String const_JPG_JAVA = FILE_DIR + "java.jpg";
    public static final String const_JPG_nginx = FILE_DIR + "nginx.jpg";
    private static final String const_NEZHA = "哪吒编程";
    private static final String const_NEZHA_PROGRAM = "哪吒编程";
    private static final String const_BIBIDONG = "比比东";
    private static final String const_YUNYUN = "云韵";
    private static final String const_BAIDU = "百度一下 你就知道";
    private static final String const_BAIDU_URL = "https://www.baidu.com";

    private static final String const_PAGE_FIRST = "第一页";
    private static final String const_PAGE_SECOND = "第二页";
    private static final String const_PAGE_THIRD = "第三页";
    private static final String const_PAGE_FOUR = "第四页";
    private static final String const_PAGE_FIVE = "第五页";

    private static final String const_TITLE_FIRST = "一级标题";
    private static final String const_TITLE_SECOND = "二级标题";
    private static final String const_CONTENT = "内容";

    // 普通中文字体
    public static Font static_FONT_CHINESE = null;
    // 超链字体
    public static Font static_FONT_LINK = null;

    private static void pdfFontInit() throws IOException, DocumentException 
        // 微软雅黑
        BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

        // 普通中文字体
        static_FONT_CHINESE = new Font(chinese, 12, Font.NORMAL);// Font.BOLD为加粗

        // 超链字体
        static_FONT_LINK = new Font(chinese, 12, Font.NORMAL, BaseColor.BLUE);
    

2、创建一个 PDF 文件,并添加文本

	 /**
     * 创建一个 PDF 文件,并添加文本
     */
    public static void createPDF() throws IOException, DocumentException 
        // 实例化 document
        document = new Document();
        // 生成文件
        String path = FILE_DIR + "createPDF.pdf";
        File file = new File(path);
        if(!file.exists())
            file.createNewFile();
        
        PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createPDF.pdf"));
        // 打开 document
        document.open();
        // 添加文本(此处定义中文字体,默认API中不可写入中文)
        document.add(new Paragraph(const_NEZHA, static_FONT_CHINESE));
        // 关闭 document
        document.close();
    

3、创建PDF文件,修改文件的属性

	/**
     * 创建PDF文件,修改文件的属性
     */
    public static void createPDFWithColor() throws FileNotFoundException, DocumentException 
        // 页面大小
        Rectangle rect = new Rectangle(PageSize.A5.rotate());
        // 页面背景色
        rect.setBackgroundColor(BaseColor.YELLOW);
        document = new Document(rect);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createPDFWithColor.pdf"));
        // PDF版本(默认1.4)
        writer.setPdfVersion(PdfWriter.VERSION_1_6);

        // 文档属性
        document.addAuthor(const_NEZHA);
        document.addTitle("我的第一个pdf");

        // 页边空白
        document.setMargins(10, 10, 10, 10);
        // 打开
        document.open();
        document.add(new Paragraph(const_NEZHA, static_FONT_CHINESE));
        // 关闭
        document.close();
    

4、创建带密码的PDF

	/**
     * 创建带密码的PDF
     */
    public static void createPDFWithPassWord() throws FileNotFoundException, DocumentException 
        // 页面大小
        Rectangle rect = new Rectangle(PageSize.A5.rotate());
        // 页面背景色
        rect.setBackgroundColor(BaseColor.YELLOW);
        document = new Document(rect);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createPDFWithPassWord.pdf"));

        // userPassword打开密码:"123"
        // ownerPassword编辑密码: "123456"
        writer.setEncryption("123".getBytes(), "123456".getBytes(), PdfWriter.ALLOW_SCREENREADERS, PdfWriter.STANDARD_ENCRYPTION_128);
        document.open();
        document.add(new Paragraph(const_NEZHA, static_FONT_CHINESE));
        document.close();
    

5、为PDF添加页

	 /**
     * 为PDF添加页
     */
    public static void createPDFWithNewPages() throws FileNotFoundException, DocumentException 
        document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createPDFAddNewPages.pdf"));
        document.open();
        
        document.add(new Paragraph(const_PAGE_FIRST, static_FONT_CHINESE));

        document.newPage();
        document.add(new Paragraph(const_PAGE_SECOND, static_FONT_CHINESE));
        writer.setPageEmpty(true);

        document.newPage();
        document.add(new Paragraph(const_PAGE_THIRD, static_FONT_CHINESE));

        document.close();
    

6、为PDF文件添加水印,背景图

	/**
     * 为PDF文件添加水印,背景图
     */
    public static void createPDFWithWaterMark() throws IOException, DocumentException 
        FileOutputStream out = new FileOutputStream(FILE_DIR + "createPDFWithWaterMark.pdf");
        document = new Document();
        PdfWriter.getInstance(document, out);
        document.open();
        
        document.add(new Paragraph(const_PAGE_FIRST, static_FONT_CHINESE));

        document.newPage();
        document.add(new Paragraph(const_PAGE_SECOND, static_FONT_CHINESE));

        document.newPage();
        document.add(new Paragraph(const_PAGE_THIRD, static_FONT_CHINESE));

        document.close();

        // 图片水印
        PdfReader reader = new PdfReader(FILE_DIR + "createPDFWithWaterMark.pdf");
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(FILE_DIR + "createPDFWithWaterMark2.pdf"));

        Image img = Image.getInstance(const_JPG_JAVA);
        img.setAbsolutePosition(200, 200);
        PdfContentByte under = stamp.getUnderContent(1);
        under.addImage(img);

        // 文字水印
        PdfContentByte over = stamp.getOverContent(2);

        // 加载字库来完成对字体的创建
        BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);

        over.beginText();

        // 设置颜色 默认为蓝色
        over.setColorFill(BaseColor.RED);
        // 设置字体字号
        over.setFontAndSize(bf, 50);
        // 设置起始位置
        over.setTextMatrix(30, 30);
        // 开始写入水印 左-下-倾斜度
        over.showTextAligned(Element.ALIGN_LEFT, "nezha", 245, 400, 30);
        over.endText();

        // 背景图
        Image img2 = Image.getInstance(const_JPG_NGINX);
        img2.setAbsolutePosition(0, 0);
        PdfContentByte under2 = stamp.getUnderContent(3);
        under2.addImage(img2);

        stamp.close();
        reader.close();

    

7、插入Chunk, Phrase, Paragraph, List

	/**
     * 插入Chunk, Phrase, Paragraph, List
     * Chunk : 块,PDF文档中描述的最小原子元素
     * Phrase : 短语,Chunk的集合
     * Paragraph : 段落,一个有序的Phrase集合
     */
    public static void createPDFWithContent() throws DocumentException, FileNotFoundException 
        FileOutputStream out = new FileOutputStream(FILE_DIR + "createPDFWithContent.pdf");
        document = new Document();
        PdfWriter.getInstance(document, out);

        document.open();

        // 添加块
        document.add(new Chunk(const_NEZHA, static_FONT_CHINESE));
        Font font = new Font(Font.FontFamily.HELVETICA, 8, Font.BOLD, BaseColor.WHITE);
        Chunk id = new Chunk("springboot", font);
        id.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f);
        id.setTextRise(7);
        document.add(id);
        Font font2 = new Font(Font.FontFamily.HELVETICA, 6, Font.BOLD, BaseColor.WHITE);
        Chunk id2 = new Chunk("springcloud", font2);
        id2.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f);
        id2.setTextRise(3);

        id2.setUnderline(0.2f, -2f);
        document.add(id2);
        document.add(Chunk.NEWLINE);

        // 添加一页,添加短语
        document.newPage();
        document.add(new Phrase("Phrase page"));

        // 添加短语
        Phrase director = new Phrase();
        Chunk name = new Chunk(const_BIBIDONG, static_FONT_CHINESE);
        // 添加下划线(thickness:下划线的粗细,yPosition:下划线离字的距离)
        name.setUnderline(0.5f, -1f);
        director.add(name);
        director.add(new Chunk(","));
        director.add(new Chunk(以上是关于从《Java核心技术卷Ⅱ》看Java操作pdf的工具类itext的主要内容,如果未能解决你的问题,请参考以下文章

JAVA核心技术 卷II:高级特性(原书第8版)下载 񘶌

《Java核心技术 卷II 高级特性 原书第10版》高清pdf

《Java核心技术 卷1 基础知识 原书第9版》pdf

java核心技术卷pdf,总结到位

java核心技术

Java核心技术卷一 7. java集合