最近公司让做pdf导出索性看了一下
生成一个新的pdf页面并操作当前页面
首选pom导入 这个是导入所有的组件包含中文解决的
<!-- add all iText Core modules --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.0.3</version> <type>pom</type> </dependency>
然后具体util我只写了生成表格的pdf,因为公司的需求就是这些
直接写个主方法调用test就可以生成一个demo文档了
package com.rib.scs.util; import com.google.common.collect.Lists; import com.itextpdf.kernel.color.Color; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.PageSize; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.border.SolidBorder; import com.itextpdf.layout.element.AreaBreak; import com.itextpdf.layout.element.Cell; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.element.Table; import com.itextpdf.layout.property.AreaBreakType; import com.itextpdf.layout.property.TextAlignment; import java.io.IOException; import java.util.List; /** * @(#):Itext7Test.java * @description: * @author: wangkk 2017/7/7 * @version: Version 1.0 */ public class Itext7PdfUtil { //创建总表形式(一行四格)应该是月份个数+4;仅使用当前导出 public static final float[] floats27Day = new float[] { 26, 26,3,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26}; public static final float[] floats28Day = new float[] { 26, 26,3,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26}; public static final float[] floats30Day = new float[] { 26, 26,3,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26}; public static final float[] floats31Day = new float[] { 26, 26,3,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26}; static PdfFont helvetica = null; static PdfFont helveticaBold = null; public static void test(String path) throws Exception { Document doc = createPdfDocument(path,new PageSize(842.0F, 595.0F)); //添加大标题 loadSpreadhead("三安光电",doc,18,Color.RED); loadSpreadhead("2017年六月出勤表",doc,10,Color.BLUE); //添加小标题 loadTitle("班组:泥工班",doc,12,Color.BLUE); //创建总表形式(一行四格)应该是月份个数+4; float[] floats = new float[] { 10, 10, 2, 2 ,2,2, 2, 2 ,2,2, 2, 2 ,2,2, 2, 2 ,2,2, 2, 2 ,2,2, 2, 2 ,2,2,2,2,2,10,10}; Table table = createTable(floats,94); //表头 应该是总的列数 for(int i=0;i<31;i++){ table.addCell(new Cell().add(new Paragraph(""+("中文")).setFont(helvetica).setBold().setFontSize(8)).setBorder(new SolidBorder(Color.BLACK, 0.5f)).setBold().setBackgroundColor(Color.GREEN)); } //在新列增加三条数据跨两行 table = table.startNewRow(); processTable(table, Lists.newArrayList("第一个跨行数据"),helvetica,false,2,1,9); processTable(table, Lists.newArrayList("第二个跨行数据"),helvetica,false,2,1,9); List<String> data1 = Lists.newArrayList(); for(int i=1;i<=27;i++){ data1.add("--afdsafasfdfafdsfasfsdf"); } processTable(table,data1,helvetica,false,1,1,9); processTable(table, Lists.newArrayList("倒数第二个跨行数据"),helvetica,false,2,1,9); processTable(table, Lists.newArrayList("倒数第一个跨行数据"),helvetica,false,2,1,9); //在加27行考勤数据 processTable(table,data1,helvetica,false,1,1,9); doc.add(table); loadTitle("班组组长签字________",doc,12,Color.BLACK); doc.close(); } /** * @Title: process * @Description: 处理table * @param table * @param texts * @param font * @param isHeader */ public static void processTable(Table table, List<String> texts, PdfFont font, boolean isHeader ,int rowspan,int colspan,int fontSize) { if (isHeader) { if(texts!=null && texts.size()>0){ //如果表格行过大就补空 for (String text :texts){ table.addHeaderCell(new Cell(rowspan,colspan).add(new Paragraph(text).setFont(font)).setFontSize(9).setBorder(new SolidBorder(Color.BLACK, 0.5f)).setBold()); } } } else { if(texts!=null && texts.size()>0){ for (String text :texts){ table.addCell(new Cell(rowspan,colspan).add(new Paragraph(text).setFont(font)).setFontSize(fontSize).setBorder(new SolidBorder(Color.BLACK, 0.5f))); } } } } /** * 生成一个table * @param floats * @param Width * @return */ public static Table createTable(float[] floats,int Width){ Table table = new Table(floats).setWidthPercent(Width); return table; } /** * 生成一个新的pdf面板并返回当前一个可操作的页面 * @param document * @return */ public static Document createNewDocument(Document document){ return document.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); } /** * 生成一个pdf面板并返回一个可操作的页面 * @param filePath * @param pageSize * @return */ public static Document createPdfDocument(String filePath,PageSize pageSize){ Document doc = null; if (pageSize == null){ // pageSize = new PageSize(595,84); pageSize = new PageSize(595,84); } try { //处理中文问题 helvetica = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); helveticaBold = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false); PdfDocument pdfDoc = new PdfDocument(new PdfWriter(filePath)); doc = new Document(pdfDoc,pageSize); } catch (IOException e) { e.printStackTrace(); } return doc; } /*** * @Title: title * @Description: 添加标题 * @param text * @param document */ public static void loadTitle(String text, Document document,int fontSize,Color color){ document.add(new Paragraph(text).setFont(helvetica).setBold().setFontSize(fontSize).setFontColor(color)); } /** * 添加大标题 * @param spreadhead * @param document */ public static void loadSpreadhead(String spreadhead, Document document,int fontSize,Color color){ Paragraph p = new Paragraph(spreadhead).setTextAlignment(TextAlignment.CENTER).setFont(helveticaBold).setFontSize(fontSize).setFontColor(color); document.add(p); } /** * 根据长度换行 * @param content * @param length * @return */ public static String stringBr(String content,int length){ StringBuffer returnString = new StringBuffer(); int numberOfSize = content.length()/length; for(int i = 0; i<=numberOfSize;i++){ String StringTmp = null; if(i==numberOfSize){ StringTmp = content.substring(length*i); }else{ StringTmp = content.substring(length*i,length*(i+1)); } returnString = returnString.append(StringTmp); if (i!=numberOfSize){ returnString.append("\n"); } } return returnString.toString(); } /** * 根据类型分割换行 * @param content * @param splitCode * @return */ public static String stringBr(String content,String splitCode){ StringBuffer returnString = new StringBuffer(); String[] sourceStrArray = content.split(splitCode); if (sourceStrArray.length>1){ for (int i = 0; i < sourceStrArray.length; i++) { returnString = returnString.append(sourceStrArray[i]); returnString.append("\n"); } }else if(sourceStrArray.length==1){ return content.replaceAll(",", ""); } return returnString.toString(); } }
具体其他需求比如修改颜色了,设置页面大小啥的,可以去官方查看api,或者去百度谷歌搜索,有很多比我写的详细的demo,
官方api地址http://itextpdf.com/itext-demos
扫描二维码关注公众号,回复:
337933 查看本文章