效果:
maven依赖
<!--PDF处理--><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency>
代码:
import cn.hutool.core.date.DateUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import lombok.SneakyThrows;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @projectName: util-cloud* @package: com.zxw.controller* @className: PDFController* @author: zhangxuewei* @description: TODO* @date: 2023/9/8 9:52* @version: 1.0*/
@RestController
@RequestMapping("/pdf")
public class PDFController {@GetMapping("/generate-pdf3")public void generatePdf3(HttpServletResponse response) throws IOException, DocumentException {// 设置响应内容类型为PDFresponse.setContentType("application/pdf");response.setHeader("Content-Disposition", "attachment; filename=sample.pdf");// 设置中文字体,这里使用了 楷体常规BaseFont bf = BaseFont.createFont("c://windows//fonts//simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);Font font = new Font(bf, 12);// 创建PDF文档Document document = new Document();PdfWriter pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());// 添加水印pdfWriter.setPageEvent(new WatermarkPageEvent());// 打开文档document.open();// 添加中文内容Paragraph paragraph = new Paragraph("你好,iText 5!", font);document.add(paragraph);font.setColor(BaseColor.GREEN);Paragraph paragraphc = new Paragraph("这是一个字体颜色为绿色的段落", font);document.add(paragraphc);Font font2 = new Font(bf, 18, Font.BOLD);Paragraph paragraph2 = new Paragraph("这是一个字体大小为18的粗体段落", font2);document.add(paragraph2);Font fontb = new Font(bf, 12);Chunk yellowChunk = new Chunk(" 这是一个背景颜色为黄色的段落 ", fontb);yellowChunk.setBackground(BaseColor.YELLOW);Paragraph paragraphcb = new Paragraph();paragraphcb.add(yellowChunk);document.add(paragraphcb);// 创建表格PdfPTable table = new PdfPTable(3); // 3列的表格table.setWidthPercentage(100);table.setSpacingBefore(10f);table.setSpacingAfter(10f);// 第一行数据PdfPCell cell1 = new PdfPCell(new Paragraph("列1"));cell1.setBorderColor(BaseColor.BLUE);cell1.setPadding(5);PdfPCell cell2 = new PdfPCell(new Paragraph("列2"));cell2.setBorderColor(BaseColor.RED);cell2.setPadding(5);PdfPCell cell3 = new PdfPCell(new Paragraph("列3"));cell3.setBorderColor(BaseColor.GREEN);cell3.setPadding(5);table.addCell(cell1);table.addCell(cell2);table.addCell(cell3);document.add(table);// 关闭文档document.close();}// 自定义页面事件类来添加水印static class WatermarkPageEvent extends PdfPageEventHelper {@SneakyThrows@Overridepublic void onEndPage(PdfWriter writer, Document document) {BaseFont bf = BaseFont.createFont("c://windows//fonts//simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);Font font = new Font(bf, 24, Font.NORMAL, new BaseColor(128, 128, 128));// 获取页面大小Rectangle pageSize = document.getPageSize();String now = DateUtil.now();String info = " 张学伟 " + now;for (int i = 0; i < 5; i++) {info += info;}// 创建水印文本PdfContentByte content = writer.getDirectContentUnder();PdfGState gs = new PdfGState();gs.setFillOpacity(0.4f); // 设置透明度content.setGState(gs);float xInterval = 100; // 水印之间的水平间隔float yInterval = 100; // 水印之间的垂直间隔// Y坐标为0,沿X轴每间隔100生成水印信息for (float x = 0; x < pageSize.getWidth(); x = x + xInterval) {ColumnText.showTextAligned(content,Element.ALIGN_CENTER, new Phrase(info, font),x, 0, 45);}// X坐标为0,沿Y轴每间隔100生成水印信息for (float y = 100; y < pageSize.getHeight(); y = y + xInterval) {ColumnText.showTextAligned(content,Element.ALIGN_CENTER, new Phrase(info, font),0, y, 45);}}}}