pdfpcell输出换行_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。

3、表格中的文本怎么居中?

还是调用PdfPCell对象的方法,见下面代码:

//定义单元格式:6列宽、文本横向居中、纵向居中显示

PdfPCell cell = newPdfPCell();

cell.setColspan(6);

cell.setUseAscender(true);

cell.setHorizontalAlignment(Element.ALIGN_CENTER);

cell.setVerticalAlignment(Element.ALIGN_MIDDLE);

4、怎么定义文本字体?

文本有3种对象,从小到大依次是:Chunk、Phrase、Paragraph,就像俄罗斯套娃,小的可以往大里面套,当然也可以直接塞给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 = newPhrase();

Address address= newAddress();

addressPhrase .add(Chunk.NEWLINE);

addressPhrase .add(newChunk(address.getAddressLine1(), 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(newPhrase(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(newDate()),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= newPdfPCell();

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);

// 加入pdfdocument.add(hiddenTable);

9、怎么把生成的PDF输出到页面?

把输出流定位到HttpServletResponse(下面的response)的OutputStream即可:

response.setContentType("application/pdf");

PdfWriter.getInstance(document, response.getOutputStream());

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值