最近用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());

  暂时就先聊到这里,主要的坑都在上面了。

  

最新文章

  1. 自己动手写一个简单的MVC框架(第一版)
  2. html5页面打包成App - Android或Iphone安装程序
  3. 【Spring】Junit加载Spring容器作单元测试
  4. Leetcode: Create Maximum Number
  5. html5+js实现刮刮卡效果
  6. 转:C# 通过委托更新UI(异步加载)
  7. POJ 3345-Bribing FIPA(树状背包)
  8. Codeforces Round #261 (Div. 2) D 树状数组应用
  9. java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
  10. 使用TWebBrowser时存在内存泄漏问题的解决方案(使用SetProcessWorkingSetSize函数,或者修改OleCtrls.pas源码解决问题)
  11. js原生设计模式——9外观模式封装
  12. pig的grunt中shell命令不稳定,能不用尽量不用
  13. Java集合类源码解析:Vector
  14. spring aspect获取抽象基类日志
  15. PAT A1103
  16. hadoop更改保存路径后,批量重启不能启动datanode(或者format以后不能启动datanode)
  17. 理解PHP中的会话控制
  18. iuplua test on luaforwindows
  19. SpringBoot,Vue前后端分离开发首秀
  20. sc58x config

热门文章

  1. A*算法 寻路
  2. WEB-ERROR-PAGE
  3. mysql日常运维
  4. 0SGU 128 snake (&& ZOJ 3521) 尺取,排序二叉树,线段树 难度:2
  5. sgu101 欧拉路径 难度:1
  6. CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树
  7. RTU命令设置笔记
  8. CDMA LTE FAQ2
  9. Swift语法笔记
  10. IoC基础例子