itext7 pdf生成表格以及生成新的一页以及util一枚供参考

最近公司让做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

猜你喜欢

转载自wangkeke.iteye.com/blog/2386802