Java 使用i Text 生成 pdf

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

pom.xml

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

Test

快速创建一个pdf

// 创建一个Document对象(pdf文档) A4纸张大小
Document document = new Document(PageSize.A4);
// 建立一个书写器(Writer)与document对象关联
PdfWriter.getInstance(document, new FileOutputStream("D:\\Test.pdf"));
// 打开文档
document.open();

// 向文档中输入一个内容 
document.add(new Paragraph("Hello World"));

// 关闭文档
document.close();


 
image.png

pdf文档中添加内容

全局字体设置

/**
* 定义全局的字体静态变量 
*/
private static Font titlefont;
private static Font headfont;
private static Font keyfont;
private static Font textfont;
/** 
* 最大宽度 
*/
private static int maxWidth = 520;
/* 静态代码块*/
static {    
    try {        
        // 不同字体(这里定义为同一种字体:包含不同字号、不同style)        
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);        
        titlefont = new Font(bfChinese, 16, Font.BOLD);        
        headfont = new Font(bfChinese, 14, Font.BOLD);        
        keyfont = new Font(bfChinese, 10, Font.BOLD);        
        textfont = new Font(bfChinese, 10, Font.NORMAL);    
    } catch (Exception e) {        
        e.printStackTrace();    
    }
}

段落

// 段落
Paragraph paragraph = new Paragraph("Hello I Text 5", titlefont);
//设置文字居中 0靠左 1,居中 2,靠右
paragraph.setAlignment(1);
//设置左缩进
paragraph.setIndentationLeft(12);
//设置右缩进
paragraph.setIndentationRight(12);
//设置首行缩进
paragraph.setFirstLineIndent(24);
//行间距
paragraph.setLeading(20f);
//设置段落上空白
paragraph.setSpacingBefore(5f);
//设置段落下空白
paragraph.setSpacingAfter(10f);

直线/点线

// 直线
Paragraph p1 = new Paragraph();
p1.add(new Chunk(new LineSeparator()));
// 点线
Paragraph p2 = new Paragraph();
p2.add(new Chunk(new DottedLineSeparator()));

超链接

// 超链接
Anchor anchor = new Anchor(new Paragraph("超链接", titlefont));
anchor.setReference("www.baidu.com");

图片

// 添加图片
Image image = Image.getInstance("http://devb2b.hosjoy.com/img/hosjoy_logo48@2x.595a425a.png");
// 位置
image.setAlignment(Image.ALIGN_CENTER);
// 依照比例 缩放
image.scalePercent(20);

表格PdfPTable

// 创建一个包含5列的表格
PdfPTable table = new PdfPTable(5);
// 创建一个宽度比例表格
PdfPTable table = new PdfPTable(new float[]{10, 12, 12, 10, 10});
// 表格最大像素
table.setTotalWidth(maxWidth);
// 锁定宽度
table.setLockedWidth(true);
// 水平居中
table.setHorizontalAlignment(Element.ALIGN_CENTER);
// 表格边框 配合 单元格设置
table.getDefaultCell().setBorder(1);

// 创建单元格
PdfPCell cell = new PdfPCell();
// 垂直对齐设置
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
// 水平对齐设置
cell.setHorizontalAlignment();
// 合并单元格
cell.setColspan(1);
// 合并单元格
cell.setRowspan(1);
// 内容
cell.setPhrase(new Phrase(value, font));
// 边框设置
cell.setBorder(Rectangle.NO_BORDER);
// 背景颜色设置
cell.setBackgroundColor(baseColor);

// 将单元格加入表格
table.addCell(cell)
    
// 表格添加图片
Image image = Image.getInstance("http://devb2b.hosjoy.com/img/hosjoy_logo48@2x.595a425a.png");
image.setAlignment(Image.ALIGN_LEFT);
Phrase listOfDots = new Phrase();
// 位置设置
listOfDots.add(new Chunk(image, 0, 0));
// 表格添加图片
table.addCell(listOfDots);    

页眉页脚 和 水印

继承 PdfPageEventHelper

/**
* 打开文档时,创建一个总页数的模版 
*/
@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {                   PdfContentByte cb = writer.getDirectContent();    
    totalPage = cb.createTemplate(30, 12);
}

    /**
     * 一页加载完成触发,写入页眉和页脚  
     * 添加水印
     */
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        
        // 水印
        for(int i=0 ; i<4; i++) {
            for(int j=0; j<7; j++) {
                ColumnText.showTextAligned(writer.getDirectContentUnder(),
                        Element.ALIGN_CENTER,
                        new Phrase("好享家", watermarkFont),
                        (50.5f+i*150),
                        (40.0f+j*150),
                        writer.getPageNumber() % 2 == 1 ? 45 : -45);
            }
        }
        
        // 页眉和页脚 
        PdfPTable table = new PdfPTable(3);
        try {
            // 总宽
            table.setTotalWidth(PageSize.A4.getWidth()-80);
            // 设置表格宽3列
            table.setWidths(new int[]{24, 24, 3});
            table.setLockedWidth(true);
            table.getDefaultCell().setFixedHeight(0);
            table.getDefaultCell().setBorder(Rectangle.NO_BORDER);

            // 可以直接使用addCell(str),不过不能指定字体,中文无法显示
            table.addCell(new Paragraph("hosjoy", Font));
            // 水平对齐
            table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(new Paragraph("第" + writer.getPageNumber() + "页/", hfFont));
            // 总页数
            PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));
            // 去掉表格边框
            cell.setBorder(Rectangle.BOTTOM);
            table.addCell(cell);
            // 将页眉写到document中,位置可以指定,指定到下面就是页脚
            table.writeSelectedRows(0, -1, 40, 20 , writer.getDirectContent());
        } catch (Exception de) {
            throw new ExceptionConverter(de);
        }
    }
    /**
    * 全部完成后,将总页数的pdf模版写到指定位置
    */
    @Override
    public void onCloseDocument(PdfWriter writer, Document document) {
        String text = "总" + (writer.getPageNumber()) + "页";
        ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,           hfFont), 2, 2, 0);
    }

// 代码部分
// 建一个Product 对象

package com.example.demo.pdf;

import java.util.ArrayList;
import java.util.List;

import lombok.Data;

/**
 * Product
 *
 * @author wangjun
 */
@Data
public class Product {
    private String productName;

    private String productCode;

    private Integer price;

    private String color;
    private String remark;

    public Product() {
    }

    public Product(String productName, String productCode, Integer price, String color, String remark) {
        this.productName = productName;
        this.productCode = productCode;
        this.price = price;
        this.color = color;
        this.remark = remark;
    }


    public List<Product> getProductList() {

      List<Product> products = new ArrayList<>();
        for(int i=1;i<100;i++){
            Product product1 = new Product("产品"+i, "cp"+i, 120+i, "红色"+i, "大卖"+i);
            products.add(product1);
        }
        Product product = new Product();
        product.setColor("222");
        products.add(product);
        return products;
    }
}

// 页眉页脚

package com.example.demo.pdf;

import java.io.IOException;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.ExceptionConverter;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * 页眉页脚&水印
 *
 * @author wangjun
 */
public class MyHeaderFooter extends PdfPageEventHelper {
    /**
     * 总页数
     */
    private PdfTemplate totalPage;
    private Font hfFont;
    private Font watermarkFont;

    {
        try {
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            hfFont = new Font(bfChinese, 8, Font.NORMAL);
            watermarkFont = new Font(bfChinese, 40, Font.BOLD, new GrayColor(0.95f));
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 打开文档时,创建一个总页数的模版
     */
    

// 测试

package com.example.demo.pdf;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.itextpdf.text.Anchor;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.DottedLineSeparator;
import com.itextpdf.text.pdf.draw.LineSeparator;

import lombok.extern.slf4j.Slf4j;

/**
 * 标题
 *
 * @author wangjun
 */

// 启动Spring Boot项目访问 /api/download-pdf


 
image.png

加密:
writer.setEncryption("pwd".getBytes(), "ownerPassword".getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
itext 5.5.13 版本需要引入依赖

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



https://www.jianshu.com/p/2c895ab46bf1

posted on 2022-04-19 09:14  Jun-Wang  阅读(412)  评论(0)    收藏  举报

导航