如何通过Java的iTextPDF库制作一个PDF表格模板并填充数据

要使用Java的iTextPDF库制作一个PDF表格模板并填充数据,你需要遵循以下步骤:

  1. 添加依赖:首先,确保你的项目中包含了iTextPDF库的依赖。如果你使用Maven,可以在你的pom.xml文件中添加以下依赖:
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version>
</dependency>
  1. 创建PDF模板:你可以使用iTextPDF创建一个简单的PDF模板,或者使用其他工具(比如Adobe Acrobat)创建PDF模板,并在模板中添加表格。

  2. 填充表格数据:使用iTextPDF API向PDF模板中的表格填充数据。

下面是一个简单的例子,演示如何使用PDFBox创建一个包含表格的PDF文档,并向表格中填充数据:

import com.google.common.collect.Lists;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;import java.io.File;
import java.io.FileOutputStream;
import java.util.List;public class ITextPDFExample {public static void main(String[] args) {// 保存的pdf全路径String outPdfPath = "/path/out.pdf";// pdf中表格需要填充的数据List<List<String>> data = Lists.newArrayList();data.add(Lists.newArrayList("列1值", "列2值", "列3值", "列4值", "列5值"));//创建文件Document document = new Document(PageSize.A4);File file = new File(outPdfPath);try {PdfWriter.getInstance(document, new FileOutputStream(file));//打开文件document.open();//BaseFont-确认支持中文String fontPath = "/path/to/your/chinese/font.ttf";// 创建BaseFont对象,指定字体路径和编码BaseFont bfChinese = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);Font fontChineseTitle = new Font(bfChinese, 12, Font.NORMAL);String contentTitle = "标题";Paragraph paragraphTitle = new Paragraph(contentTitle, fontChineseTitle);paragraphTitle.setAlignment(Element.ALIGN_CENTER);document.add(paragraphTitle);Paragraph blankRow1 = new Paragraph(18f, " ", fontChineseTitle);document.add(blankRow1);Font fontChineseParagraph = new Font(bfChinese, 12, Font.NORMAL);String contentParagraph2 = "文本内容1";Paragraph paragraph2 = new Paragraph(contentParagraph2, fontChineseParagraph);paragraph2.setFirstLineIndent(28);document.add(paragraph2);paragraphTitle.setSpacingAfter(100);paragraphTitle.setSpacingBefore(100);Paragraph blankRow2 = new Paragraph(18f, " ", fontChineseParagraph);document.add(blankRow2);Font fontChineseTable = new Font(bfChinese, 12, Font.NORMAL);PdfPTable table = new PdfPTable(5);List<PdfPRow> listRow = table.getRows();//设置列宽float[] columnWidths = {10, 27, 24, 16, 23};table.setWidths(columnWidths);//行1PdfPCell[] cells1 = new PdfPCell[5];PdfPRow row1 = new PdfPRow(cells1);//单元格cells1[0] = new PdfPCell(new Paragraph("列1", fontChineseTable));cells1[0].setBorderColor(BaseColor.BLACK);cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);cells1[1] = new PdfPCell(new Paragraph("列2", fontChineseTable));cells1[1].setBorderColor(BaseColor.BLACK);cells1[1].setVerticalAlignment(Element.ALIGN_MIDDLE);cells1[2] = new PdfPCell(new Paragraph("列3", fontChineseTable));cells1[2].setBorderColor(BaseColor.BLACK);cells1[2].setVerticalAlignment(Element.ALIGN_MIDDLE);cells1[3] = new PdfPCell(new Paragraph("列4", fontChineseTable));cells1[3].setBorderColor(BaseColor.BLACK);cells1[3].setVerticalAlignment(Element.ALIGN_MIDDLE);cells1[4] = new PdfPCell(new Paragraph("列5", fontChineseTable));cells1[4].setBorderColor(BaseColor.BLACK);cells1[4].setVerticalAlignment(Element.ALIGN_MIDDLE);//把第一行添加到集合listRow.add(row1);for (int i = 0; i < data.size(); i++) {PdfPCell[] cellsi = new PdfPCell[5];PdfPRow rowi = new PdfPRow(cellsi);cellsi[0] = new PdfPCell(new Paragraph(data.get(i).get(0), fontChineseParagraph));cellsi[0].setBorderColor(BaseColor.BLACK);cellsi[0].setVerticalAlignment(Element.ALIGN_MIDDLE);cellsi[1] = new PdfPCell(new Paragraph(data.get(i).get(1), fontChineseParagraph));cellsi[1].setBorderColor(BaseColor.BLACK);cellsi[1].setVerticalAlignment(Element.ALIGN_MIDDLE);cellsi[2] = new PdfPCell(new Paragraph(data.get(i).get(2), fontChineseParagraph));cells1[2].setBorderColor(BaseColor.BLACK);cells1[2].setVerticalAlignment(Element.ALIGN_MIDDLE);cellsi[3] = new PdfPCell(new Paragraph(data.get(i).get(3), fontChineseParagraph));cellsi[3].setBorderColor(BaseColor.BLACK);cellsi[3].setVerticalAlignment(Element.ALIGN_MIDDLE);cellsi[4] = new PdfPCell(new Paragraph(data.get(i).get(4), fontChineseParagraph));cellsi[4].setBorderColor(BaseColor.BLACK);cellsi[4].setVerticalAlignment(Element.ALIGN_MIDDLE);listRow.add(rowi);}//把表格添加到文件中document.add(table);Paragraph blankRow3 = new Paragraph(18f, " ", fontChineseParagraph);document.add(blankRow3);String contentParagraph4 = "文本内容2";Paragraph paragraph4 = new Paragraph(contentParagraph4, fontChineseParagraph);paragraph4.setAlignment(Element.ALIGN_RIGHT);document.add(paragraph4);String contentParagraph5 = "文本内容3";;Paragraph paragraph5 = new Paragraph(contentParagraph5, fontChineseParagraph);paragraph5.setAlignment(Element.ALIGN_RIGHT);document.add(paragraph5);//关闭文档document.close();} catch (Exception e) {e.printStackTrace();}}
}

在这个例子中,你需要替换fontPath的值为你的中文字体文件的实际路径。BaseFont.IDENTITY_H是指定字体编码的参数,它表示字体将支持Unicode字符集的水平显示,这对于渲染中文字符是必须的。BaseFont.NOT_EMBEDDED参数表示字体不会被嵌入到PDF文档中,如果你想要确保PDF在不同设备上的兼容性,你可能需要将字体嵌入到PDF中,这时可以将此参数改为BaseFont.EMBEDDED。
如果你的PDF模板是预先存在的,并且包含可编辑的表单字段,你可以使用PDDocumentPDAcroForm类来填充这些字段,而不是手动绘制表格。这通常是处理复杂模板的更好方法。

Java的iTextPDF库和Apache PDFBox库都是用于生成PDF文档的开源库,它们有一些区别,适用于不同的场景。

  1. iTextPDF库:
    • iTextPDF是一个功能强大且灵活的PDF库,支持创建、修改和处理PDF文档。
    • iTextPDF提供了丰富的API和功能,可以创建复杂的PDF文档,包括表格、图像、水印、书签等。
    • iTextPDF支持各种字体、颜色和样式的自定义,可以实现高度定制化的PDF生成。
    • iTextPDF有商业和开源版本可用,商业版本提供了更多的功能和支持。

适用场景:

  • 需要创建复杂的PDF文档,包括表格、图像、水印、书签等。
  • 需要高度定制化的PDF生成。
  • 需要商业版本提供的额外功能和支持。
  1. Apache PDFBox库:
    • Apache PDFBox是一个功能强大的PDF库,主要用于处理和操作PDF文档。
    • PDFBox提供了一系列的API,可以读取、创建、修改和提取PDF文档的内容。
    • PDFBox支持文本提取、图像提取、加密解密、表单处理等功能。
    • PDFBox的API相对较底层,需要开发者对PDF文档结构和操作有一定的了解。

适用场景:

  • 需要处理和操作PDF文档的内容,如文本提取、图像提取、加密解密、表单处理等。
  • 对PDF文档结构和操作有一定的了解。

总的来说,如果你需要创建复杂的PDF文档并且需要高度定制化,可以选择iTextPDF库。如果你主要需要处理和操作PDF文档的内容,可以选择Apache PDFBox库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199428.shtml

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

相关文章

IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)

除此之外&#xff0c;其他常用的光标移动快捷键包括&#xff1a; Shift 滚轮前后滚动&#xff1a;当前文件的横向滚动轴滚动。Shiftenter&#xff1a;快速将鼠标移动到下一行。Ctrl ]&#xff1a;移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键&#xff1a;光标跳转…

Linux内核同步与互斥机制介绍

在内核中&#xff0c;可能出现多个进程&#xff08;通过系统调用进入内核模式&#xff09;访问同一个对象、进程和硬中断访问同一个对象、进程和软中断访问同一个对象、多个处理器访问同一个对象等现象&#xff0c;我们需要使用互斥技术&#xff0c;确保在给定的时刻只有一个主…

内衣迷你洗衣机什么牌子好?好用不贵的内衣洗衣机推荐

由于内衣洗衣机在目前的市场上越来越受欢迎&#xff0c;使得不少的小伙伴都在犹豫要不要为自己入手一台专用的内衣洗衣机&#xff0c;专门来清洗一些内衣裤等等贴身衣物&#xff0c;这个问题的答案是很有必要的&#xff0c;因为目前市场上的家用大型洗衣机对衣物只能够起到清洁…

SpringBoot_02

Web后端开发_07 SpringBoot_02 SpringBoot原理 1.配置优先级 1.1配置 SpringBoot中支持三种格式的配置文件&#xff1a; application.propertiesapplication.ymlapplication.yaml properties、yaml、yml三种配置文件&#xff0c;优先级最高的是properties 配置文件优先级…

前端又出新轮子Nue.js,但还是低代码更香!

前言 别TM卷了&#xff01;&#xff01;&#xff01; 自从前后端分离以来&#xff0c;前端前端的车轮滚滚向前&#xff0c;轮子造的越来越圆。每个人都在适应这个轮子的节奏&#xff0c;稍微不注意就会被甩出车轮之外。 调侃归调侃&#xff0c;既然口子已经开了&#xff0c;…

一键抠图2:C/C++实现人像抠图 (Portrait Matting)

一键抠图2&#xff1a;C/C实现人像抠图 (Portrait Matting) 目录 一键抠图2&#xff1a;C/C实现人像抠图 (Portrait Matting) 1. 前言 2. 抠图算法 3. 人像抠图算法MODNet &#xff08;1&#xff09;模型训练 &#xff08;2&#xff09;将Pytorch模型转换ONNX模型 &…

作业12.5

1.定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同的表演行为。 #include <iostream>using namespace std; class Animal { private:int weight; public:Animal(){}Animal(int weight):weight(weight){}virtual …

LightDB to_char 三入参函数支持

文章目录 背景函数示例 背景 在信创适配中&#xff0c;从Oracle迁移过来的程序使用了TO_CHAR函数。 LightDB-X 23.3版本已经支持了两个入参的TO_CHAR函数&#xff0c;并不支持三个入参的TO_CHAR函数。LightDB-X 23.4版本对三个入参的TO_CHAR函数进行了支持。 函数示例 准备…

全网最新最牛的Appium自动化:Appium常用操作之TouchAction操作

TouchAction操作 Appium的辅助类&#xff0c;主要针对手势操作&#xff0c;比如滑动、长按、拖动等。其原理是将一系列的动作放在一个链条中&#xff0c;然后将该链条传递给服务器。服务器接受到该链条后&#xff0c;解析各个动作&#xff0c;逐个执行。 TouchAction类支持的动…

laravel 自定义密码验证方式

继承 EloquentUserProvider <?phpnamespace App\Providers;use Illuminate\Auth\EloquentUserProvider; use Illuminate\Contracts\Auth\ Authenticatable as UserContract;class ApiEloquentUserProvider extends EloquentUserProvider {public function validateCredent…

如何销售汽车之 汽车销售技巧和话术

如何销售汽车之 汽车销售技巧和话术 当前&#xff0c;汽车销售市场的竞争日益激烈&#xff0c;消费者对汽车的需求和要求也越来越高。但是市场竞争车型也非常多&#xff0c;如何更好的做好销售业绩突破&#xff0c;提高汽车销量&#xff0c;创造汽车销售佳绩&#xff0c;就需要…

什么是网络爬虫?有什么用?怎么爬?

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 【导读】 网络爬虫也叫做网络机器人&#xff0c;可以代替人们自动地在互联网中进行数据信息的采集与整理。 在大数据时代&#xff0c;信息的采集是一项重要的工作&#xff0c;如果单纯靠人力进行信息采集&#xff0c;不仅低…

线程池,及7大参数,4大拒绝策略

1. 线程池的基本概念 线程池由以下几个主要组件构成&#xff1a; 任务队列&#xff08;Task Queue&#xff09;&#xff1a; 用于存储等待执行的任务。工作线程池&#xff1a; 用于执行任务的线程集合。线程工厂&#xff08;Thread Factory&#xff09;&#xff1a; 用于创建…

k8s 安装部署

一&#xff0c;准备3台机器&#xff0c;安装docker&#xff0c;kubelet、kubeadm、kubectl firewall-cmd --state 使用下面命令改hostname的值&#xff1a;(改为k8s-master01)另外两台改为相应的名字。 172.188.32.43 hostnamectl set-hostname k8s-master01 172.188.32.4…

Matlab 生成license

参考下面两个帖子 https://ww2.mathworks.cn/matlabcentral/answers/389888-matlab https://www.mathworks.com/matlabcentral/answers/131749-id-id-id-id 登陆 https://ww2.mathworks.cn/licensecenter 针对R2020b版本,点击下面红框生成 ip addr | grep ether看第一行 根据…

Geodesic in Heat: 一种测地线计算方法

在之前的博客中&#xff0c;我已经介绍过了使用Fast Marching算法计算测地线。Fast Marching的好处是实现简单&#xff0c;方便扩展在点云上。但是缺点是精度不够&#xff0c;求解不平滑。早在2013年&#xff0c;Crane et al. [1]就已经提出利用热流来估算测地距离。我很早就知…

Hadoop学习笔记(HDP)-Part.14 安装YARN+MR

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

一文7个步骤教你搭建测试web测试项目实战环境,

​今天小编&#xff0c;给大家总结下web 测试实战的相关内容&#xff0c;一起来学习下吧&#xff01; web项目实战可按顺序依次为&#xff1a;【搭建测试环境】、【需求评审】、【编写测试计划】、【分析测试点.编写测试用例】、【用例评审】、【执行用例提bug】、【测试报告】…

编写并调试运行一个简单的 Java 应用程序,显示自己的学号、姓名、兴趣爱好等。

源代码&#xff1a; public class Main { public static void main(String[] args) { System.out.println("学号是:""0233217821"); System.out.println("姓名是:""赵港"); System.out.println("兴趣爱好是:""运动&qu…

想要精确搜索商品详情?闲鱼电商API接口帮你实现!

闲鱼电商API接口是一种为开发者提供的强大工具&#xff0c;它能够帮助开发者轻松获取闲鱼平台上的商品信息&#xff0c;实现精确搜索商品详情功能。无论你是想要开发一个自有电商平台&#xff0c;还是需要定制商品搜索功能&#xff0c;闲鱼电商API接口都能够满足你的需求。 API…