iText使用经历
最近用iText搞了下PDF,虽然一路趟坑而过,毕竟是搞出来了,所以iText还是不错的开源PDF生成软件的。先看搞出来的PDF长啥样:
然后看一路趟过来的坑:
1、表格怎么生成,具体是行怎么生成?列怎么生成?
我们定义一个表格时,只需指定列即可,行会自适配的。比如上图,我要六列,每行超过六列就会自动往下跑。定义表格很简单:
// 绘制一个6列的表,定义各列比例15:35:5:6:15:24
PdfPTable table = new PdfPTable(6);
table.setWidths(new float[]{15f,35f,5f,6f,15f,24f});
2、单元格怎么合并?
就跟Excel一样,表格单元格的横向合并只需要让PdfPCell对象(把它看成表格里的单元就行了)调用setColspan方法即可,纵向合并是setRowspan,参数是你要合并的列数和行数,代码参考下面问题3或7。
3、表格中的文本怎么居中?
还是调用PdfPCell对象的方法,见下面代码:
// 定义单元格式:6列宽、文本横向居中、纵向居中显示
PdfPCell cell = new PdfPCell();
cell.setColspan(6);
cell.setUseAscender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
4、怎么定义文本字体?
文本有3种对象,从小到大依次是:Chunk、Phrase、Paragraph,就像俄罗斯套娃,小的可以往大里面套。当然也可以直接把这3个对象塞给PdfPCell对象,它是大小通吃的。字体可以通过工厂生产,也可以直接创建出来:
// 粗体
Font boldFont = FontFactory.getFont(FontFactory.COURIER,10,Font.BOLD); cell.setPhrase(new Phrase("INVOICE", boldFont));
5、怎么插入空行?
先定义一个空的Paragraph对象,加入到PdfPCell对象即可:
// 空单元
Paragraph blank = new Paragraph(" "); // 插入空白行
cell.setPhrase(blank);
table.addCell(cell);
6、怎么让文本换行?
给文本对象如Phrase加入Chunk.NEWLINE常量即可,如上图的地址就需要换行处理:
Phrase addressPhrase = new Phrase();
Address address = new Address();
addressPhrase.add(new Chunk(address.getAddressLine(), commonFont);
addressPhrase.add(Chunk.NEWLINE);
addressPhrase.add(address.getCity(), commonFont));
addressPhrase.add(Chunk.NEWLINE);
cell.setPhrase(addressPhrase);
table.addCell(cell);
7、怎么变换行和列?
上面说过了,列在创建表格时已经设置好了,行是自动换的,不过最酷的一点是在于后面的单元格样式是可以继承前面的,只要你后面的单元格跟前面的一样,那就啥都不用改。啥是继承?举个例子:接着上面的Customer和地址信息这两列后,我们需要插入一个空白的合并单元格,然后继续插入两列,接着换行继续插入:
// 插入空白单元,该单元合并2列2行
cell.setPhrase(blank);
cell.setColspan(2);
cell.setRowspan(2);
table.addCell(cell); // 继续插入一列一行
cell.setPhrase(new Phrase("Invoice NO.:",commonFont));
cell.setRowspan(1);
cell.setColspan(1);
table.addCell(cell); // 继续插入一列一行
cell.setPhrase(new Phrase(getOrderId(),commonFont));
table.addCell(cell); // 换行了
cell.setPhrase(new Phrase("VAT number:",commonFont));
table.addCell(cell); cell.setPhrase(new Phrase("BB112233446",commonFont));
table.addCell(cell); cell.setPhrase(new Phrase("DATE:",commonFont));
table.addCell(cell); cell.setPhrase(new Phrase(new SimpleDateFormat("yyyy/MM/dd").format(new Date()),commonFont));
table.addCell(cell);
8、怎么插入图片,而且让文本跟图片保持在同一行?
这个坑有点大,折腾了蛮久,后来还是利用表格搞定的(我的图片放在项目的resource/static目录里),记得去掉表格和单元的框框:
PdfPTable hiddenTable = new PdfPTable(new float[]{65f,5f,30f}); // 隐藏边框
hiddenTable.getDefaultCell().disableBorderSide(1);
hiddenTable.getDefaultCell().disableBorderSide(2);
hiddenTable.getDefaultCell().disableBorderSide(4);
hiddenTable.getDefaultCell().disableBorderSide(8); // 插入空单元
hiddenTable.addCell(blank); // 插入图片
Image mouse = Image.getInstance(this.getClass().getClassLoader().getResource("static/mouse.png"));
mouse.scalePercent(15); cell = new PdfPCell();
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell.setImage(mouse); // 去掉边框
cell.setBorder(Rectangle.NO_BORDER);
hiddenTable.addCell(cell); cell.setPhrase(new Phrase("Right click to save!", boldFont));
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
hiddenTable.addCell(cell);
// 加入pdf
document.add(hiddenTable);
9、怎么把生成的PDF输出到页面?
把输出流定位到HttpServletResponse(下面的response)的OutputStream即可:
response.setContentType("application/pdf");
PdfWriter.getInstance(document, response.getOutputStream());
暂时就先聊到这里,主要的坑都在上面了。
iText使用经历的更多相关文章
- PDF 生成插件 flying saucer 和 iText
最近的项目中遇到了需求,用户在页面点击下载,将页面以PDF格式下载完成供用户浏览,所以上网找了下实现方案. 在Java世界,要想生成PDF,方案不少,所以简单做一个小结吧. 在此之前,先来勾画一下我心 ...
- H5拍照应用开发经历的那些坑儿
一.项目简介 1.1.项目背景:这是一个在移动终端创新应用的项目,用户在浏览器端(微信/手Q)即可完成与金秀贤的合影,希望通过这样一种趣味体验,引发用户的分享与转发的热潮. 1.2.系统要求:ios6 ...
- 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮
(出处:http://www.cnblogs.com/linguanh/) 前序: 距离 2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...
- 阿里提前批校招内推offer经历
经过一个半月的阿里内推面试,今天终于收到了阿里的offer邮件 .阿里的内推面试一共有四轮,本人是7月19号投的内推邮件,8月28号收到了offer的邮件.首先本人谈谈内推的看法.内推是公司招聘人才的 ...
- Ubuntu服务器被黑经历(ElastichSearch漏洞)
起因 最近我们的一台Ubuntu阿里云服务器一直提示有肉鸡行为,提示了好几天,开始并没有关注,然后连续几天后发现应该是个大问题啊.很可能服务被侵入了!!! 寻找线索 一开始我是完全懵逼的状态的,Lin ...
- CVTE实习求职经历
今天,听到有好多同学最近要去面试CVTE这家企业,于是呢,准备将自己的经历写上来,给大家一个参考,希望能够大家一次帮助. 一.整体感觉 首先呢,先讲一下我个人对这家企业的整体感觉吧. 1. 第一次 对 ...
- geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践
眼看就要端午节了,屌丝还在写代码,话说过节也不给轻松,折腾了一天终于解决了一个BUG,并完成了老板安排的求DEM坡度的任务,那么就分两段来表. 一.BUG调试 首先记录一天的BUG调试,简单copy了 ...
- 淘宝web前端开发岗面试经历及感悟
今天下午四点接到淘宝UED的面试电话,很突然,很激动.现在怀着淡淡的忧伤为之文以志一下. 1.自我介绍一下. 我xx时候毕业,在xx公司任xx职务,主要负责xx balabala.(怕公司同事听到,接 ...
- [分享] 很多人手机掉了,却不知道怎么找回来。LZ亲身经历讲述手机找回过程,申请加精!
文章开头:(LZ文笔不好,以下全部是文字描述,懒得配图.因为有人说手机掉了,他们问我是怎么找回来的.所以想写这篇帖子.只不过前段时间忙,没时间.凑端午节给大家一些经验) 还是先谢谢被偷经历吧!5月22 ...
随机推荐
- [LeetCode] 268. Missing Number ☆(丢失的数字)
转载:http://www.cnblogs.com/grandyang/p/4756677.html Given an array containing n distinct numbers take ...
- nginx支持返回相对路径
一.问题:http://192.168.72.4/bm-crm/ 局域网可以访问[实际指向了192.168.80.1:8081/brm-crm] http://59.41.111.24:8280/b ...
- PHP:第一章——PHP中的算术运算符/递增、递减运算符/赋值运算符
算术运算符 //$a=10; $b=5; //取反: //echo -$a;//输出:-10: //加法: //echo $a+$b;//输出:15 //减法: //echo $a-$b;//输出:5 ...
- bzoj1084&&洛谷2331[SCOI2005]最大子矩阵
题解: 分类讨论 当m=1的时候,很简单的dp,这里就不再复述了 当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个 然后枚举一下当前子矩阵,状态转移 代码: #in ...
- IntentService的用法,对比Service它会按顺序执行,不会像Service一样并发执行。
package com.lixu.intentservice; import android.app.Activity; import android.content.Intent; import a ...
- JavaScript事件漫谈
内容概要: event对象,事件在多个浏览器中的兼容,事件的传播机制,JS自定义事件,jQuery的自定义事件的绑定与触发 Event对象 Event对象属于HTML DOM对象.Event 对象代表 ...
- Redmine开源项目管理搭建
今年7月底,跳槽到新公司,新公司对于项目管理,也是从今年上半年开始有这个想法的.都是新同事,整个项目管理流程内部讨论决定如何制定. 刚入职时,对于项目需求的管理都是通过excel和project记录的 ...
- UIApplication的详细介绍
UIApplication 什么是UIApplication? UIApplication对象是应⽤程序的象征.每一个应用都有⾃己的UIApplication对象,这个对象是系统自动帮我们创建的, 它 ...
- oo面向对象--规格化设计
oo面向对象--规格化设计 规格化设计与抽象 要了解规格化设计首先要了解抽象化的程序设计,两者是密不可分的. 抽象化(Abstraction) 抽象化是将数据与程序,用语义呈现他们的外观,但是隐藏起它 ...
- 统计学(检验、分布)的 python(numpy/pandas/scipy) 实现
scipy 中统计相关的 api:https://docs.scipy.org/doc/scipy/reference/stats.html https://zhuanlan.zhihu.com/p/ ...