一、前言

在我们日常开发中生成pdf是一个很常见的功能,IText是一种生成PDF报表的Java组件。通过使用IText可以很简单的实现生成PDF,设置PDF等操作。

二、基本使用

1.添加依赖

<!--iText-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.6</version>
        </dependency>
        <!--pdf输出中文-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <!--设置PDF密码-->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.47</version>
        </dependency>

2.常用类介绍

  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 文件;

3.生成带有文本的pdf

package com.example.aopdemo;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@SpringBootTest
class AopDemoApplicationTests {


    @Test
    public void test1() throws IOException, DocumentException {
        // 实例化Document
        Document document = new Document();
        // pdf文件保存地址
        String filePath = "D:" + File.separator + "createPDF.pdf";
        File file = new File(filePath);
        if (!file.exists()) {
            file.createNewFile();
        }
        // 通过书写器将文档写入磁盘
        PdfWriter.getInstance(document, new FileOutputStream(filePath));
        // 打开 document
        document.open();
        // 微软雅黑
        BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        // 中文字体 设置字体大小
        Font font = new Font(chinese, 12, Font.NORMAL);
        // 添加文本
        document.add(new Paragraph("hello world", font));
        // 关闭document
        document.close();
    }

}

执行测试生成PDF文件。

SpringBoot使用iText操作PDF_SpringBoot

打开PDF,显示我们添加的文本内容。

SpringBoot使用iText操作PDF_iText_02

4.生成带有密码的PDF

package com.example.aopdemo;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@SpringBootTest
class AopDemoApplicationTests {


    @Test
    public void test1() throws IOException, DocumentException {
        // 实例化Document
        Document document = new Document();
        // pdf文件保存地址
        String filePath = "D:" + File.separator + "createPasswordPDF.pdf";
        File file = new File(filePath);
        if (!file.exists()) {
            file.createNewFile();
        }
        // 通过书写器将文档写入磁盘
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filePath));
        // userPassword:打开密码  ownerPassword:编辑密码
        writer.setEncryption("123".getBytes(), "123456".getBytes(), PdfWriter.ALLOW_SCREENREADERS, PdfWriter.STANDARD_ENCRYPTION_128);
        // 打开 document
        document.open();
        // 微软雅黑
        BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        // 中文字体 设置字体大小
        Font font = new Font(chinese, 12, Font.NORMAL);
        // 添加文本
        document.add(new Paragraph("hello world", font));
        // 关闭document
        document.close();
    }

}

执行测试方法生成带有密码的PDF文件。

SpringBoot使用iText操作PDF_PDF_03

打开文件,需要密码。

SpringBoot使用iText操作PDF_PDF_04

我们输入代码中设置的密码,打开文件。

SpringBoot使用iText操作PDF_PDF_05

SpringBoot使用iText操作PDF_iText_06

我们编辑pdf文件也受到保护,我们同样输入密码才能进行编辑操作。

SpringBoot使用iText操作PDF_iText_07

SpringBoot使用iText操作PDF_iText_08

5.为PDF文件添加水印,背景图

package com.example.aopdemo;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@SpringBootTest
class AopDemoApplicationTests {


    @Test
    public void test1() throws IOException, DocumentException {
        FileOutputStream out = new FileOutputStream("D:" + File.separator + "createPDFWithWaterMark.pdf");
        Document document = new Document();
        PdfWriter.getInstance(document, out);
        document.open();
        // 微软雅黑
        BaseFont chinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        // 中文字体 设置字体大小
        Font font = new Font(chinese, 12, Font.NORMAL);


        document.add(new Paragraph("hello1", font));

        document.newPage();
        document.add(new Paragraph("hello2", font));

        document.newPage();
        document.add(new Paragraph("hello3", font));

        document.close();

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

        Image img = Image.getInstance("D:" + File.separator + "a.jpeg");
        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("D:" + File.separator + "b.jpg");
        img2.setAbsolutePosition(0, 0);
        PdfContentByte under2 = stamp.getUnderContent(3);
        under2.addImage(img2);

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

    }

}

执行测试方法,生成两个PDF文件。

SpringBoot使用iText操作PDF_iText_09

打开文件我们看到生成了带有水印和背景图的PDF文件。

SpringBoot使用iText操作PDF_PDF_10

SpringBoot使用iText操作PDF_PDF_11