Itext根据模板生成pdf
- 2019 年 10 月 8 日
- 筆記
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; FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; List<PdfReader> Pdflist = new ArrayList(); try { BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font FontChinese = new Font(bf, 5, Font.NORMAL); out = new FileOutputStream(newPDFPath);// 输出流 reader = new PdfReader(templatePath);// 读取pdf模板 bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); PdfReader pdfReaders = null; AcroFields form = stamper.getAcroFields(); //文字类的内容处理 Map<String,String> datemap = (Map<String,String>)o.get("datemap"); form.addSubstitutionFont(bf); for(String key : datemap.keySet()){ String value = datemap.get(key); form.setField(key,value); } //图片类的内容处理 /* Map<String,String> imgmap = (Map<String,String>)o.get("imgmap"); for(String key : imgmap.keySet()) { String value = imgmap.get(key); String imgpath = value; int pageNo = form.getFieldPositions(key).get(0).page; Rectangle signRect = form.getFieldPositions(key).get(0).position; float x = signRect.getLeft(); float y = signRect.getBottom(); //根据路径读取图片 Image image = Image.getInstance(imgpath); //获取图片页面 PdfContentByte under = stamper.getOverContent(pageNo); //图片大小自适应 image.scaleToFit(signRect.getWidth(), signRect.getHeight()); //添加图片 image.setAbsolutePosition(x, y); under.addImage(image); }*/ Map<String, List<List<String>>> listMap = (Map<String, List<List<String>>>) o.get("list"); for (String key : listMap.keySet()) { List<List<String>> lists = listMap.get(key); System.out.println("lists" + lists); int pageNo = form.getFieldPositions(key).get(0).page; System.out.println(pageNo + "page"); PdfContentByte pcb = stamper.getOverContent(pageNo); Rectangle signRect = form.getFieldPositions(key).get(0).position; //表格位置 int column = lists.get(0).size(); System.out.println(column + "column"); int row = lists.size(); System.out.println("row" + row); PdfPTable table = new PdfPTable(column); float tatalWidth = signRect.getRight() - signRect.getLeft() - 1; System.out.println(tatalWidth); int size = lists.get(0).size(); float width[] = new float[size]; for (int i = 0; i < size; i++) { if (i == 0) { width[i] = 60f; } else { width[i] = (tatalWidth - 60) / (size - 1); } } System.out.println(width); table.setTotalWidth(width); table.setLockedWidth(true); table.setKeepTogether(true); table.setSplitLate(true); table.setSplitRows(true); Font FontProve = new Font(bf, 10, 0); //表格数据填写 if(row>20) { System.out.println("进来啦"+row); for (int i = 0; i < 23; i++) { int k = i + 1; List<String> list = lists.get(i); for (int j = 0; j < column; j++) { Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve); PdfPCell cell = new PdfPCell(paragraph); //cell.setBorderWidth(1); // cell.disableBorderSide(15);//全没了 if (i == (row - 2)) { System.out.println("i是:" + (row - 2)); BaseFont bftemp = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); FontProve = new Font(bftemp, 10, Font.BOLD, BaseColor.BLACK); //cell.setBorderWidth(1); cell.disableBorderSide(14);//全没了 } else if (i == (row - 1)) { System.out.println("i是:" + (row - 1)); cell.setColspan(5); cell.setBorderWidth(0); //cell.disableBorderSide(13); } else { cell.disableBorderSide(15); } //cell.disableBorderSide(15);//全没 cell.setVerticalAlignment(Element.ALIGN_CENTER); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setLeading(0, (float) 1.4); table.addCell(cell); } } }else if(row<=20) { System.out.println("哈哈哈哈"+row); for (int i = 0; i < row; i++) { List<String> list = lists.get(i); for (int j = 0; j < column; j++) { Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve); PdfPCell cell = new PdfPCell(paragraph); //cell.setBorderWidth(1); // cell.disableBorderSide(15);//全没了 if (i == (row - 2)) { System.out.println("i是:" + (row - 2)); BaseFont bftemp = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); FontProve = new Font(bftemp, 10, Font.BOLD, BaseColor.BLACK); //cell.setBorderWidth(1); cell.disableBorderSide(14);//全没了 } else if (i == (row - 1)) { System.out.println("i是:" + (row - 1)); cell.setColspan(5); cell.setBorderWidth(0); //cell.disableBorderSide(13); } else { cell.disableBorderSide(15); } //cell.disableBorderSide(15);//全没 cell.setVerticalAlignment(Element.ALIGN_CENTER); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setLeading(0, (float) 1.4); table.addCell(cell); } } } table.setSpacingAfter(40f); table.writeSelectedRows(0, -1, signRect.getLeft(), signRect.getTop(), pcb); } Map<String, List<List<String>>> listMaps = (Map<String, List<List<String>>>) o.get("listss"); for (String key : listMaps.keySet()) { List<List<String>> lists = listMaps.get(key); System.out.println("lists"+lists); int pageNo = form.getFieldPositions(key).get(0).page; PdfContentByte pcb = stamper.getOverContent(pageNo); Rectangle signRect = form.getFieldPositions(key).get(0).position; //表格位置 int column = lists.get(0).size(); int row = lists.size(); System.out.println(column+"column"+"row"+row); PdfPTable table = new PdfPTable(column); float tatalWidth = signRect.getRight() - signRect.getLeft() - 1; System.out.println(tatalWidth); int size = lists.get(0).size(); float width[] = new float[size]; for(int i=0;i<size;i++){ if(i==0){ width[i]=100f; }else{ width[i]=(tatalWidth-60)/(size-1); } } System.out.println(width); table.setTotalWidth(width); table.setLockedWidth(true); table.setKeepTogether(true); table.setSplitLate(false); table.setSplitRows(true); Font FontProve = new Font(bf, 8, Font.BOLD,BaseColor.BLACK); //表格数据填写 for(int i=0;i<row;i++){ List<String> list = lists.get(i); for(int j=0;j<column;j++){ Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve); PdfPCell cell = new PdfPCell(paragraph); cell.disableBorderSide(14);//全没了 if(i==0){ BaseFont bftemp = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); FontProve = new Font(bftemp, 5, Font.NORMAL, BaseColor.BLACK); cell.disableBorderSide(14);//全没了 }else if(i==(row-1)){ cell.disableBorderSide(15); }else{ cell.disableBorderSide(15); } cell.setVerticalAlignment(Element.ALIGN_CENTER); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setLeading(0, (float) 1.4); table.addCell(cell); } } table.writeSelectedRows(0, -1, signRect.getLeft(), signRect.getTop(), pcb); } stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑 stamper.close(); pdfReaders = new PdfReader(bos.toByteArray()); Pdflist.add(pdfReaders); Document doc = new Document(); Font font = new Font(bf, 32); PdfCopy copy = new PdfCopy(doc, out); doc.open(); int pageNum = reader.getNumberOfPages(); System.out.println(pageNum+"页数"); for(int k = 1;k <= pageNum;k++){ PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), k); System.out.println(importPage); doc.newPage(); copy.addPage(importPage); copy.addDocument(new PdfReader(bos.toByteArray())); System.out.println("pdf"+Pdflist.size()); // PdfReader pdfReader = Pdflist.get(k); // PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), k); // doc.newPage(); // copy.addDocument(pdfReader); // copy.addPage(importPage); } doc.close(); } catch (IOException e) { System.out.println(e); } catch (DocumentException e) { System.out.println(e); } } public static void pdfoutEn(Map<String,Object> s,String newPDFPath){ // 模板路径 String templatePath = "C:/Users/pc/Desktop/990696 list en.pdf"; // 生成的新文件路径 PdfReader reader; FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; try { BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font FontChinese = new Font(bf, 5, Font.NORMAL); out = new FileOutputStream(newPDFPath);// 输出流 reader = new PdfReader(templatePath);// 读取pdf模板 bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); //文字类的内容处理 Map<String,String> datemap = (Map<String,String>)s.get("datemap"); form.addSubstitutionFont(bf); for(String key : datemap.keySet()){ String value = datemap.get(key); form.setField(key,value); } //图片类的内容处理 /* Map<String,String> imgmap = (Map<String,String>)o.get("imgmap"); for(String key : imgmap.keySet()) { String value = imgmap.get(key); String imgpath = value; int pageNo = form.getFieldPositions(key).get(0).page; Rectangle signRect = form.getFieldPositions(key).get(0).position; float x = signRect.getLeft(); float y = signRect.getBottom(); //根据路径读取图片 Image image = Image.getInstance(imgpath); //获取图片页面 PdfContentByte under = stamper.getOverContent(pageNo); //图片大小自适应 image.scaleToFit(signRect.getWidth(), signRect.getHeight()); //添加图片 image.setAbsolutePosition(x, y); under.addImage(image); }*/ Map<String, List<List<String>>> listMap = (Map<String, List<List<String>>>) s.get("lists"); for (String key : listMap.keySet()) { List<List<String>> lists = listMap.get(key); System.out.println("lists"+lists); int pageNo = form.getFieldPositions(key).get(0).page; System.out.println(pageNo+"page"); PdfContentByte pcb = stamper.getOverContent(pageNo); Rectangle signRect = form.getFieldPositions(key).get(0).position; //表格位置 int column = lists.get(0).size(); System.out.println(column+"column"); int row = lists.size(); System.out.println("row"+row); PdfPTable table = new PdfPTable(column); float tatalWidth = signRect.getRight() - signRect.getLeft() - 1; System.out.println(tatalWidth); int size = lists.get(0).size(); float width[] = new float[size]; for(int i=0;i<size;i++){ if(i==0){ width[i]=60f; }else{ width[i]=(tatalWidth-60)/(size-1); } } System.out.println(width); table.setTotalWidth(width); table.setLockedWidth(true); table.setKeepTogether(true); table.setSplitLate(true); table.setSplitRows(true); Font FontProve = new Font(bf, 10, 0); //表格数据填写 if(row>20) { System.out.println("进来啦"+row); for (int i = 0; i < 23; i++) { int k = i + 1; List<String> list = lists.get(i); for (int j = 0; j < column; j++) { Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve); PdfPCell cell = new PdfPCell(paragraph); //cell.setBorderWidth(1); // cell.disableBorderSide(15);//全没了 if (i == (row - 2)) { System.out.println("i是:" + (row - 2)); BaseFont bftemp = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); FontProve = new Font(bftemp, 10, Font.BOLD, BaseColor.BLACK); //cell.setBorderWidth(1); cell.disableBorderSide(14);//全没了 } else if (i == (row - 1)) { System.out.println("i是:" + (row - 1)); cell.setColspan(5); cell.setBorderWidth(0); //cell.disableBorderSide(13); } else { cell.disableBorderSide(15); } //cell.disableBorderSide(15);//全没 cell.setVerticalAlignment(Element.ALIGN_CENTER); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setLeading(0, (float) 1.4); table.addCell(cell); } } }else if(row<=20) { System.out.println("哈哈哈哈"+row); for (int i = 0; i < row; i++) { List<String> list = lists.get(i); for (int j = 0; j < column; j++) { Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve); PdfPCell cell = new PdfPCell(paragraph); //cell.setBorderWidth(1); // cell.disableBorderSide(15);//全没了 if (i == (row - 2)) { System.out.println("i是:" + (row - 2)); BaseFont bftemp = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); FontProve = new Font(bftemp, 10, Font.BOLD, BaseColor.BLACK); //cell.setBorderWidth(1); cell.disableBorderSide(14);//全没了 } else if (i == (row - 1)) { System.out.println("i是:" + (row - 1)); cell.setColspan(5); cell.setBorderWidth(0); //cell.disableBorderSide(13); } else { cell.disableBorderSide(15); } //cell.disableBorderSide(15);//全没 cell.setVerticalAlignment(Element.ALIGN_CENTER); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setLeading(0, (float) 1.4); table.addCell(cell); } } } table.setSpacingAfter(40f); table.writeSelectedRows(0, -1, signRect.getLeft(), signRect.getTop(), pcb); } Map<String, List<List<String>>> listMaps = (Map<String, List<List<String>>>) s.get("listen"); for (String key : listMaps.keySet()) { List<List<String>> lists = listMaps.get(key); System.out.println("lists"+lists); int pageNo = form.getFieldPositions(key).get(0).page; PdfContentByte pcb = stamper.getOverContent(pageNo); Rectangle signRect = form.getFieldPositions(key).get(0).position; //表格位置 int column = lists.get(0).size(); int row = lists.size(); System.out.println(column+"column"+"row"+row); PdfPTable table = new PdfPTable(column); float tatalWidth = signRect.getRight() - signRect.getLeft() - 1; System.out.println(tatalWidth); int size = lists.get(0).size(); float width[] = new float[size]; for(int i=0;i<size;i++){ if(i==0){ width[i]=100f; }else{ width[i]=(tatalWidth-60)/(size-1); } } System.out.println(width); table.setTotalWidth(width); table.setLockedWidth(true); table.setKeepTogether(true); table.setSplitLate(false); table.setSplitRows(true); Font FontProve = new Font(bf, 8, Font.BOLD,BaseColor.BLACK); //表格数据填写 for(int i=0;i<row;i++){ List<String> list = lists.get(i); for(int j=0;j<column;j++){ Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve); PdfPCell cell = new PdfPCell(paragraph); cell.disableBorderSide(14);//全没了 if(i==0){ BaseFont bftemp = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); FontProve = new Font(bftemp, 5, Font.NORMAL, BaseColor.BLACK); cell.disableBorderSide(14);//全没了 }else if(i==(row-1)){ cell.disableBorderSide(15); }else{ cell.disableBorderSide(15); } cell.setVerticalAlignment(Element.ALIGN_CENTER); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setLeading(0, (float) 1.4); table.addCell(cell); } } table.writeSelectedRows(0, -1, signRect.getLeft(), signRect.getTop(), pcb); } stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑 stamper.close(); Document doc = new Document(); Font font = new Font(bf, 32); PdfCopy copy = new PdfCopy(doc, out); doc.open(); int pageNum = reader.getNumberOfPages(); System.out.println(pageNum+"页数"); for(int i = 1;i <= pageNum;i++){ PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i); System.out.println(importPage); doc.newPage(); // copy.addDocument("j"); copy.addPage(importPage); } doc.close(); } catch (IOException e) { System.out.println(e); } catch (DocumentException e) { System.out.println(e); } } public static void main(String[] args) { Map<String,String> map = new HashMap(); Map<String,String> maps = new HashMap(); map.put("invoiceNo","990696"); map.put("deliverycompany","湖南省长沙市芙蓉区"); map.put("inviocecompany","湖南省长沙市雨花区"); map.put("paymethod","支付宝"); map.put("deliverymethod","邮寄"); map.put("deliverymethod","邮寄"); map.put("forwarder","申通快递"); map.put("deliverydate","2019-9-19"); map.put("orderReference","百度一下,你就知道"); map.put("referenceOrderNo","R1112112222"); map.put("invoice_no","990696"); map.put("invoicedate","2019-9-20"); map.put("dudate","2019-10-20"); map.put("companyNo","224542"); //map.put("product_no","22454222"); //map.put("description","该产品非常好"); //map.put("deliveryItemCount","100"); //map.put("orderPrice","23"); //map.put("orderPriceCount","230"); map.put("invoicetotal","230"); map.put("companyName","万特瑞有限公司"); map.put("tel","电话 12345678 "+"—"+"传真 0215"); maps.put("invoiceNo","990696"); maps.put("deliverycompany","Furong District, Changsha City, Hunan Province"); maps.put("inviocecompany","Furong District, Changsha City, Hunan Province"); maps.put("paymethod","zhifubao"); maps.put("deliverymethod","youji"); maps.put("deliverymethod","youji"); maps.put("forwarder","shentong"); maps.put("deliverydate","2019-9-19"); maps.put("orderReference","baiduyixia,nijiuzhidao"); maps.put("referenceOrderNo","R1112112222"); maps.put("invoice_no","990696"); maps.put("invoicedate","2019-9-20"); maps.put("dudate","2019-10-20"); maps.put("companyNo","224542"); //map.put("product_no","22454222"); //map.put("description","该产品非常好"); //map.put("deliveryItemCount","100"); //map.put("orderPrice","23"); //map.put("orderPriceCount","230"); maps.put("invoicetotal","230"); maps.put("companyName","wanruiteyouxiangongs"); maps.put("tel","tel 12345678 "+"—"+"fax 0215"); Map<String,String> map2 = new HashMap(); // map2.put("img","C:/Users/pc/Desktop/timg.jpg"); List<String> list11 = new ArrayList<String>(); list11.add(" "); list11.add(" "); list11.add(" "); list11.add("总价"); list11.add("630"); List<String> list11en = new ArrayList<String>(); list11en.add(" "); list11en.add(" "); list11en.add(" "); list11en.add("total"); list11en.add("630"); //表格 一行数据是一个list List<List<String>> List = new ArrayList<List<String>>(); List<List<String>> Lists = new ArrayList<List<String>>(); for(int i=0;i<=40;i++){ List<String> list = new ArrayList<String>(); List<String> listen = new ArrayList<String>(); list.add("22454223"); list.add("该产品非常好"); list.add("200"); list.add("23"); list.add("460"); List.add(list); listen.add("22454223"); listen.add("very good"); listen.add("200"); listen.add("23"); listen.add("460"); Lists.add(listen); } List<String> list12 = new ArrayList<String>(); list12.add(" "); list12.add(" "); list12.add(" "); list12.add(" "); list12.add("订单交付后,如有任何问题,请在7天内与我们联系,否则,我们将不受理任何索赔."); List<String> list12en = new ArrayList<String>(); list12en.add(" "); list12en.add(" "); list12en.add(" "); list12en.add(" "); list12en.add("UPON ORDER DELIVERY, PLEASE CONTACT US IF ANY PROBLEM NOT LATER THAN 7 DAYS, OTHERWISE, NO CLAIM WILL BE RECOGNIZED."); List.add(list11); List.add(list12); Lists.add(list11en); Lists.add(list12en); Map<String, List<List<String>>> listMap = new HashMap<String, List<List<String>>>(); listMap.put("eventList", List); Map<String, List<List<String>>> listMapen = new HashMap<String, List<List<String>>>(); listMapen.put("eventList", Lists); List<List<String>> ListAddress = new ArrayList<List<String>>(); List<String> listdd = new ArrayList<String>(); listdd.add("上海浦东新区"); List<String> listss = new ArrayList<String>(); listss.add("上海浦东新区华夏路"); ListAddress.add(listdd); ListAddress.add(listss); Map<String, List<List<String>>> listMaps = new HashMap<String, List<List<String>>>(); listMaps.put("companyAdress",ListAddress ); List<List<String>> ListAddressen = new ArrayList<List<String>>(); List<String> listdden = new ArrayList<String>(); listdden.add("Shanghai Pudong New Area"); List<String> listssen = new ArrayList<String>(); listssen.add("Shanghai Pudong New Area huaxiarod"); ListAddressen.add(listdden); ListAddressen.add(listssen); Map<String, List<List<String>>> listMapsen = new HashMap<String, List<List<String>>>(); listMapsen.put("companyAdress", ListAddressen); Map<String,Object> o=new HashMap(); o.put("datemap",map); // o.put("imgmap",map2); o.put("list",listMap); o.put("listss",listMaps); Map<String,Object> s=new HashMap(); s.put("datemap",map); s.put("lists",listMapen); s.put("listen",listMapsen); String uid=CommonUtils.uuid(); System.out.println(uid+"uid"); String newPDFPath ="C:/Users/pc/Desktop/"+uid+".pdf"; pdfout(o,newPDFPath); String newPDFPaths ="C:/Users/pc/Desktop/"+"I"+uid+".pdf"; PdfUtils.pdfoutEn(s,newPDFPaths); } }



我的博客即将同步至腾讯云+社区,邀请大家一同入驻:
https://cloud.tencent.com/developer/support-plan?invite_code=2nviihzlpmgwg