java 生成pdf

导入依赖

<!-- pdf-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>font-asian</artifactId>
            <version>7.1.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

java 生成pdf

 

package gsa.rule.model.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Value;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfArray;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfObject;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;

import gsa.base.common.Utils.Utils;

public class PdfUtil {
    
    @Value("${nginx.localfilepath}")
    private String filepath;
    
    @Value("${nginx.localfileurl}")
    private String fileurl;
    
    
    
    /**
     * 抠模板
     * @throws Exception
     */
    public static void createAllPdf() throws Exception {
        //填充创建pdf
        PdfReader reader = null;
        PdfStamper stamp = null;
        try {
            reader = new PdfReader("D:/惠州监管平台/2020年7月 惠州市建设项目用地报批评估报告.pdf");
            SimpleDateFormat simp = new SimpleDateFormat("yyyy-MM-dd");
            String times = simp.format(new Date()).trim();
            //创建生成报告名称
//            String root = ServletActionContext.getRequest().getRealPath("/upload") + File.separator;
//            if (!new File(root).exists())
//                new File(root).mkdirs();
//            File deskFile = new File(root, times + ".pdf");
            File path = new File("D:/HZJGPT/" + times + ".pdf");
            BaseFont bf = BaseFont.createFont("STSong-Light",
                    "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // set font
            Font font = new Font(bf,10);
//            FileManagerUtil.uploadFiles(file, filepath);
            stamp = new PdfStamper(reader, new FileOutputStream(path));
            //取出报表模板中的所有字段
            AcroFields form = stamp.getAcroFields();
            for (int i=1; i<=reader.getNumberOfPages(); i++){
                //获得pdfstamper在当前页的上层打印内容.也就是说 这些内容会覆盖在原先的pdf内容之上.
                PdfContentByte over = stamp.getOverContent(i);
                //用pdfreader获得当前页字典对象.包含了该页的一些数据.比如该页的坐标轴信息.
                PdfDictionary p = reader.getPageN(i);
                //拿到mediaBox 里面放着该页pdf的大小信息.
                PdfObject po = p.get(new PdfName("MediaBox"));
                System.out.println(po.isArray());
                //po是一个数组对象.里面包含了该页pdf的坐标轴范围.
                PdfArray pa = (PdfArray) po;
                System.out.println(pa.size());
                //看看y轴的最大值.
                System.out.println(pa.getAsNumber(pa.size()-1));
                //开始写入文本
                over.beginText();
                //设置字体和大小
                over.setFontAndSize(font.getBaseFont(), 10);
                //设置字体的输出位置
                over.setTextMatrix(107, 540);
                //要输出的text
                over.showText("我要加[终稿]字样 " + i);
                over.endText();
                //创建一个image对象.
                /*Image image = Image.getInstance("c:/1.jpg");
                //设置image对象的输出位置pa.getAsNumber(pa.size()-1).floatValue() 是该页pdf坐标轴的y轴的最大值
                image.setAbsolutePosition(0,pa.getAsNumber(pa.size()-1).floatValue()-100);//0, 0, 841.92, 595.32
                over.addImage(image);*/
                //画一个圈.
                over.setRGBColorStroke(0xFF, 0x00, 0x00);
                over.setLineWidth(5f);
                over.ellipse(250, 450, 350, 550);
                over.stroke();
                }
            stamp.close();

            // 填充数据
            form.setField("fpzs", "123");
            form.setField("ysyzs", "123");
            form.setField("syzs", "15");

            //报告生成日期
            SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
            String generationdate = dateformat.format(new Date());
            form.setField("generationdate", generationdate);
            stamp.setFormFlattening(true);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stamp != null) {
                stamp.close();
            }
            if (reader != null) {
                reader.close();
            }
        }
    }
    
    public static void pdf() throws DocumentException, IOException {
        String zb="惠州市2020年度用地计划指标共计fpzs亩,已使用指标ysyzs亩,剩余syzs亩,使用率syl。其中,新增建设用地计划指标fpxzzs亩,已使用ysyxzzs亩,剩余syxzzs亩,使用率xzsyl;复垦周转指标fpfkzs亩,已使用ysyfkzs亩,剩余syfkzs亩,使用率fksyl;增减挂钩指标fpzjzs亩,已使用ysyzjzs亩,剩余syzjzs亩,使用率zjsyl。";
        String zb1="惠州市xxxx年xx月,已完成组卷的用地报批面积共计xxx亩。其中,报批的农用地xxx亩,耕地xxx亩,基本农田xxx亩,未利用地xxx亩。正在报批的面积xxx亩,其中:农用地xxx亩,耕地xxx亩,基本农田xxx亩,未利用地xxx亩;已报批面积xxx亩,其中:农用地xxx亩,耕地xxx亩,基本农田xxx亩,未利用地xxx亩。";
        String zb2="惠州市xxxx年xx月,已完成组卷的用地报批面积共计xxx亩。其中,单独选址项目用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;批次用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;城市建设用地农用地转用和土地征收实施方案报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;“只转不征”项目用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;报国务院批准的城市建设用地(一年一批次)面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%。各区县报批类型统计情况见下表:";
        String zb3="惠州市xxxx年xx月,已完成组卷的用地报批面积共计xxx亩,工业用地xxx亩,工业用地占比xx%。其中,商服用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;住宅用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;工矿仓储用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;其他用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%。各区县开发用途统计情况见下表:";
//        Document document =new Document(); // 默认页面大小是A4
//        Document document =new Document(PageSize.A4); // 指定页面大小为A4
        String times = Utils.getRandomStr(5);
        Document document =new Document(PageSize.A4,50,50,100,20); // 指定页面大小为A4,且自定义页边距(marginLeft、marginRight、marginTop、marginBottom)
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/HZJGPT/" + times + ".pdf"));
        document.open();
        BaseFont bfChinese;
        bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
//        bfChinese=BaseFont.createFont("C:/Windows/Fonts/msyh.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); //系统字体,其实5.0版以后的iText加入字体还是很方便的。
        Font topfont = new Font(bfChinese,14,Font.NORMAL);
        Font textfont =new Font(bfChinese,10,Font.BOLD|Font.UNDERLINE);
        Font font = new Font(bfChinese, 12);
        Font bigtitielFont = new Font(bfChinese, 18, Font.BOLD);//设置字体
        Font titielFont = new Font(bfChinese, 22, Font.BOLD);//设置字体
        Font dateFont = new Font(bfChinese, 22, Font.NORMAL);//设置字体
        Font FontChinese = new Font(bfChinese, 16, Font.NORMAL);
        Paragraph elements = new Paragraph("惠州市建设项目用地报批评估报告", titielFont);
        elements.setAlignment(Paragraph.ALIGN_CENTER);
        document.add(elements);
        Paragraph pdate = new Paragraph("(2020年7月)", dateFont);
        pdate.setAlignment(Paragraph.ALIGN_CENTER);
        pdate.setSpacingAfter(40f);
        document.add(pdate);
        Paragraph p1=new Paragraph("一、报批情况汇总",bigtitielFont);//设置字体样式
        p1.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p1.setFirstLineIndent(24);// 首行缩进 
        p1.setLeading(35f); //行间距
        document.add(p1);
        Paragraph p2=new Paragraph("(一)    指标分配及使用情况",FontChinese);//设置字体样式
        p2.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p2.setFirstLineIndent(24);// 首行缩进 
        p2.setLeading(35f); //行间距
        document.add(p2);
        Paragraph pt=new Paragraph(zb,FontChinese);//设置字体样式
        pt.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
//        pt.setIndentationLeft(12);// 左缩进  
//        pt.setIndentationRight(12);// 右缩进  
        pt.setFirstLineIndent(24);// 首行缩进 
        pt.setLeading(35f); //行间距
//        pt.setSpacingBefore(5f); //设置段落上空白
//        pt.setSpacingAfter(10f); //设置段落下空白
//        File path = new File("D:/HZJGPT/" + times + ".pdf");
        document.add(pt);

        // 5.关闭文档
        document.close();
    
    }
    
    public static void generatePdf() throws DocumentException, IOException {
        String zb="惠州市2020年度用地计划指标共计fpzs亩,已使用指标ysyzs亩,剩余syzs亩,使用率syl。其中,新增建设用地计划指标fpxzzs亩,已使用ysyxzzs亩,剩余syxzzs亩,使用率xzsyl;复垦周转指标fpfkzs亩,已使用ysyfkzs亩,剩余syfkzs亩,使用率fksyl;增减挂钩指标fpzjzs亩,已使用ysyzjzs亩,剩余syzjzs亩,使用率zjsyl。";
        String zb1="惠州市xxxx年xx月,已完成组卷的用地报批面积共计xxx亩。其中,报批的农用地xxx亩,耕地xxx亩,基本农田xxx亩,未利用地xxx亩。正在报批的面积xxx亩,其中:农用地xxx亩,耕地xxx亩,基本农田xxx亩,未利用地xxx亩;已报批面积xxx亩,其中:农用地xxx亩,耕地xxx亩,基本农田xxx亩,未利用地xxx亩。";
        String zb2="惠州市xxxx年xx月,已完成组卷的用地报批面积共计xxx亩。其中,单独选址项目用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;批次用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;城市建设用地农用地转用和土地征收实施方案报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;“只转不征”项目用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;报国务院批准的城市建设用地(一年一批次)面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%。各区县报批类型统计情况见下表:";
        String zb3="惠州市xxxx年xx月,已完成组卷的用地报批面积共计xxx亩,工业用地xxx亩,工业用地占比xx%。其中,商服用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;住宅用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;工矿仓储用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%;其他用地报批面积xxx亩,去年同期xxx亩,上月xxx亩,同比增加/减少xx%,环比增加/减少xx%。各区县开发用途统计情况见下表:";
        String times = Utils.getRandomStr(5);
        Document document =new Document(PageSize.A4,50,50,100,20); // 指定页面大小为A4,且自定义页边距(marginLeft、marginRight、marginTop、marginBottom)
        PdfWriter.getInstance(document, new FileOutputStream("D:/HZJGPT/" + times + ".pdf"));
        document.open();
        BaseFont bfChinese;
        bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
        Font topfont = new Font(bfChinese,14,Font.NORMAL);
        Font textfont =new Font(bfChinese,10,Font.BOLD|Font.UNDERLINE);
        Font font = new Font(bfChinese, 12);
        Font bigtitielFont = new Font(bfChinese, 18, Font.BOLD);//设置字体
        Font titielFont = new Font(bfChinese, 22, Font.BOLD);//设置字体
        Font dateFont = new Font(bfChinese, 22, Font.NORMAL);//设置字体
        Font FontChinese = new Font(bfChinese, 16, Font.NORMAL);
        Paragraph elements = new Paragraph("惠州市建设项目用地报批评估报告", titielFont);
        elements.setAlignment(Paragraph.ALIGN_CENTER);
        document.add(elements);
        //----------------------------------------------------------------------------
        Paragraph pdate = new Paragraph("(2020年7月)", dateFont);
        pdate.setAlignment(Paragraph.ALIGN_CENTER);
        pdate.setSpacingAfter(40f);
        document.add(pdate);
        //--------------------------------------------------------------------
        Paragraph p1=new Paragraph("一、报批情况汇总",bigtitielFont);//设置字体样式
        p1.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p1.setFirstLineIndent(24);// 首行缩进 
        p1.setLeading(35f); //行间距
        document.add(p1);
        //------------------------------------------------------------------------
        Paragraph p2=new Paragraph("(一)    指标分配及使用情况",FontChinese);//设置字体样式
        p2.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p2.setFirstLineIndent(24);// 首行缩进 
        p2.setLeading(35f); //行间距
        document.add(p2);
        //-------------------------------------------------------------------------
        Paragraph pt=new Paragraph(zb,FontChinese);//设置字体样式
        pt.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        pt.setFirstLineIndent(24);// 首行缩进 
        pt.setLeading(35f); //行间距
        document.add(pt);
        //------------------------------------------------------------------------------
        Paragraph p3=new Paragraph("(二)    报批情况实时监控",FontChinese);//设置字体样式
        p3.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p3.setFirstLineIndent(24);// 首行缩进 
        p3.setLeading(35f); //行间距
        document.add(p3);
        //------------------------------------------------------------------------
        Paragraph pt1=new Paragraph(zb1,FontChinese);//设置字体样式
        pt1.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        pt1.setFirstLineIndent(24);// 首行缩进 
        pt1.setLeading(35f); //行间距
        document.add(pt1);
        //------------------------------------------------------------------------
        
        //*****************************************************************************
        
        //--------------------------------------------------------------------
        Paragraph p4=new Paragraph("二、报批情况专项统计",bigtitielFont);//设置字体样式
        p4.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p4.setFirstLineIndent(24);// 首行缩进 
        p4.setLeading(35f); //行间距
        document.add(p4);
        //------------------------------------------------------------------------
        Paragraph p5=new Paragraph("(一)    按报批类型统计",FontChinese);//设置字体样式
        p5.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p5.setFirstLineIndent(24);// 首行缩进 
        p5.setLeading(35f); //行间距
        document.add(p5);
        //-------------------------------------------------------------------------
        Paragraph pt2=new Paragraph(zb2,FontChinese);//设置字体样式
        pt2.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        pt2.setFirstLineIndent(24);// 首行缩进 
        pt2.setLeading(35f); //行间距
        document.add(pt2);
        //------------------------------------------------------------------------------
        Paragraph p6=new Paragraph("(二)    按开发用途统计",FontChinese);//设置字体样式
        p6.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p6.setFirstLineIndent(24);// 首行缩进 
        p6.setLeading(35f); //行间距
        document.add(p6);
        //------------------------------------------------------------------------
        Paragraph pt3=new Paragraph(zb3,FontChinese);//设置字体样式
        pt3.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        pt3.setFirstLineIndent(24);// 首行缩进 
        pt3.setLeading(35f); //行间距
        document.add(pt3);
        //------------------------------------------------------------------------

        // 5.关闭文档
        document.close();
    
    }
//    double fpzs=zbmap.get("TOTAL");
//    double syzs=0.0;
//    double fpxzzs=0.0;
//    double ysyxzzs=0.0;
//    double syxzzs=0.0;
//    double xzsyl=0.0;
//    double fpfkzs=0.0;
//    double ysyfkzs=0.0;
//    double syfkzs=0.0;
//    double fksyl=0.0;
//    double fpzjzs=0.0;
//    double ysyzjzs=0.0;
//    double syzjzs=0.0;
//    double zjsyl=0.0;
    public static void generatePdf(String year,String month,List<Map<String, Object>> zblist,List<Map<String, Object>> bplist,List<Map<String, Object>> lxlist,List<Map<String, Object>> lxhblist,List<Map<String, Object>> kflist,List<Map<String, Object>> kfhblist,String filepath) throws DocumentException, IOException {
        Map<String, Object> zbmap=zblist.get(0);
        Map<String, Object> bpmap=bplist.get(0);
        Map<String, Object> lxmap=new HashMap<>();
        Map<String, Object> lxhbmap=new HashMap<String, Object>();
        Map<String, Object> lxtbmap=new HashMap<String, Object>();
        for(Map<String, Object> map:lxlist) {
            if("现期".equals(map.get("TYPE"))&&"全市".equals(map.get("XZQHMC"))) {
                lxmap=map;
            }else if("同比".equals(map.get("TYPE"))&&"全市".equals(map.get("XZQHMC"))){
                lxtbmap=map;
            }
        }
        for(Map<String, Object> map:lxhblist) {
            if("环比".equals(map.get("TYPE"))&&"全市".equals(map.get("XZQHMC"))) {
                lxhbmap=map;
            }
        }
        Map<String, Object> kfmap=new HashMap<>();
        Map<String, Object> kfhbmap=new HashMap<String, Object>();
        Map<String, Object> kftbmap=new HashMap<String, Object>();
        for(Map<String, Object> map:kflist) {
            if("现期".equals(map.get("TYPE"))&&"全市".equals(map.get("XZQHMC"))) {
                kfmap=map;
            }else if("同比".equals(map.get("TYPE"))&&"全市".equals(map.get("XZQHMC"))){
                kftbmap=map;
            }
        }
        for(Map<String, Object> map:kfhblist) {
            if("环比".equals(map.get("TYPE"))&&"全市".equals(map.get("XZQHMC"))) {
                kfhbmap=map;
            }
        }
        String zb="惠州市"+year+"年度用地计划指标共计"+zbmap.get("TOTAL")+"亩,已使用指标"+zbmap.get("YSY_TOTAL")+"亩,剩余"+zbmap.get("SY_TOTAL")+"亩,使用率"+zbmap.get("TOTAL_SYL")+"。其中,新增建设用地计划指标"+zbmap.get("XZJSYD")+"亩,已使用"+zbmap.get("YSY_XZJSYD")+"亩,剩余"+zbmap.get("SY_XZJSYD")+"亩,使用率"+zbmap.get("XZJSYD_SYL")+";复垦周转指标"+zbmap.get("CJFK")+"亩,已使用"+zbmap.get("YSY_CJFK")+"亩,剩余"+zbmap.get("SY_CJFK")+"亩,使用率"+zbmap.get("CJFK_SYL")+";增减挂钩指标"+zbmap.get("ZJGG")+"亩,已使用"+zbmap.get("YSY_ZJGG")+"亩,剩余"+zbmap.get("SY_ZJGG")+"亩,使用率"+zbmap.get("ZJGG_SYL")+"。";
        String zb1="惠州市"+year+"年"+month+"月,已完成组卷的用地报批面积共计"+bpmap.get("TOTAL")+"亩。其中,报批的农用地"+bpmap.get("TOTAL_NYDMJ")+"亩,耕地"+bpmap.get("TOTAL_GDMJ")+"亩,基本农田"+bpmap.get("TOTAL_YJJBNT")+"亩,未利用地"+bpmap.get("TOTAL_WLYD")+"亩。正在报批的面积"+bpmap.get("ZZBP_TOTAL")+"亩,其中:农用地"+bpmap.get("ZZBP_NYDMJ")+"亩,耕地"+bpmap.get("ZZBP_GDMJ")+"亩,基本农田"+bpmap.get("ZZBP_YJJBNT")+"亩,未利用地"+bpmap.get("ZZBP_WLYD")+"亩;已报批面积"+bpmap.get("YBP_TOTAL")+"亩,其中:农用地"+bpmap.get("YBP_NYDMJ")+"亩,耕地"+bpmap.get("YBP_GDMJ")+"亩,基本农田"+bpmap.get("YBP_YJJBNT")+"亩,未利用地"+bpmap.get("YBP_WLYD")+"亩。";
        String zb2="惠州市"+year+"年"+month+"月,已完成组卷的用地报批面积共计"+lxmap.get("TOTAL_ZMJ")+"亩。其中,单独选址项目用地报批面积"+lxmap.get("DDXZ_ZMJ")+"亩,去年同期"+lxtbmap.get("DDXZ_ZMJ")+"亩,上月"+lxhbmap.get("DDXZ_ZMJ")+"亩,同比"+tbhb(lxmap.get("DDXZ_ZMJ").toString(),lxtbmap.get("DDXZ_ZMJ").toString())+",环比"+tbhb(lxmap.get("DDXZ_ZMJ").toString(),lxhbmap.get("DDXZ_ZMJ").toString())+";批次用地报批面积"+lxmap.get("CSFP_ZMJ")+"亩,去年同期"+lxtbmap.get("CSFP_ZMJ")+"亩,上月"+lxhbmap.get("CSFP_ZMJ")+"亩,同比"+tbhb(lxmap.get("CSFP_ZMJ").toString(),lxtbmap.get("CSFP_ZMJ").toString())+",环比"+tbhb(lxmap.get("CSFP_ZMJ").toString(),lxhbmap.get("CSFP_ZMJ").toString())+";城市建设用地农用地转用和土地征收实施方案报批面积"+lxmap.get("SSFA_ZMJ")+"亩,去年同期"+lxtbmap.get("SSFA_ZMJ")+"亩,上月"+lxhbmap.get("SSFA_ZMJ")+"亩,同比"+tbhb(lxmap.get("SSFA_ZMJ").toString(),lxtbmap.get("SSFA_ZMJ").toString())+",环比"+tbhb(lxhbmap.get("SSFA_ZMJ").toString(),lxhbmap.get("SSFA_ZMJ").toString())+";“只转不征”项目用地报批面积"+lxmap.get("ZZBP_ZMJ")+"亩,去年同期"+lxtbmap.get("ZZBP_ZMJ")+"亩,上月"+lxhbmap.get("ZZBP_ZMJ")+"亩,同比"+tbhb(lxmap.get("ZZBP_ZMJ").toString(),lxhbmap.get("ZZBP_ZMJ").toString())+",环比"+tbhb(lxmap.get("ZZBP_ZMJ").toString(),lxhbmap.get("ZZBP_ZMJ").toString())+";报国务院批准的城市建设用地(一年一批次)面积"+lxmap.get("GWY_ZMJ")+"亩,去年同期"+lxtbmap.get("GWY_ZMJ")+"亩,上月"+lxhbmap.get("GWY_ZMJ")+"亩,同比"+tbhb(lxmap.get("GWY_ZMJ").toString(),lxtbmap.get("GWY_ZMJ").toString())+",环比"+tbhb(lxmap.get("GWY_ZMJ").toString(),lxhbmap.get("GWY_ZMJ").toString())+"。各区县报批类型统计情况见下表:";
        String zb3="惠州市"+year+"年"+month+"月,已完成组卷的用地报批面积共计"+kfmap.get("TOTAL")+"亩,工业用地"+kfmap.get("GF_YD")+"亩,工业用地占比xx%。其中,商服用地报批面积"+kfmap.get("SF_YD")+"亩,去年同期"+kftbmap.get("SF_YD")+"亩,上月"+kfhbmap.get("SF_YD")+"亩,同比"+tbhb(kfmap.get("SF_YD").toString(),kftbmap.get("SF_YD").toString())+",环比"+tbhb(kfmap.get("SF_YD").toString(),kfhbmap.get("SF_YD").toString())+";住宅用地报批面积"+kfmap.get("ZZ_YD")+"亩,去年同期"+kftbmap.get("ZZ_YD")+"亩,上月"+kfhbmap.get("ZZ_YD")+"亩,同比"+tbhb(kfmap.get("ZZ_YD").toString(),kftbmap.get("ZZ_YD").toString())+",环比"+tbhb(kfmap.get("ZZ_YD").toString(),kfhbmap.get("ZZ_YD").toString())+";工矿仓储用地报批面积"+kfmap.get("CC_YD")+"亩,去年同期"+kftbmap.get("CC_YD")+"亩,上月"+kfhbmap.get("CC_YD")+"亩,同比"+tbhb(kfmap.get("CC_YD").toString(),kftbmap.get("CC_YD").toString())+",环比"+tbhb(kfmap.get("CC_YD").toString(),kfhbmap.get("CC_YD").toString())+";其他用地报批面积"+kfmap.get("TOTAL_QTYD")+"亩,去年同期"+kftbmap.get("TOTAL_QTYD")+"亩,上月"+kfhbmap.get("TOTAL_QTYD")+"亩,同比"+tbhb(kfmap.get("TOTAL_QTYD").toString(),kftbmap.get("TOTAL_QTYD").toString())+",环比"+tbhb(kfmap.get("ZZ_YD").toString(),kfhbmap.get("TOTAL_QTYD").toString())+"。各区县开发用途统计情况见下表:";
        Document document =new Document(PageSize.A4,50,50,100,20); // 指定页面大小为A4,且自定义页边距(marginLeft、marginRight、marginTop、marginBottom)
        PdfWriter.getInstance(document, new FileOutputStream(filepath));
        document.open();
        BaseFont bfChinese;
        bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
        Font titielFont = new Font(bfChinese, 22, Font.BOLD);//设置字体
        Font dateFont = new Font(bfChinese, 22, Font.NORMAL);//设置字体
        Paragraph elements = new Paragraph("惠州市建设项目用地报批评估报告", titielFont);
        elements.setAlignment(Paragraph.ALIGN_CENTER);
        document.add(elements);
        //----------------------------------------------------------------------------
        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
        Font size14font = new Font(baseFont,14,Font.NORMAL);  //大小为14的正常字体
        Font size10font = new Font(baseFont,10); //大小为10的粗体
        Paragraph pdate = new Paragraph("(2020年7月)", dateFont);
        pdate.setAlignment(Paragraph.ALIGN_CENTER);
        pdate.setSpacingAfter(40f);
        document.add(pdate);
        document.add(getP("一、报批情况汇总"));
        document.add(getPtwo("(一)    指标分配及使用情况"));
        document.add(getPtwo(zb));
        document.add(getPthree("表 1 指标分配及使用情况监控"));
        PdfPTable pdfPTable=getInitTable(size10font,zblist);
        document.add(pdfPTable);
        document.add(getPtwo("(二)    报批情况实时监控"));
        document.add(getPtwo(zb1));
        document.add(getPthree("表 2 用地报批实时统计情况"));
        pdfPTable=getInitYdBpTable(size10font,bplist);
        document.add(pdfPTable);
        //-----------------------------------------
        document.add(getP("二、报批情况专项统计"));
        document.add(getPtwo("(一)    按报批类型统计"));
        document.add(getPtwo(zb2));
        document.add(getPthree("表 3 "+year+"年"+month+"月按报批类型统计"));
        pdfPTable=getInitBplxxqTable(size10font,lxlist);
        document.add(pdfPTable);
        
        document.add(getPthree("表 4 "+year+"年"+month+"月按报批类型同比统计"));
        pdfPTable=getInitBplxtbTable(size10font,lxlist);
        document.add(pdfPTable);
        
        document.add(getPthree("表 5 "+year+"年"+month+"月按报批类型环比统计"));
        pdfPTable=getInitBplxhbTable(size10font,lxhblist);
        document.add(pdfPTable);
        
        document.add(getPtwo("(二)    按开发用途统计"));
        document.add(getPtwo(zb3));
        document.add(getPthree("表 6 "+year+"年"+month+"月按开发用途统计"));
        pdfPTable=getInitkfytxqTable(size10font,kflist);
        document.add(pdfPTable);
        
        document.add(getPthree("表 7 "+year+"年"+month+"月按开发用途同比统计"));
        pdfPTable=getInitkfyttbTable(size10font,kflist);
        document.add(pdfPTable);
        
        document.add(getPthree("表 8 "+year+"年"+month+"月按开发用途环比统计"));
        pdfPTable=getInitkfythbTable(size10font,kfhblist);
        document.add(pdfPTable);
        
        document.add(getPfour("惠州市自然资源局"));
        document.add(getPfour(year+"年"+month+"月"));
        
        // 5.关闭文档
        document.close();
    
    }
    
    private static void  setAlignCenter(PdfPCell pdfPCell){
            pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
            pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
    }
    
    private static PdfPCell getcell(String text,Font font,int colspan,int rowspan) {
        PdfPCell c1 = new PdfPCell(new Phrase(text,font));
        c1.setColspan(colspan);
        c1.setRowspan(rowspan);
        setAlignCenter(c1);
//        t.addCell(c1);
        return c1;
    }
    
    private static PdfPCell getcell(String text,Font font) {
        PdfPCell c1 = new PdfPCell(new Phrase(text,font));
        setAlignCenter(c1);
        return c1;
    }
    
    public static PdfPTable getInitTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(16);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("指标分配及使用情况监控(公顷)",font));
        c1.setColspan(16);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(3);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("新增建设用地计划指标", font,5,1));
        t.addCell(getcell("复垦周转指标", font,5,1));
        t.addCell(getcell("增减挂钩指标", font,5,1));
        t.addCell(getcell("分配", font,1,2));
        t.addCell(getcell("使用", font,2,1));
        t.addCell(getcell("剩余", font,1,2));
        t.addCell(getcell("使用率", font,1,2));
        
        t.addCell(getcell("分配", font,1,2));
        t.addCell(getcell("使用", font,2,1));
        t.addCell(getcell("剩余", font,1,2));
        t.addCell(getcell("使用率", font,1,2));
        
        t.addCell(getcell("分配", font,1,2));
        t.addCell(getcell("使用", font,2,1));
        t.addCell(getcell("剩余", font,1,2));
        t.addCell(getcell("使用率", font,1,2));
        
        
        t.addCell(getcell("扣除", font));
        t.addCell(getcell("预扣", font));
        t.addCell(getcell("扣除", font));
        t.addCell(getcell("预扣", font));
        t.addCell(getcell("扣除", font));
        t.addCell(getcell("预扣", font));
        
        for(Map<String, Object> map:list) {
            t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
            t.addCell(getcell(String.valueOf(map.get("XZJSYD")), font));
            t.addCell(getcell(String.valueOf(map.get("KC_XZJSYD")), font));
            t.addCell(getcell(String.valueOf(map.get("YK_XZJSYD")), font));
            t.addCell(getcell(String.valueOf(map.get("SY_XZJSYD")), font));
            t.addCell(getcell(String.valueOf(map.get("XZJSYD_SYL")), font));
            t.addCell(getcell(String.valueOf(map.get("CJFK")), font));
            t.addCell(getcell(String.valueOf(map.get("KC_CJFK")), font));
            t.addCell(getcell(String.valueOf(map.get("YK_CJFK")), font));
            t.addCell(getcell(String.valueOf(map.get("SY_CJFK")), font));
            t.addCell(getcell(String.valueOf(map.get("CJFK_SYL")), font));
            t.addCell(getcell(String.valueOf(map.get("ZJGG")), font));
            t.addCell(getcell(String.valueOf(map.get("KC_ZJGG")), font));
            t.addCell(getcell(String.valueOf(map.get("YK_ZJGG")), font));
            t.addCell(getcell(String.valueOf(map.get("SY_ZJGG")), font));
            t.addCell(getcell(String.valueOf(map.get("ZJGG_SYL")), font));
        }

        return t;
    }
    /**
     * 用地报批表格
     * @param font
     * @param list
     * @return
     * @throws DocumentException
     */
    public static PdfPTable getInitYdBpTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(16);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("用地报批实时监控(公顷)",font));
        c1.setColspan(16);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(2);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("农用地", font,3,1));
        t.addCell(getcell("其中耕地", font,3,1));
        t.addCell(getcell("其中基本农田", font,3,1));
        t.addCell(getcell("未利用地", font,3,1));
        t.addCell(getcell("合计", font,3,1));
        
        t.addCell(getcell("在办", font,1,1));
        t.addCell(getcell("批复", font,1,1));
        t.addCell(getcell("小计", font,1,1));
        
        t.addCell(getcell("在办", font,1,1));
        t.addCell(getcell("批复", font,1,1));
        t.addCell(getcell("小计", font,1,1));
        
        t.addCell(getcell("在办", font,1,1));
        t.addCell(getcell("批复", font,1,1));
        t.addCell(getcell("小计", font,1,1));
        
        t.addCell(getcell("在办", font,1,1));
        t.addCell(getcell("批复", font,1,1));
        t.addCell(getcell("小计", font,1,1));
        
        t.addCell(getcell("在办", font,1,1));
        t.addCell(getcell("批复", font,1,1));
        t.addCell(getcell("小计", font,1,1));
        
        
        for(Map<String, Object> map:list) {
            t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
            t.addCell(getcell(String.valueOf(map.get("ZZBP_NYDMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("YBP_NYDMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL_NYDMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("ZZBP_GDMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("YBP_GDMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL_GDMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("ZZBP_YJJBNT")), font));
            t.addCell(getcell(String.valueOf(map.get("YBP_YJJBNT")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL_YJJBNT")), font));
            t.addCell(getcell(String.valueOf(map.get("ZZBP_WLYD")), font));
            t.addCell(getcell(String.valueOf(map.get("YBP_WLYD")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL_WLYD")), font));
            t.addCell(getcell(String.valueOf(map.get("ZZBP_TOTAL")), font));
            t.addCell(getcell(String.valueOf(map.get("YBP_TOTAL")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL")), font));
        }

        return t;
    }
    
    /**
     * 报批类型-现期
     * @param font
     * @param list
     * @return
     * @throws DocumentException
     */
    public static PdfPTable getInitBplxxqTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(6);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("用地报批类型监测(公顷)",font));
        c1.setColspan(6);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("单独选址项目用地报批", font,1,1));
        t.addCell(getcell("批次用地报批", font,1,1));
        t.addCell(getcell("“只转不征”项目用地报批", font,1,1));
        t.addCell(getcell("报国务院批准的城市建设用地(一年一批次)", font,1,1));
        t.addCell(getcell("合计", font,1,1));
        
        for(Map<String, Object> map:list) {
            if("现期".equals(map.get("TYPE"))) {
            t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
            t.addCell(getcell(String.valueOf(map.get("DDXZ_ZMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("CSFP_ZMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("ZZBP_ZMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("GWY_ZMJ")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL_ZMJ")), font));
            }
        }

        return t;
    }
    
    /**
     * 报批类型-同比
     * @param font
     * @param list
     * @return
     * @throws DocumentException
     */
    public static PdfPTable getInitBplxtbTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(7);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("用地报批类型监测(公顷)",font));
        c1.setColspan(7);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(1);
        c1.setColspan(2);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("单独选址项目用地报批", font,1,1));
        t.addCell(getcell("批次用地报批", font,1,1));
        t.addCell(getcell("“只转不征”项目用地报批", font,1,1));
        t.addCell(getcell("报国务院批准的城市建设用地(一年一批次)", font,1,1));
        t.addCell(getcell("合计", font,1,1));
        Map<String,List<Map<String, Object>>> maps=list.stream().collect(Collectors.groupingBy(m->String.valueOf(m.get("XZQHMC"))));
        for(String key:maps.keySet()) {
            t.addCell(getcell(key, font,1,2));
            List<Map<String, Object>> list2=maps.get(key);
            for(Map<String, Object> map:list2) {
                if("现期".equals(map.get("TYPE"))) {
                    t.addCell(getcell("现期", font));
                    t.addCell(getcell(String.valueOf(map.get("DDXZ_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("CSFP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZBP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("GWY_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_ZMJ")), font));
                }
                if("同比".equals(map.get("TYPE"))) {
//                    t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
                    t.addCell(getcell("同比", font));
                    t.addCell(getcell(String.valueOf(map.get("DDXZ_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("CSFP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZBP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("GWY_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_ZMJ")), font));
                }
            }
        }
        return t;
    }
    
    /**
     * 报批类型环比
     * @param font
     * @param list
     * @return
     * @throws DocumentException
     */
    public static PdfPTable getInitBplxhbTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(7);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("用地报批类型监测(公顷)",font));
        c1.setColspan(7);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(1);
        c1.setColspan(2);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("单独选址项目用地报批", font,1,1));
        t.addCell(getcell("批次用地报批", font,1,1));
        t.addCell(getcell("“只转不征”项目用地报批", font,1,1));
        t.addCell(getcell("报国务院批准的城市建设用地(一年一批次)", font,1,1));
        t.addCell(getcell("合计", font,1,1));
        Map<String,List<Map<String, Object>>> maps=list.stream().collect(Collectors.groupingBy(m->String.valueOf(m.get("XZQHMC"))));
        for(String key:maps.keySet()) {
            t.addCell(getcell(key, font,1,2));
            List<Map<String, Object>> list2=maps.get(key);
            for(Map<String, Object> map:list2) {
                if("现期".equals(map.get("TYPE"))) {
                    t.addCell(getcell("现期", font));
                    t.addCell(getcell(String.valueOf(map.get("DDXZ_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("CSFP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZBP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("GWY_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_ZMJ")), font));
                }
                if("环比".equals(map.get("TYPE"))) {
//                    t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
                    t.addCell(getcell("环比", font));
                    t.addCell(getcell(String.valueOf(map.get("DDXZ_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("CSFP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZBP_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("GWY_ZMJ")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_ZMJ")), font));
                }
            }
        }
        return t;
    }
    
    /**
     * 开发用途-现期
     * @param font
     * @param list
     * @return
     * @throws DocumentException
     */
    public static PdfPTable getInitkfytxqTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(13);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("用地报批开发用途监控(公顷)",font));
        c1.setColspan(13);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(2);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("商服用地", font,1,2));
        t.addCell(getcell("住宅用地", font,1,2));
        t.addCell(getcell("工矿仓储用地", font,4,1));
        t.addCell(getcell("其它用地", font,5,1));
        t.addCell(getcell("合计", font,1,1));
        
        t.addCell(getcell("工业用地", font,1,1));
        t.addCell(getcell("仓储用地", font,1,1));
        t.addCell(getcell("盐田", font,1,1));
        t.addCell(getcell("采矿", font,1,1));
        t.addCell(getcell("公服用地", font,1,1));
        t.addCell(getcell("特殊用地", font,1,1));
        t.addCell(getcell("交通运输用地", font,1,1));
        t.addCell(getcell("水利设施用地", font,1,1));
        t.addCell(getcell("其它", font,1,1));
        t.addCell(getcell("", font,1,1));
        
        for(Map<String, Object> map:list) {
            if("现期".equals(map.get("TYPE"))) {
            t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
            t.addCell(getcell(String.valueOf(map.get("SF_YD")), font));
            t.addCell(getcell(String.valueOf(map.get("ZZ_YD")), font));
            t.addCell(getcell(String.valueOf(map.get("GY_YD")), font));
            t.addCell(getcell(String.valueOf(map.get("CC_YD")), font));
            t.addCell(getcell(String.valueOf(map.get("YT")), font));
            t.addCell(getcell(String.valueOf(map.get("CK")), font));
            t.addCell(getcell(String.valueOf(map.get("GF_YD")), font));
            t.addCell(getcell(String.valueOf(map.get("TS_YD")), font));
            t.addCell(getcell(String.valueOf(map.get("JTYS_YD")), font));
            t.addCell(getcell(String.valueOf(map.get("SL")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL_QTYD")), font));
            t.addCell(getcell(String.valueOf(map.get("TOTAL")), font));
            }
        }

        return t;
    }
    
    /**
     * 开发用途-同比
     * @param font
     * @param list
     * @return
     * @throws DocumentException
     */
    public static PdfPTable getInitkfyttbTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(14);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("用地报批开发用途监控(公顷)",font));
        c1.setColspan(14);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(2);
        c1.setColspan(2);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("商服用地", font,1,2));
        t.addCell(getcell("住宅用地", font,1,2));
        t.addCell(getcell("工矿仓储用地", font,4,1));
        t.addCell(getcell("其它用地", font,5,1));
        t.addCell(getcell("合计", font,1,1));
        
        t.addCell(getcell("工业用地", font,1,1));
        t.addCell(getcell("仓储用地", font,1,1));
        t.addCell(getcell("盐田", font,1,1));
        t.addCell(getcell("采矿", font,1,1));
        t.addCell(getcell("公服用地", font,1,1));
        t.addCell(getcell("特殊用地", font,1,1));
        t.addCell(getcell("交通运输用地", font,1,1));
        t.addCell(getcell("水利设施用地", font,1,1));
        t.addCell(getcell("其它", font,1,1));
        t.addCell(getcell("", font,1,1));
        
        Map<String,List<Map<String, Object>>> maps=list.stream().collect(Collectors.groupingBy(m->String.valueOf(m.get("XZQHMC"))));
        for(String key:maps.keySet()) {
            t.addCell(getcell(key, font,1,2));
            List<Map<String, Object>> list2=maps.get(key);
            for(Map<String, Object> map:list2) {
                if("现期".equals(map.get("TYPE"))) {
                    t.addCell(getcell("现期", font));
                    t.addCell(getcell(String.valueOf(map.get("SF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZ_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("GY_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("CC_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("YT")), font));
                    t.addCell(getcell(String.valueOf(map.get("CK")), font));
                    t.addCell(getcell(String.valueOf(map.get("GF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("JTYS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("SL")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_QTYD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL")), font));
                }
                if("同比".equals(map.get("TYPE"))) {
//                    t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
                    t.addCell(getcell("同比", font));
                    t.addCell(getcell(String.valueOf(map.get("SF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZ_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("GY_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("CC_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("YT")), font));
                    t.addCell(getcell(String.valueOf(map.get("CK")), font));
                    t.addCell(getcell(String.valueOf(map.get("GF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("JTYS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("SL")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_QTYD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL")), font));
                }
            }
        }
        
        return t;
    }
    
    /**
     * 开发用途环比
     * @param font
     * @param list
     * @return
     * @throws DocumentException
     */
    public static PdfPTable getInitkfythbTable(Font font,List<Map<String, Object>> list) throws DocumentException {
        PdfPTable t = new PdfPTable(14);
        int width[] = { 50, 50,20,40, 80, 50, 50, 50, 50, 60 };
        t.setWidthPercentage(100);
        PdfPCell c1 = new PdfPCell(new Phrase("用地报批开发用途监控(公顷)",font));
        c1.setColspan(14);
        c1.setMinimumHeight(20);
        c1.setRowspan(1);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); 
        c1.setBackgroundColor(new BaseColor(61,85,158));
        t.addCell(c1);
        t.setSpacingBefore(10);
//        t.setWidths(width);

        c1 = new PdfPCell(new Phrase("",font));
        c1.setRowspan(2);
        c1.setColspan(2);
        c1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        c1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);//垂直居中
        t.addCell(c1);

        t.addCell(getcell("商服用地", font,1,2));
        t.addCell(getcell("住宅用地", font,1,2));
        t.addCell(getcell("工矿仓储用地", font,4,1));
        t.addCell(getcell("其它用地", font,5,1));
        t.addCell(getcell("合计", font,1,1));
        
        t.addCell(getcell("工业用地", font,1,1));
        t.addCell(getcell("仓储用地", font,1,1));
        t.addCell(getcell("盐田", font,1,1));
        t.addCell(getcell("采矿", font,1,1));
        t.addCell(getcell("公服用地", font,1,1));
        t.addCell(getcell("特殊用地", font,1,1));
        t.addCell(getcell("交通运输用地", font,1,1));
        t.addCell(getcell("水利设施用地", font,1,1));
        t.addCell(getcell("其它", font,1,1));
        t.addCell(getcell("", font,1,1));
        
        Map<String,List<Map<String, Object>>> maps=list.stream().collect(Collectors.groupingBy(m->String.valueOf(m.get("XZQHMC"))));
        for(String key:maps.keySet()) {
            t.addCell(getcell(key, font,1,2));
            List<Map<String, Object>> list2=maps.get(key);
            for(Map<String, Object> map:list2) {
                if("现期".equals(map.get("TYPE"))) {
                    t.addCell(getcell("现期", font));
                    t.addCell(getcell(String.valueOf(map.get("SF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZ_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("GY_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("CC_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("YT")), font));
                    t.addCell(getcell(String.valueOf(map.get("CK")), font));
                    t.addCell(getcell(String.valueOf(map.get("GF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("JTYS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("SL")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_QTYD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL")), font));
                }
                if("环比".equals(map.get("TYPE"))) {
//                    t.addCell(getcell(String.valueOf(map.get("XZQHMC")), font));
                    t.addCell(getcell("环比", font));
                    t.addCell(getcell(String.valueOf(map.get("SF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("ZZ_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("GY_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("CC_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("YT")), font));
                    t.addCell(getcell(String.valueOf(map.get("CK")), font));
                    t.addCell(getcell(String.valueOf(map.get("GF_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("JTYS_YD")), font));
                    t.addCell(getcell(String.valueOf(map.get("SL")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL_QTYD")), font));
                    t.addCell(getcell(String.valueOf(map.get("TOTAL")), font));
                }
            }
        }
        return t;
    }
    
    public static void table(Document document) throws DocumentException, IOException {
        //创建字体
        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
        Font size14font = new Font(baseFont,14,Font.NORMAL);  //大小为14的正常字体
        Font size10font = new Font(baseFont,10,Font.BOLD); //大小为10的粗体
         //添加标题
        /*PdfPTable tableName = new PdfPTable(1);
        tableName.setSpacingBefore(25);
        
//        tableName.setSpacingAfter(25);
        tableName.setWidthPercentage(90);  //设置标题长度占纸张比例
        tableName.addCell(mircoSoftFont("个人信息",size14font,50,true,true));
        document.add(tableName);
        //添加第二行的数据
        PdfPTable secondRowTable = new PdfPTable(3); //三列的意思
        secondRowTable.setWidthPercentage(90);
        //这里的数组长度是上面创建的列数,数组的总和为1,就是按比例划分的意思
        secondRowTable.setTotalWidth(new float[]{0.18f,0.32f,0.5f});
        secondRowTable.addCell(mircoSoftFont(" 姓名: ",size10font,50,false,true));
        secondRowTable.addCell(mircoSoftFont("李晓明",size10font,50,false,true));
        secondRowTable.addCell(mircoSoftFont(" 出生日期: 1994年3月14日",size10font,50,false,true));
        document.add(secondRowTable);
        //第三行数据
        PdfPTable thirdRowTable = new PdfPTable(3);
        thirdRowTable.setWidthPercentage(90);
        thirdRowTable.setTotalWidth(new float[]{0.18f,0.32f,0.5f});
        thirdRowTable.addCell(mircoSoftFont(" 名族:",size10font,50,false,true));
        thirdRowTable.addCell(mircoSoftFont("汉族",size10font,50,false,true));
        thirdRowTable.addCell(mircoSoftFont(" 联系电话: 13888880000",size10font,50,false,true));
        document.add(thirdRowTable);
        //第四行数据
        PdfPTable fourthRowTable = new PdfPTable(2);
        fourthRowTable.setWidthPercentage(90);
        fourthRowTable.setTotalWidth(new float[]{0.66f,0.34f});
        fourthRowTable.addCell(mircoSoftFont(" 个人描述 :",size10font,175,false,false));
        fourthRowTable.addCell(mircoSoftFont("个人特长 :",size10font,175,false,false));
        document.add(fourthRowTable);
        //第五行
        PdfPTable fifthDetailName = new PdfPTable(1);
        fifthDetailName.setWidthPercentage(90);
        fifthDetailName.addCell(mircoSoftFont("获奖记录 :",size14font,50,true,true));
        document.add(fifthDetailName);
        //第六行
        PdfPTable sisthRowTalbe= new PdfPTable(1);
        sisthRowTalbe.setWidthPercentage(90);
        sisthRowTalbe.addCell(mircoSoftFont(" 联系地址: "+"广东省广州市天河区XXXXXXXXXXXXXXXXXX",size10font,50,false,true));
        document.add(sisthRowTalbe);*/
        PdfPTable seventhRowTalbe = new PdfPTable(1);
        seventhRowTalbe.setWidthPercentage(90);
        seventhRowTalbe.addCell(mircoSoftFont(" 指标分配及使用情况监控 ",size14font,20,false,true,true));
        seventhRowTalbe.setSpacingBefore(25);
        document.add(seventhRowTalbe);
        //第八行
        PdfPTable eiththRowTalbe = new PdfPTable(3);
        eiththRowTalbe.setWidthPercentage(90);
        eiththRowTalbe.setTotalWidth(new float[]{0.3f,0.5f,0.2f});
        eiththRowTalbe.addCell(mircoSoftFont(" 分配指标",size10font,20,true,true,false));
        eiththRowTalbe.addCell(mircoSoftFont(" 就读日期",size10font,20,true,true,false));
        eiththRowTalbe.addCell(mircoSoftFont(" 联系人",size10font,20,true,true,false));
        document.add(eiththRowTalbe);
        //接下来加List
        String school = "XXX学校";
        String time = "201909  -  2022-06";
        String name = "陈某";
        for (int i = 0 ;i<4 ;i++){
            PdfPTable tempTable = new PdfPTable(3);
            tempTable.setWidthPercentage(90);
            tempTable.setTotalWidth(new float[]{0.3f,0.5f,0.2f});
            tempTable.addCell(mircoSoftFont(school,size10font,20,true,true,false));
            tempTable.addCell(mircoSoftFont(time,size10font,20,true,true,false));
            tempTable.addCell(mircoSoftFont(name,size10font,20,true,true,false));
            document.add(tempTable);
        }

    }
    
    private static PdfPCell  mircoSoftFont(String str,Font font,int high,boolean alignCenter,boolean alignMidde,Boolean alignLeft){
        PdfPCell pdfPCell  = new PdfPCell(new Phrase(str,font));
        pdfPCell.setMinimumHeight(high);
        pdfPCell.setUseAscender(true); // 设置可以居中
        if (alignCenter){
            pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        }
        if(alignLeft) {
            pdfPCell.setHorizontalAlignment(pdfPCell.ALIGN_LEFT);
        }
        if (alignMidde){
            pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
        }
        return pdfPCell;
    }

    
    private static PdfPCell  mircoSoftFont(String str,Font font,int high,boolean alignCenter,boolean alignMidde,Boolean alignLeft,boolean haveColor){
        PdfPCell pdfPCell  = new PdfPCell(new Phrase(str,font));
        pdfPCell.setMinimumHeight(high);
        pdfPCell.setUseAscender(true); // 设置可以居中
        if (alignCenter){
            pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); // 设置水平居中
        }
        if(alignLeft) {
            pdfPCell.setHorizontalAlignment(pdfPCell.ALIGN_LEFT);
        }
        if (alignMidde){
            pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); // 设置垂直居中
        }
        if (haveColor){
            //颜色代码 RGB
            pdfPCell.setBackgroundColor(new BaseColor(217,217,217));
        }
        return pdfPCell;
    }
    
    public static PdfPTable t() {
        PdfPTable t = new PdfPTable(3);
         
        t.setSpacingBefore(25);
         
        t.setSpacingAfter(25);
         
        PdfPCell c1 = new PdfPCell(new Phrase("Header1")); 
         
        t.addCell(c1);
         
        PdfPCell c2 = new PdfPCell(new Phrase("Header2"));
         
        t.addCell(c2);
         
        PdfPCell c3 = new PdfPCell(new Phrase("Header3"));
         
        t.addCell(c3);
         
        t.addCell("1.1");
         
        t.addCell("1.2");
         
        t.addCell("1.3");
         
//        section1.add(t);
        return t;
    }
    
    private static PdfPTable createTable(int colNum, float[] columnWidths) {
        PdfPTable table = new PdfPTable(colNum);
        try {
            table.setWidths(columnWidths);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        table.setSpacingBefore(20f);//设置页边距
        table.setWidthPercentage(100);//设置表格宽度为100%
        return table;
    }
    
    private static void generatorHeader(PdfPTable table, String headerSuffix) throws DocumentException, IOException {

        table.addCell(createPdfPCell("Location 0BBPW", 1, 1, Element.ALIGN_CENTER));
        table.addCell(createPdfPCell("哈哈哈", 2, 2, Element.ALIGN_CENTER));

    }
    
    private static PdfPCell createPdfPCell(String text, int colSpan, int rowSpan) throws DocumentException, IOException {
        return createPdfPCell(text, colSpan, rowSpan, Element.ALIGN_RIGHT);
    }

    private static PdfPCell createPdfPCell(String text, int colSpan, int rowSpan, int align) throws DocumentException, IOException {
        PdfPCell pdfPCell = new PdfPCell();
        pdfPCell.setColspan(colSpan);
        pdfPCell.setRowspan(rowSpan);
        pdfPCell.setPhrase(createParagraph(text));
        pdfPCell.setHorizontalAlignment(align);
        pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        return pdfPCell;
    }

    private static Paragraph createParagraph(String text) throws DocumentException, IOException {
        Paragraph paragraph;
        BaseFont bfChinese;
        bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
        Font font = new Font(bfChinese, 8, Font.NORMAL);
        paragraph = new Paragraph(text, font);
        paragraph.setAlignment(Phrase.ALIGN_CENTER);
        return paragraph;
    }
    
    public static String tbhb(String val,String val1) {
        double val2=Double.parseDouble(val);
        double val3=Double.parseDouble(val1);
        double res=0;
        if(val3!=0) {
             res=Utils.decimalFormat((val2-val3)/val3*100, 2);
        }
        if(res>=0) {
            return "增加"+res+"%";
        }else {
            return "减少"+res+"%";
        }
    }
    
    private static Paragraph getP(String name) throws DocumentException, IOException {
      BaseFont bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
      Font bigtitielFont = new Font(bfChinese, 18, Font.BOLD);//设置字体
      Paragraph p=new Paragraph(name,bigtitielFont);//设置字体样式
      p.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
      p.setFirstLineIndent(24);// 首行缩进 
      p.setLeading(35f); //行间距
      return p;
    }
    
    private static Paragraph getPtwo(String name) throws DocumentException, IOException {
        BaseFont bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
        Font FontChinese = new Font(bfChinese, 16, Font.NORMAL);
        Paragraph p2=new Paragraph(name,FontChinese);//设置字体样式
        p2.setAlignment(3);//设置文字居中 0靠左   1,居中     2,靠右
        p2.setFirstLineIndent(24);// 首行缩进 
        p2.setLeading(35f); //行间距
        return p2;
      }
    
    private static Paragraph getPthree(String name) throws DocumentException, IOException {
        BaseFont bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
        Font FontChinese = new Font(bfChinese, 10, Font.NORMAL);
        Paragraph p2=new Paragraph(name,FontChinese);//设置字体样式
        p2.setAlignment(1);//设置文字居中 0靠左   1,居中     2,靠右
//        p2.setFirstLineIndent(24);// 首行缩进 
        p2.setLeading(35f); //行间距
        return p2;
      }
    
    private static Paragraph getPfour(String name) throws DocumentException, IOException {
        BaseFont bfChinese=BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//jar包
        Font FontChinese = new Font(bfChinese, 16, Font.NORMAL);
        Paragraph p2=new Paragraph(name,FontChinese);//设置字体样式
        p2.setAlignment(2);//设置文字居中 0靠左   1,居中     2,靠右
//        p2.setFirstLineIndent(24);// 首行缩进 
        p2.setLeading(35f); //行间距
        return p2;
      }

    public static void main(String[] args) throws Exception {
//        generatePdf("2020");
    }

}