package test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.Phrase; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; /** * pdf * */ public class PdfTable { private Document document; private PdfPTable table; //circle mark private final static String list = "list"; //blank mark private final static String blank = "blank"; //title index private int titleindex = 0; private String[] titles = null; private int[] lengths = null; private int index = 0; private float tablewidth = 588 / 5.23f; PdfTable(){ document = new Document(); } PdfTable(Document document){ this.document = document; } /** * @param floder * @param filename * */ public void open(String floder,String filename){ try { File file = new File(floder); if(!file.exists()){ file.mkdir(); } PdfWriter.getInstance(document, new FileOutputStream(floder+File.separator+filename)); document.open(); } catch (FileNotFoundException e) { e.printStackTrace(); return; } catch (DocumentException e) { return; } catch (IOException e){ e.printStackTrace(); return; } } /** * add title * @titles String[] * @param lengths int[] * */ public void addTitles(String[] titles,int[] lengths){ this.titles = titles; this.lengths = lengths; try { table = new PdfPTable(titles.length); table.setWidthPercentage(tablewidth); table.setWidths(lengths); } catch (DocumentException e) { e.printStackTrace(); } } public int returnSinLen(ArrayList list){ if(list == null || list.size() == 0){ return 0; } HashMap map = (HashMap)list.get(0); return map.size(); } /** * @param list ArrayList * @param titleindex int * @return int[] * */ public int[] getIndex(ArrayList list,int titleindex){ if(list == null || list.size() == 0){ return null; } HashMap map = (HashMap)list.get(0); int[] lens = new int[map.size()]; this.index = titleindex; for(int i = 0;i < map.size();i++){ if(map.get(titles[index]) != null){ lens[i] = lengths[index]; index++; }else{ ArrayList listNest = (ArrayList)map.get(this.list); int len = 0; for(int j = index;j < titles.length;j++){ len += lengths[j]; } lens[i] = len; } } return lens; } /** * 内部表 * @param titles String[] * @param lengths int[] * @param tablecells ArrayList * */ public void addNestTable(ArrayList tablecells){ if(titles == null || lengths == null || tablecells == null || titles.length != lengths.length){ System.out.println("参数传入错误!"); return; } int length = titles.length; int collen = 0; PdfPCell cell1 = null; try { for(int i = 0;i < length;i++){ PdfPCell cell = new PdfPCell(new Phrase(titles[i],ChineseFont())); table.addCell(cell); } for(int i = 0;i < tablecells.size();i++){ HashMap map1 = (HashMap)tablecells.get(i); for(int j = 0;j < map1.size();j++){ if(map1.get(titles[j]) == null){ ArrayList arrayList = (ArrayList)map1.get(list); collen = map1.size(); PdfPCell pdfcell1 = new PdfPCell(parse(arrayList,titleindex)); pdfcell1.setColspan(titles.length - titleindex); table.addCell(pdfcell1); }else{ titleindex++; PdfPCell pdfCell = new PdfPCell(new Phrase((String)map1.get(titles[j]),ChineseFont( 12 , Font.NORMAL, BaseColor.BLACK))); table.addCell(pdfCell); } } } document.add(table); } catch (DocumentException e) { e.printStackTrace(); } } public PdfPTable parse(ArrayList list,int titleindex){ int tablelen = this.returnSinLen(list); PdfPTable nestTable = new PdfPTable(tablelen); try { nestTable.setWidths(getIndex(list,titleindex)); int index = titleindex; for(int i = 0; list != null && i < list.size();i++){ HashMap map = (HashMap)list.get(i); for(int j = 0; j < map.size();j++){ if(map.get(titles[index+j]) != null || map.get(blank) != null){ if(i == 0){ titleindex ++; } String contents = (String)map.get(titles[j+index]); PdfPCell pdfCell = new PdfPCell(new Phrase(contents,ChineseFont(12 , Font.NORMAL, BaseColor.BLACK))); if(map.get(blank) != null &&((String)map.get(blank)).equals(titles[j+index])){ pdfCell.setColspan(tablelen); nestTable.addCell(pdfCell); break; } nestTable.addCell(pdfCell); }else{ ArrayList listNest = (ArrayList)map.get(this.list); nestTable.addCell(new PdfPCell(parse(listNest,titleindex))); } } } } catch (DocumentException e) { e.printStackTrace(); document.close(); } return nestTable; } /** * 普通表 * @param list String[][] * */ public void addTable(String[][] list){ if(list == null || list.length == 0){ return; } try { for(int i = 0;titles != null && i < titles.length;i++){ table.addCell(new PdfPCell(new Phrase(titles[i],ChineseFont()))); } for(int i = 0;list != null && i < list.length;i++){ for(int j = 0;titles != null && j < titles.length;j++){ table.addCell(new PdfPCell(new Phrase(list[i][j],ChineseFont(12 , Font.NORMAL, BaseColor.BLACK)))); } } document.add(table); } catch (DocumentException e) { e.printStackTrace(); document.close(); } } /** * 中文字体 * @param size * @param style * @param color * @return Font * */ public Font ChineseFont(float size, int style, BaseColor color){ BaseFont bfChinese = null; try { bfChinese = BaseFont.createFont( "STSongStd-Light" , "UniGB-UCS2-H" , false ); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return new Font(bfChinese , size , style, color); } /** * 中文字体,默认加粗 * @return Font * */ public Font ChineseFont(){ BaseFont bfChinese = null; try { bfChinese = BaseFont.createFont( "STSongStd-Light" , "UniGB-UCS2-H" , false ); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return new Font(bfChinese , 12 , Font.BOLD, new BaseColor(0, 0, 0)); } /** * 关闭文档 * */ public void close(){ if(document.isOpen()){ document.close(); } } public void setTablewidth(float tablewidth) { this.tablewidth = tablewidth; } public float getTablewidth() { return tablewidth; } @SuppressWarnings("unchecked") public static void main(String[] args){ PdfTable p = new PdfTable(); p.open("D:/test","table.pdf"); p.addTitles(new String[]{"标题1","标题2","标题3"}, new int[]{1,1,1}); String[][] s = {{"内容1","内容1","内容1"},{"内容2","内容2","内容2"},{"内容3","内容3","内容3"}}; p.addTable(s); p.close(); // ArrayList<HashMap<String, String>> list1 = new ArrayList<HashMap<String, String>>(); // HashMap hashMap1 = new HashMap(); // hashMap1.put("标题1", "时间的时间了空间dsl卡"); // hashMap1.put("标题2", "给覅噢凭空人口"); // List list2 = new ArrayList<HashMap<String,String>>(); // for(int i = 0;i<2;i++){ // HashMap hashMap2 = new HashMap(); // hashMap2.put("标题3", "瑞金人金额来看"); // List list3 = new ArrayList<HashMap<String,String>>(); // for(int j = 0; j < 3; j++){ // HashMap hashMap3 = new HashMap(); // if(j == 2){ // hashMap3.put("标题4", "一天一天他"); // hashMap3.put(blank, "标题4"); // }else{ // hashMap3.put("标题4", "计划计划共花费"); // hashMap3.put("标题5", "吧vbvcbvvcsds"); // hashMap3.put("标题6", "了疯狂的克劳福德"); // hashMap3.put("标题7", "全文请我去"); // List list4 = new ArrayList<HashMap<String,String>>(); // for(int z = 0; z < 3; z++){ // HashMap hashMap4 = new HashMap(); // if(z == 2){ // hashMap4.put("标题8", "没那么你那边vbvc"); // hashMap4.put(blank, "标题8"); // }else{ // hashMap4.put("标题8", "开了房贷款了记录"); // hashMap4.put("标题9", "发坡度坡幅度破"); // } // list4.add(hashMap4); // } // hashMap3.put(list, list4); // } // list3.add(hashMap3); // // } // hashMap2.put(list, list3); // list2.add(hashMap2); // } // hashMap1.put(list, list2); // list1.add(hashMap1); // String[] titles = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8","标题9"}; // int[] lengths = {1,1,1,1,1,1,1,1,1}; // PdfTable p = new PdfTable(); // p.open("D:/test","test.pdf"); // p.addTitles(titles, lengths); // p.addNestTable(list1); // p.close(); } }