当前位置: 首页 > news >正文

Java 导出pdf 写出demo 1、需要设置自定义页眉和文字 2、可以插入表格 3、可以插入图片

以下是一个使用 iText 7 库实现 PDF 导出的 Java 示例,包含自定义页眉、文字、表格和图片功能:

添加 Maven 依赖

<dependencies><!-- iText 7 Core --><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version></dependency><!-- PDF Layout 扩展 --><dependency><groupId>com.itextpdf</groupId><artifactId>layout</artifactId><version>7.2.5</version></dependency>
</dependencies>

Java 示例代码

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.ColorConstants;
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.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.SolidBorder;
import com.itextpdf.layout.element.*;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.UnitValue;import java.io.File;
import java.io.IOException;public class PdfExportDemo {public static void main(String[] args) throws IOException {// 1. 创建PDF文档String dest = "demo.pdf";PdfWriter writer = new PdfWriter(dest);PdfDocument pdf = new PdfDocument(writer);Document document = new Document(pdf);// 添加自定义页眉处理器HeaderEventHandler handler = new HeaderEventHandler();pdf.addEventHandler(PdfDocumentEvent.START_PAGE, handler);// 2. 添加文字内容PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H");Paragraph title = new Paragraph("PDF导出示例").setFont(font).setFontSize(20).setBold().setTextAlignment(TextAlignment.CENTER);document.add(title);Paragraph content = new Paragraph("这是一个使用iText 7创建的PDF文档示例,展示了如何添加自定义页眉、文字、表格和图片。").setFont(font).setFontSize(12).setMarginTop(20);document.add(content);// 3. 添加表格Table table = new Table(UnitValue.createPercentArray(new float[]{2, 3, 2})).setWidth(UnitValue.createPercentValue(80)).setHorizontalAlignment(HorizontalAlignment.CENTER).setMarginTop(20);// 表头table.addHeaderCell(createCell("ID", true, font));table.addHeaderCell(createCell("产品名称", true, font));table.addHeaderCell(createCell("价格", true, font));// 表格内容table.addCell(createCell("001", false, font));table.addCell(createCell("Java编程指南", false, font));table.addCell(createCell("¥89.00", false, font));table.addCell(createCell("002", false, font));table.addCell(createCell("PDF生成教程", false, font));table.addCell(createCell("¥59.00", false, font));document.add(table);// 4. 添加图片String imagePath = "logo.png"; // 替换为实际图片路径if (new File(imagePath).exists()) {Image img = new Image(ImageDataFactory.create(imagePath)).setWidth(150).setHorizontalAlignment(HorizontalAlignment.CENTER).setMarginTop(30);document.add(img);} else {System.out.println("图片文件不存在: " + imagePath);}// 5. 关闭文档document.close();System.out.println("PDF生成成功: " + dest);}// 创建表格单元格辅助方法private static Cell createCell(String text, boolean isHeader, PdfFont font) {Cell cell = new Cell().add(new Paragraph(text).setFont(font));if (isHeader) {cell.setBackgroundColor(ColorConstants.LIGHT_GRAY);cell.setBold();}cell.setBorder(new SolidBorder(1));cell.setPadding(5);return cell;}// 自定义页眉处理器static class HeaderEventHandler implements IEventHandler {@Overridepublic void handleEvent(Event event) {PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfPage page = docEvent.getPage();Rectangle pageSize = page.getPageSize();PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), docEvent.getDocument());Canvas canvas = new Canvas(pdfCanvas, pageSize);// 绘制页眉文本Paragraph header = new Paragraph("公司机密文档 - 2023年度报告").setFontSize(10).setFontColor(ColorConstants.DARK_GRAY).setTextAlignment(TextAlignment.CENTER).setFixedPosition(0, pageSize.getTop() - 30, pageSize.getWidth());// 绘制页眉分隔线LineSeparator line = new LineSeparator(new SolidBorder(0.5f));line.setWidth(pageSize.getWidth() - 60);line.setMarginTop(5);line.setHorizontalAlignment(HorizontalAlignment.CENTER);canvas.add(header);canvas.add(line);canvas.close();}}
}

功能说明

  1. 自定义页眉

    • 使用 HeaderEventHandler 实现在每页顶部添加页眉
    • 包含居中文本和分隔线
    • 通过 PdfDocumentEvent.START_PAGE 事件触发
  2. 文字内容

    • 添加标题和正文段落
    • 支持中文字体(使用 STSong-Light
    • 设置字体大小、加粗、对齐方式等样式
  3. 表格功能

    • 创建3列表格(ID、产品名称、价格)
    • 设置表头背景色和单元格边框
    • 控制表格宽度和页面居中
  4. 图片插入

    • 从文件系统加载图片(需替换实际路径)
    • 设置图片宽度和居中显示
    • 添加错误处理(文件不存在时提示)

使用说明

  1. 替换图片路径:

    String imagePath = "your_image_path.png"; // 修改为实际图片路径
    
  2. 调整中文字体:

    • 如需使用其他中文字体,需引入字体文件:
    PdfFont font = PdfFontFactory.createFont("font_path.ttf", PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
    
  3. 运行程序:

    • 执行后生成 demo.pdf 文件
    • 完整功能包括:页眉、标题、正文、表格和图片

常见问题解决

  1. 中文显示问题

    • 确保使用支持中文的字体
    • 或添加额外中文字体依赖:
    <dependency><groupId>com.itextpdf</groupId><artifactId>font-asian</artifactId><version>7.2.5</version>
    </dependency>
    
  2. 图片路径错误

    • 使用绝对路径或确保相对路径正确
    • 添加文件存在检查逻辑
  3. 页眉位置调整

    • 修改 setFixedPosition 的 Y 坐标值:
    .setFixedPosition(0, pageSize.getTop() - 40, pageSize.getWidth()); // 调整-40值
    

这个示例提供了完整的 PDF 导出功能,可根据实际需求调整样式和内容布局。

http://www.dtcms.com/a/269434.html

相关文章:

  • MSPM0G3519-PA23 引脚无法使用
  • 小米YU7预售现象深度解析:智能电动汽车的下一个范式革命
  • Vue、Laravel 项目初始化命令对比 / curl 命令/ CORS 机制总结与案例
  • react的条件渲染【简约风5min】
  • Rust 仿射类型(Affine Types)
  • 在 Vue2 与 Vue3 中,面对 **大数据量交互体验优化** 和 **ECharts 大数据渲染性能优化**
  • 文风写作模仿各种公文范文快速生成初稿
  • MySQL字符串函数全解析
  • 设计模式笔记_创建型_建造者模式
  • Android 15应用适配指南
  • .NET9 实现对象深拷贝和浅拷贝的性能测试
  • 【Node.js】文本与 pdf 的相互转换
  • 大数据平台之ranger与ldap集成,同步用户和组
  • 手机、平板音频软件开发调测常用命令
  • 【字节跳动】数据挖掘面试题0013:怎么做男女二分类问题, 从抖音 app 提供的内容中。
  • Ubuntu 22.04 安装英伟达驱动
  • 【PTA数据结构 | C语言版】返回单链表 list 中第 i 个元素值
  • [论文阅读] 软件工程 | 自适应CPS中的人机协作与伦理
  • Spring Batch终极指南:原理、实战与性能优化
  • 掌握Linux信号集操作技巧
  • 人工智能-基础篇-25-认识一下LLM开发应用框架--LangChain
  • RAGflow图像解析与向量化分析
  • Vue 2现代模式打包:双包架构下的性能突围战
  • 【芯片测试篇】:93K测试机I2C的设置和调试
  • 计算机网络:(八)网络层(中)IP层转发分组的过程与网际控制报文协议 ICMP
  • 【排序】插入排序
  • 深入了解linux系统—— System V之消息队列和信号量
  • Flask 解决 JSON 返回中文乱码问题方案
  • Bright Data MCP+Trae :快速构建电商导购助手垂直智能体
  • MySQL Galera Cluster部署