itext实现pdf打印之二

/** * 设置表体,根据传入的参数进行设置 * @return * @throws DocumentException * @throws IOException */ @SuppressWarnings("unchecked") private PdfPTable setTableBody(List list) throws DocumentException, IOException { Rectangle whiteBorder = new Rectangle(12f, 12f); whiteBorder.setBorderWidth(0f); PdfPTable tab = new PdfPTable(7); //设置列的宽度,这种参数也应该是传进来的,设计时你不知道到底有多少列,列表和列宽都要传进来进行设置 int table[] = { 15, 15, 15, 13, 15, 15, 12 }; tab.setWidths(table); tab.setWidthPercentage(100); tab.setSpacingBefore(0f);// 设置标题和第一个表格间的距离.不然会粘在一起 for (int i = 0; i < 840; i++) { PdfPCell pdfcell = new PdfPCell(new Phrase("批量查询", font1)); pdfcell.setHorizontalAlignment(Element.ALIGN_CENTER); tab.addCell(pdfcell); } return tab; } /** * 设置表头,根据传入的参数进行设置 * @return * @throws DocumentException */ @SuppressWarnings("unchecked") private PdfPTable setHeaderTable(List list) throws DocumentException{ PdfPTable tab = new PdfPTable(7); int table[] = { 15, 15, 15, 13, 15, 15, 12 }; tab.setWidths(table); tab.setWidthPercentage(100); for (int i = 0; i < list.size(); i++) { String headerName = (String) list.get(i); PdfPCell pdfcell = new PdfPCell(new Phrase(headerName, font)); pdfcell.setHorizontalAlignment(Element.ALIGN_CENTER); tab.addCell(pdfcell); } return tab; } /** * 生成pdf时调用的字体 * 这是中文用的 */ public void onOpenDocument(PdfWriter writer, Document document) { try { tpl = writer.getDirectContent().createTemplate(100, 100); bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); } catch (Exception e) { throw new ExceptionConverter(e); } } /** * 生成时间,如果转入了时间就显示输入的时间,转入的时间格式为20100909、2010-09-09、2010/09/09、2010\09\09就会返回2010年09月09日 * 如果转入的是空的字符串或是null则返回系统时间,其格式为2010年09月09日 * @param dateString * @return String */ private static String getDifferentTime(String dateString) { GregorianCalendar calendar = (GregorianCalendar) Calendar.getInstance(); StringBuffer sb = new StringBuffer(); if (dateString == null || "".equals(dateString)) { sb.append(calendar.get(Calendar.YEAR)).append("年").append(calendar.get(Calendar.MONTH)+1).append("月").append(calendar.get(Calendar.DAY_OF_MONTH)).append("日"); return sb.toString(); } else { String year = "", month = "", day = ""; if(dateString.indexOf("-") != -1 || dateString.indexOf("/") != -1 || dateString.indexOf("\\") != -1){ year = dateString.substring(0, 4); month = dateString.substring(5, 7); day = dateString.substring(8); }else{ year = dateString.substring(0, 4); month = dateString.substring(4, 6); day = dateString.substring(6); } sb.append(year).append("年").append(month).append("月").append(day).append("日"); return sb.toString(); } } /*public static Table getEmptyTable() { Table emptyTable = null; try { emptyTable = new Table(1); emptyTable.setWidth(100); emptyTable.setBorder(Rectangle.NO_BORDER); Cell c = new Cell(new Phrase("\n", normalFont)); c.setBorder(Rectangle.NO_BORDER); emptyTable.addCell(c); } catch (Exception e) { e.printStackTrace(); } return emptyTable; }*/ @SuppressWarnings("unchecked") private List getTitleList(){ List list = new ArrayList(); list.add("交易日期"); list.add("划拨类型"); list.add("总账号"); list.add("子账号"); list.add("子账号名称"); list.add("交易金额"); list.add("划拨结果"); return list; } private String getTileName(){ String str = new String("批量查询功能"); return str; } /** * pdf生成时会首先调用这个方法,是itext自己调用的。 * @param writer * @param document * @return void */ public void onStartPage(PdfWriter writer, Document document) { int pageSize = writer.getPageNumber(); //只在第一页中加入标题,如果想在每一个页面中都加入标题和时间,把if条件去掉就可以了 if(pageSize == 1){ try { document.add(setTiteAndDate(getTileName())); } catch (DocumentException e) { e.printStackTrace(); } } try { //在每一页中都加入表头 document.add(setHeaderTable(getTitleList())); } catch (Exception e) { e.printStackTrace(); } } /** * pdf生成完成之后itext要执行的方法 * @param writer * @param document * @return void */ public void onEndPage(PdfWriter writer, Document document) { // 在每页结束的时候把“第x页”信息写道模版指定位置 // 页码在头部 /* * PdfContentByte cb = writer.getDirectContent(); cb.saveState(); String * text = "第" + writer.getPageNumber() + "页,共"; cb.beginText(); * cb.setFontAndSize(bf, 8); cb.setTextMatrix(460, 786);// 定位“第x页,共” * 在具体的页面调试时候需要更改这xy的坐标 cb.showText(text); cb.endText(); * cb.addTemplate(tpl, 492, 786);// 定位“y页” 在具体的页面调试时候需要更改这xy的坐标 * * cb.saveState(); cb.stroke(); cb.restoreState(); cb.closePath();// * sanityCheck(); */ //页码在尾部加 PdfContentByte cb = writer.getDirectContent(); cb.saveState(); String text = "第" + writer.getPageNumber() + "页,共"; float textSize = bfChinese.getWidthPoint(text, 8); float textBase = document.bottom() - 20; cb.beginText(); cb.setFontAndSize(bfChinese, 8); float adjust = bfChinese.getWidthPoint("0", 8); cb.setTextMatrix(document.right() - textSize - adjust, textBase); cb.showText(text); cb.endText(); cb.addTemplate(tpl, document.right() - adjust, textBase); cb.saveState(); } /** * 关闭document的时候获取总页数,并把总页数按模版写道之前预留的位置 * @param writer * @param document * @return void */ public void onCloseDocument(PdfWriter writer, Document document) { tpl.beginText(); tpl.setFontAndSize(bf, 8); tpl.showText(Integer.toString(writer.getPageNumber() - 1) + "页"); tpl.endText(); tpl.closePath();// sanityCheck(); } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值