Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iText的使用

iText的使用

作者头像
LeoXu
发布于 2018-08-15 06:31:29
发布于 2018-08-15 06:31:29
2.4K00
代码可运行
举报
文章被收录于专栏:LeoXu的博客LeoXu的博客
运行总次数:0
代码可运行

一、如何创建一个PDF文件,并向里面添加文字。

首先要getInstance并open一个Document对象,该对象也就代表了这个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Document document = new Document(PageSize.A4);
PdfWriter.getInstance(
  document, new FileOutputStream(localFileFullPathName)
);
document.open();

然后就可以通过调用document对象的add来添加各种内容了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.add(table);

二、表格操作

表格是new出来的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PdfPTable table = new PdfPTable(1);

带有一个入参的构造方法,这个参数表示表格的列数。这样构造出表格对象之后,就可以再构造出一个一个的PdfPCell单元格对象,然后逐个从左至右,从上至下逐个通过addCell方法添加到表格对象中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PdfPCell cell3 = new PdfPCell();
cell3.setBorder(0);//不显示单元格的边框
Paragraph paragraph9 = new Paragraph("test");//Paragraph 是段落对象类
paragraph9.setSpacingBefore(12);
cell3.addElement(paragraph9);
table.addCell(cell3);

表格的列宽也可以调用方法来进行设置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PdfPTable table = new PdfPTable(3);
table.setLockedWidth(true);
table.setWidthPercentage(100);
float[] columnWidths = {177,176,176};//采用点数制单位
table.setTotalWidth(columnWidths);

还有各种样式的调整方法,可参考iText的API文档。

三、点数制单位(参考了百度知道)

1点(pt)=1/72(英寸)inch 1英寸=25.4毫米mm搜索

pt全称为point,但中文不叫“点”,查英语字典可以看到,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸。所以它是一个自然界标准的长度单位,也称为“绝对长度”。

1in = 2.54cm = 25.4 mm = 72pt = 6pc

因此就有这样的说法,在网页设计中,pixel是相对大小,而point是绝对大小。

中文字号制与点数制的对照关系:{macro}{Chinese Font Size} 。1770年法国人狄道(F.A.Didot)制定点数制,规定1法寸为72点,即:1点=0.3759毫米。狄道点数制在法国、德国、奥地利、比利时、丹麦、匈牙利等国比较流行。1886年全美活字铸造协会以派卡(pica)为基准制定派卡点数制,规定1pica=12point(点),即:fbox{1点=0.013837英寸=0.35146毫米} 20世纪初派卡点数制传入我国,并得到逐步推广。在实用中对常用点数以号数命名而产生了号数制,二者换算如下(以pt代表“点”):

初号= 42pt;小初号= 36pt;一号= 28pt;二号= 21pt;小二号= 18pt;三号= 15.75pt;四号= 14pt;

小四号= 12pt;五号= 10.5pt;小五号= 9pt;六号= 7.875pt;七号= 5.25pt。

四、如何添加图片

iText的jar包里面有一个Image类。

可以通过图片文件的BASE64字符串来生成Image对象实例,然后添加到pdf文档或者文档的子要素中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String imageBase64Data = Base64DataUtils.getData(imageDataKeyName);
Image image = Image.getInstance(Base64.decodeBase64(imageBase64Data.getBytes()));
image.scaleToFit(140F, 70F);
PdfPCell cell = new PdfPCell(image, false);
cell.setBorder(0);
//TODO ...

除了上面的代码所提供的方式,还有直接添加到PDF文档Document对象上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Image image = Image.getInstance(Base64.decodeBase64(imageBase64Data.getBytes()));
image.setAbsolutePosition(400, 30);//以左下角作为原点的坐标平面上的绝对位置
image.scaleToFit(150, 150);//相对尺寸范围,图片会缩放成这个范围内的最大尺寸
document.add(image);

使用PdfStamper对象操作pdf文件模板来生成文档时,还以从PdfStamper对象获取到代表某一页上覆盖内容的PdfContentByte对象,之后就可以在这个对象上调用addImage方法来添加图片了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PdfReader reader = new PdfReader(TEMPLATE_FILE_FULL_PATH);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
PdfContentByte overContent = ps.getOverContent(8);
//...
Image image = Image.getInstance(Base64.decodeBase64(imageBase64Data.getBytes()));
image.setAbsolutePosition(posX, posY);
image.scaleToFit(scaleFitW, scaleFitH);
overContent.addImage(image);

五、处理中文字体

很多同学都在向文档中添加含有中文内容的要素时遇到问题,只要是中文(其实还有其他很多字符都会有这个情况,中文只是其中一个子集)的地方就显示空白。一般是缺少字体库造成的,说得明白点,就是程序找不到对这个文字的定义,所以就显示。

网上搜索一般说只要添加一个itextasia.jar到classpath就能轻松解决,但是我发现对于初学者这样做并不轻松,倒不如找一个字符定义全的字体文件(ttf格式的)引入来得保险,不过这样做的话,通常会要在代码中加载一个几M到几十M不等的ttf文件,不知道iText对这样的操作有没有做性能优化了。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BaseFont bfFangSong = BaseFont.createFont(
		"fonts/SIMFANG.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED
), bf;//这里ttf就跟代码放到一起
bf = bfFangSong;
Font font1 = new Font(bf, 10);//字体大小
Paragraph paragraph1 = new Paragraph("中文字符", font1);
PdfPCell cell1 = new PdfPCell();
cell1.setBorder(0);
cell1.addElement(paragraph1);
PdfPTable table = new PdfPTable(1);
table.setWidthPercentage(100);
table.addCell(cell1);

只要ttf文件里面对字符的定义全的话,基本上就不会出什么问题了。

六、通过模板来生成文档

首先需要有一个模板,也是pdf格式的,里面会有可输入的表单元素,这样的元素可以通过在利用Adobe Acrobat编辑PDF模板文件时加入。

每个表单元素都会添加名称,这样在代码中就可以通过这个名称来向生成的PDF文件中插值,实现通过模板来生成文档。

有了模板之后,就可以生成利用PdfReader来生成PdfStamper对象,对模板进行各种操作(如插值还有添加额外的一些内容),最后导出新的PDF文件。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//通过 PdfReader 和 ByteArrayOutputStream 来生成 PdfStamper 实例
PdfReader reader = new PdfReader(TEMPLATE_FILE_FULL_PATH);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
//获取到所有的表单域
AcroFields s = ps.getAcroFields();
//也可以设置表单域的字体
BaseFont bfFangSong = BaseFont.createFont(
		FONT_FANG_SONG, BaseFont.IDENTITY_H, BaseFont.EMBEDDED
), bf;
bf = bfFangSong;
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
s.setSubstitutionFonts(fontList);
//插值
Map<String, Item> fieldsMap = s.getFields();
Set<String> keySet = fieldsMap.keySet();
for (String key : keySet) {
	s.setField(key, filedValues.getString(key, ""));
}
ps.setFormFlattening(true);
//导出
	ps.close();
try {
	fos = new FileOutputStream(saveFileFullPath);
	fos.write(bos.toByteArray());
    fos.flush();
} catch (Exception e) {
	e.printStackTrace();
	throw e;
} finally {
	if (null != fos) {
		fos.close();
	}
}

额外内容,比如图片,可以通过第四节介绍的方法来添加。

七、拼接pdf文档

有时也会有这样的需求,就是将两个或者多个pdf文件合并到一起生成一个新的pdf文件,这里有一个从网上copy的代码可以直接拿来用,经测试有效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.ailk.server.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
/**
 * pdf文件拼接工具 2017-01-10
 *
 */
public class iTextPdfConcatUtils {
	/**
	 * 拼接多个pdf文件
	 * 
	 * @param path1
	 * @param path2
	 */
	public static void concatPDFs(
			List<InputStream> streamOfPDFFiles,
			OutputStream outputStream, 
			boolean paginate
	) {
		Document document = new Document();
		try {
			List<InputStream> pdfs = streamOfPDFFiles;
			List<PdfReader> readers = new ArrayList<PdfReader>();
			int totalPages = 0;
			Iterator<InputStream> iteratorPDFs = pdfs.iterator();
			// Create Readers for the pdfs.
			while (iteratorPDFs.hasNext()) {
				InputStream pdf = iteratorPDFs.next();
				PdfReader pdfReader = new PdfReader(pdf);
				readers.add(pdfReader);
				totalPages += pdfReader.getNumberOfPages();
			}
			// Create a writer for the outputstream
			PdfWriter writer = PdfWriter.getInstance(document, outputStream);
			document.open();
			BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,
					BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
			PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
			// data
			PdfImportedPage page;
			int currentPageNumber = 0;
			int pageOfCurrentReaderPDF = 0;
			Iterator<PdfReader> iteratorPDFReader = readers.iterator();
			// Loop through the PDF files and add to the output.
			while (iteratorPDFReader.hasNext()) {
				PdfReader pdfReader = iteratorPDFReader.next();
				// Create a new page in the target for each source page.
				while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
					document.newPage();
					pageOfCurrentReaderPDF++;
					currentPageNumber++;
					page = writer.getImportedPage(pdfReader,
							pageOfCurrentReaderPDF);
					cb.addTemplate(page, 0, 0);
					// Code for pagination.
					if (paginate) {
						cb.beginText();
						cb.setFontAndSize(bf, 9);
						cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""
								+ currentPageNumber + " of " + totalPages, 520,
								5, 0);
						cb.endText();
					}
				}
				pageOfCurrentReaderPDF = 0;
			}
			outputStream.flush();
			document.close();
			outputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (document.isOpen())
				document.close();
			try {
				if (outputStream != null)
					outputStream.close();
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}
	}
	public static void main(String[] args) throws Exception {
		List<InputStream> streamOfPDFFiles = new ArrayList<InputStream>();
		streamOfPDFFiles.add(new FileInputStream("D:\\temp\\fileCache\\demo-1.pdf"));
		streamOfPDFFiles.add(new FileInputStream("D:\\temp\\fileCache\\demo-2.pdf"));
		OutputStream outputStream = new FileOutputStream(
				"D:\\temp\\" + System.currentTimeMillis() + ".pdf"
		);
		iTextPdfConcatUtils.concatPDFs(streamOfPDFFiles, outputStream , false);
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/02/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Springboot输出PDF文件
有个人(死需求)跑过来跟你说,这些都给我输出成报告,pdf格式的,所以就有了下面这个,做一下笔记,以后有用直接过来拿。在网上找了一下,发现大家都是在用itext。iText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
用户3467126
2019/09/27
2.9K2
Springboot输出PDF文件
itext根据模板生成pdf(支持分页)
// 利用模板生成pdf public static void pdfout(Map<String,Object> o,String newPDFPath){ // 模板路径 File file = new File(""); String filePath = null; try { filePath = file.getCanonicalPath(); } catch (IOException e) { e.printStackTrace(); } System.out.println(filePath); String templatePath = "C:/Users/pc/Desktop/990696 list -1.pdf"; String templatePaths = "C:/Users/pc/Desktop/990696 list -2.pdf"; // 生成的新文件路径 PdfReader reader; PdfReader readers; FileOutputStream out;
故久
2019/09/29
4K0
itext根据模板生成pdf(支持分页)
Itext根据模板生成pdf
public class PdfUtils { // 利用模板生成pdf public static void pdfout(Map<String,Object> o,String newPDFPath){ // 模板路径 String templatePath = "C:/Users/pc/Desktop/990696 list -1.pdf"; // 生成的新文件路径 PdfReader reader; F
故久
2019/09/29
3.2K0
Itext根据模板生成pdf
【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)
​ 工作中遇到需要生成PDF。最终选择了iText。其他也有通过html再生成。感觉不太适合就用了代码实现。 使用iText 5.5.13.1版本。纯Java代码实现 1.自定义表格合并指定行列
小帅丶
2019/07/22
8.8K0
【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)
iText5实现Java生成PDF文件完整版
最近项目中使用到Java实现导出PDF文件,经过一番参考研究最终决定使用itextpdf来实现,当然也可以参考 PDF Java类库:Spire.PDF for Java(https://www.e-iceblue.cn/spirepdfjava/create-pdf-in-java.html)。本文是使用第一种来实现的。
全栈程序员站长
2022/07/02
6.3K0
iText5实现Java生成PDF文件完整版
java(iText)工具包生成PDF
iText是一个非常著名的能够快速产生PDF文件的Java类库。支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合
王念博客
2019/07/25
10.3K1
SpringBoot + ITextPdf:高效生成 PDF 预览文件
其实公司之前的项目里是用到了帆软报表的,然而最近接了一个新项目,这个项目独立部署在甲方的独立环境中,组长的意思是不用再单独部署一套帆软报表,成本太大,用其他方式实现一下。虽然我不太理解成本大在哪儿,不过身为助理工程师,别管那么多,照着干就完事了。
程序员皮皮林
2024/10/08
8620
SpringBoot + ITextPdf:高效生成 PDF 预览文件
怎么通过itextpdf架包实现报表导出为pdf文件?
程序猿川子
2024/08/01
730
怎么通过itextpdf架包实现报表导出为pdf文件?
itextPdf工具类使用纪实-01
需求:将数据库中的一些表格信息导出并存入pdf文件。于是乎接触到了itextpdf工具类,帮助我们更好的编排内容显示的位置和文件的导出。
猫老师的叶同学
2023/03/01
1.1K0
itextpdf生成表格的常见用法
在前面的文章介绍了itextpdf基本用法和使用itextpdf生成图片,itextpdf还可以实现很多功能,非常强大,今天主要介绍如何使用itextpdf生成表格式的pdf,在实际项目中也非常常用,首先举一个非常简单的例子,熟悉一下生成表格的基本步骤和流程:
全栈程序员站长
2022/07/02
2K0
itextpdf生成表格的常见用法
从xls或xlsx文件转换为PDF文件的Java代码示例
本文介绍了如何使用Java代码将Excel文件转换为PDF文件,重点演示了如何使用iText库来实现这一功能。通过深入了解代码示例,您将能够轻松地将Excel文件转换为PDF,并且可以自定义字体、样式等。
默 语
2024/11/20
1780
spring-boot整合PDF打印
1.导入jar(一定要注意版本,踩过很多坑) <!--pdf依赖--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.1</version> </dependency> <!-- https://mvnrepository.com/artifact/
用户5927264
2019/10/08
1.9K0
文件系统(01):基于SpringBoot框架,管理Excel和PDF
Excel一款电子表格软件。直观的界面、出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Excel文件,或者Excel数据导入系统中,这就涉及数据转换问题。
知了一笑
2020/02/17
1.7K0
文件系统(01):基于SpringBoot框架,管理Excel和PDF
Java输出Pdf(2021)集成springboot
1.首先,新建一个word文档,内容如下,另存为pdf格式,我的命名:mytest.pdf。
知识浅谈
2021/05/10
1.1K0
Java输出Pdf(2021)集成springboot
PDF文件添加二维码水印教程
maven配置iText的jar,主要不是所有私服都有iText的jar,maven仓库没有的,可以去https://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.5.12 这里下载
SmileNicky
2019/06/15
1.5K0
itextpdf设置页码_word页码相同怎么改
项目需要样式比较复杂,刚开始因为时间比较紧所以采用了Itextpdf插件代码生成pdf ,实话说过程十分繁琐,因为pdf文件样式比较多,表格也比较多,各种的表格,还有就是页眉页脚页码都要自己找页面位置坐标但是又不能像html那样方便更改查看样式,只能改一点导出来看看合适不,然后再改再导出来看。 私下调研了很多,现在罗列一下我所用到的一些样式处理,希望可以帮助需要做这个功能的朋友少踩坑,少尝试,直接出完美pdf报告。
全栈程序员站长
2022/11/14
3.8K0
itextpdf设置页码_word页码相同怎么改
SpringBoot集成itextpdf动态生成pdf并展示
接上文SpringBoot集成markdown实现文档管理,对于表格的支持markdown不是特别友好,同时内部文档管理需要增加表格式api接口文档的功能,所以决定采用结合数据库存储与动态生成pdf借助目录结构展示的方式
code2roc
2023/07/19
1.1K0
SpringBoot集成itextpdf动态生成pdf并展示
java导出pdf模板_java模板导出PDF[通俗易懂]
一对一,点对点的给对应的地方写值,比如模板里面放了个name标识,在程序里把“张三”赋给name,那么输出的pdf里面name的地方就变成了张三,准确方便快捷
全栈程序员站长
2022/08/25
2.6K0
java导出pdf模板_java模板导出PDF[通俗易懂]
itext实现pdf自动定位合同签订
需求 需要实现如下效果(最终效果) 思考 需求方的要求就是实现签订合同,实现方法不限,但过程中又提出需要在签章的过程中把签订日期的文字也打上去,这就有点坑了~ 一开始的想法是想办法定位需要签名的位
老梁
2019/09/10
2.4K1
itext实现pdf自动定位合同签订
itext实现合同尾部签章部分自动添加,定位签名
使用的pom <!-- pdf处理 start--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <vers
老梁
2019/09/10
1.6K0
itext实现合同尾部签章部分自动添加,定位签名
推荐阅读
相关推荐
Springboot输出PDF文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验