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.pswp.cn/bicheng/88280.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ntfs!LfsReadRestart函数分析得到Ntfs!LFS_RESTART_PAGE_HEADER

第一部分&#xff1a;0: kd> p Ntfs!LfsPinOrMapData0x8c: f71797f6 ff15a40016f7 call dword ptr [Ntfs!_imp__CcPinRead (f71600a4)] 0: kd> t nt!CcPinRead: 80bf9a5a 6a2c push 2Ch 0: kd> kc# 00 nt!CcPinRead 01 Ntfs!LfsPinOrMapData 02 N…

skywalking-agent-docker镜像

FROM centos:7.9.2009 USER root# 定义 Arthas 目录环境变量 ENV ARTHAS_HOME/opt/arthas# 更改 YUM 源并清理缓存 RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak && \rm -rf /etc/yum.repos.d/* && \curl -o /etc/yum.rep…

数据库开发运维的集成:弥合开发与运维之间的鸿沟

在传统的软件开发工作流程中&#xff0c;数据库变更往往是事后才考虑的问题。应用程序代码遵循定义明确的开发运维实践&#xff0c;包括版本控制、自动测试和持续部署&#xff0c;而数据库变更则经常是由数据库管理员手动执行的高风险操作。这种脱节造成了瓶颈&#xff0c;带来…

PiscTrace应用:从 YOLO-Pose 到深蹲与引体向上计数:实时健身动作分析与实现

随着健身行业的发展&#xff0c;越来越多的智能应用涌现&#xff0c;用于帮助健身者更好地记录和分析运动情况。特别是在体能训练中&#xff0c;俯卧撑和引体向上是两个非常常见的动作&#xff0c;它们通常用来锻炼上半身力量和耐力。为了使训练更加科学和高效&#xff0c;实时…

【unity】webCanvas.enabled = false;和webCanvas.gameObject.SetActive(false);的优缺点比较

在 Unity 中&#xff0c;webCanvas.gameObject.SetActive(false) 和 webCanvas.enabled false 是两种不同的隐藏 UI 的方式&#xff0c;它们的核心区别在于作用范围和对组件状态的影响。理解这些差异能帮助你避免初始化失败、性能问题和逻辑错误。 1核心区别 gameObject.SetAc…

深入探索 pnpm:高效磁盘利用与灵活的包管理解决方案

引言 在现代 JavaScript 开发中&#xff0c;依赖管理效率直接影响开发体验。传统工具如 npm 和 yarn 在大型项目中常面临磁盘冗余和性能瓶颈。pnpm&#xff08;Performant npm&#xff09;通过创新的硬链接和符号链接机制&#xff0c;解决了这些痛点。本文将深入解析 pnpm 的核…

Hive MetaStore的实现和优化

在大数据领域&#xff0c;数据管理与存储至关重要&#xff0c;Hive MetaStore&#xff08;HMS&#xff09;作为 Hive 数据仓库的核心组件&#xff0c;承担着元数据管理的关键职责。随着数据规模不断膨胀&#xff0c;其性能与稳定性面临挑战。本文将深入剖析 HMS 的实现机制&…

一文读懂动态规划:多种经典问题和思路

一、动态规划算法的思想与核心概念框架 1. 动态规划的基本思想 动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并利用子问题的解来高效解决原问题的方法。其核心思想是避免重复计算&#xff0c;通过存储中间结果&a…

阿幸课堂随机点名

代码功能 这个是一个HTML网页端&#xff0c;简单来说就是可以双击之后运行进行点名。 当然&#xff0c;不局限于课堂点名 代码功能 Excel 导入增强&#xff1a; 增加了列选择器&#xff0c;可以指定从哪一列读取学生姓名 增加了起始行选择器&#xff0c;可以跳过标题行或其…

LeetCode 560: 和为K的子数组

题目描述给定一个整数数组 nums 和一个整数 k&#xff0c;请统计并返回该数组中和为 k 的连续子数组的个数。示例 1&#xff1a;输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a;输入&#xff1a;nums [1,2,3], k 3 输出&#xff1a;2提示&#xff…

微软官方C++构建工具:历史演变、核心组件与现代实践指南

引言&#xff1a;C构建工具的战略意义 在Windows生态系统中&#xff0c;​​微软C构建工具​​&#xff08;Microsoft C Build Tools&#xff09;构成了数百万开发者和应用程序的技术基石。从早期的MS-DOS命令行工具到如今支持​​跨平台开发​​的现代化工具链&#xff0c;微…

探索Cocos_CoilTheRope:一款创新的游戏引擎扩展项目

探索Cocos_CoilTheRope&#xff1a;一款创新的游戏引擎扩展项目 去发现同类优质开源项目:https://gitcode.com/ 是一个基于Cocos2d-x游戏引擎的扩展库&#xff0c;旨在为开发者提供一种简便的方法来实现绳子缠绕和物理交互效果。该项目由DreamLXW开发并维护&#xff0c;为游戏…

爬虫-正则表达式

在线正则表达式测试OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具&#xff0c;提供jsbin在线 CSS、JS 调试&#xff0c;在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器&#xff0c;MarkDown编译器等其他在线工具https://tool.oschina.net/…

【BTC】数据结构

目录 那比特币区块链的组织形式到底是以链表的形式&#xff0c;还是树的形式呢&#xff1f; 区块头和区块体与默克尔树的关系 默克尔证明详解 区块链和链表最大的区别就是区块链用哈希指针代替了普通指针。 链表的指针就是指向一个结构体在内存中的地址&#xff0c;而哈希指…

飞算 JavaAI:让 Java 开发效率飙升的智能助手,日常开发全场景应用指南

飞算 JavaAI&#xff1a;让 Java 开发效率飙升的智能助手 &#xff0c;日常开发全场景应用指南 在 Java 开发的日常工作中&#xff0c;开发者常常面临各类重复性劳动与逻辑复杂度挑战。飞算 JavaAI 作为专注于 Java 领域的智能开发助手&#xff0c;能够覆盖从代码生成到项目维护…

8.2 文档预处理模块(二)

一、从0开始&#xff1a;简易RAG实现 在构建更复杂的 RAG 架构之前&#xff0c;我们先从最基础的版本入手。整个流程可以分为以下几个关键步骤&#xff1a; 1.数据导入&#xff1a;加载并预处理原始文本数据&#xff0c;为后续处理做好准备。 2.文本分块&#xff1a;将长文本…

【系统与工具】Linux——Linux简介、安装、简单使用

计算机概论与Linux简介 计算机概论Linux介绍与版本 Linux的规划与安装 Linux与硬件平台密切相关规划硬件与Linux安装 主机规划与磁盘分区安装CentOS、多重引导 简单使用 帮助手册文本编辑器关机 0. Linux介绍与版本 操作系统&#xff08;Linux&#xff09;&#xff1a;高效…

从视频数据到数字孪生:如何构建虚拟与现实的桥梁?

概述 视频数据与三维场景融合渲染技术通过将动态视频与静态三维模型结合&#xff0c;利用GPU加速、WebGL渲染、数字孪生等技术&#xff0c;实现虚拟与现实的交互式融合。该技术广泛应用于智慧城市、工业监控、虚拟现实、游戏特效等领域&#xff0c;能够提升场景的直观性和用户沉…

【笔记】开源 AI Agent 项目 V1 版本 [新版] 部署 日志

kortix-ai/suna at v1 一、最新版本号 V1 二、部署截图 本地开发环境仍然依赖于 Poetry 环境&#xff1a; &#xff08;Python>3.11,<3.13&#xff09; 创建本地 Poetry 虚拟环境 Python 多版本环境治理理念驱动的系统架构设计&#xff1a;三维治理、四级隔离、五项自…

NumPy-梯度与导数计算详解

NumPy-梯度与导数计算详解一、梯度与导数的基本概念1. 导数的定义2. 梯度的定义二、NumPy中的梯度计算函数&#xff1a;np.gradient()1. 函数语法2. 一维数组的梯度计算3. 多维数组的梯度计算三、基于梯度的导数近似方法1. 前向差分2. 中心差分四、实际应用场景1. 函数优化2. 数…