< id > jeesite-repos </ id > < name > Jeesite Repository </ name > < url > http://maven.aliyun.com/nexus/content/groups/public </ url > </ repository > <!-- iText 依赖主仓库,必须有这个 --> < repository > < id > itext </ id > < name > iText Repository - releases </ name > < url > https://repo.itextsupport.com/releases </ url > </ repository > </ repositories > <!-- add all iText Core modules --> < dependency > < groupId > com.itextpdf </ groupId > < artifactId > itext7-core </ artifactId > < version > 7.0.4 </ version > < type > pom </ type > </ dependency > <!-- pdfSweep --> < dependency > < groupId > com.itextpdf </ groupId > < artifactId > cleanup </ artifactId > < version > 1.0.2 </ version > </ dependency > <!-- pdfCalligraph --> < dependency > < groupId > com.itextpdf </ groupId > < artifactId > typography </ artifactId > < version > 1.0.2 </ version > </ dependency > <!-- pdfInvoice --> < dependency > < groupId > com.itextpdf </ groupId > < artifactId > zugferd </ artifactId > < version > 1.0.1 </ version > </ dependency > <!-- pdfHTML --> < dependency > < groupId > com.itextpdf </ groupId > < artifactId > html2pdf </ artifactId > < version > 1.0.1 </ version > </ dependency > <!-- pdfXFA --> < dependency > < groupId > com.itextpdf </ groupId > < artifactId > pdfxfa </ artifactId > < version > 1.0.1 </ version > </ dependency > <!-- iText 7 License Key Library --> < dependency > < groupId > com.itextpdf </ groupId > < artifactId > itext-licensekey </ artifactId > < version > 2.0.4 </ version > </ dependency >

2.代码部分:

直接上代码,不懂直接看注释就好,有问题可以留言讨论区,小树会在第一时间回复。

    //根据EChart生成的图片、封面图片以及itext生成的表格组合生成PDF文件,保存的服务器路径
    public void createPDF(Map<String,List<HomeAcidEvent>> cc,String batch) throws Exception {
    //最终pdf文件的存储路径和文件名
        String dest=ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"Report.pdf";
        String coverImage=ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"cover.jpg";
        String[] IMAGES = {
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image1.png",
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image2.png",
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image3.png",
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image4.png",
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image5.png",
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image6.png",
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image7.png",
                ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/")+"image8.png"
//        File file = new File(dest);
        //file.getParentFile().mkdirs();
        Image image = new Image(ImageDataFactory.create(IMAGES[0]));
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
        Document doc = new Document(pdfDoc, new PageSize(image.getImageWidth()+100, image.getImageHeight()+600));
        //添加封面
        Image cover = new Image(ImageDataFactory.create(coverImage));
        pdfDoc.addNewPage(new PageSize(image.getImageWidth()+100, image.getImageHeight()+600));
        image.setFixedPosition(1, 0, 0);
        doc.add(cover);
        doc.setMargins(70, 50, 0, 50);
        //添加封面上的文字
      //处理中文问题,支持中文字体
        PdfFont bold = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        //System.out.println(Calendar.getInstance().getTime());
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String current = df.format(Calendar.getInstance().getTime());
        Paragraph p1 =new Paragraph("报表生成时间:"+current);
        p1.setFixedPosition(1, 130, 530, 500);
        p1.setFont(bold);
        p1.setFontSize(18);  
        doc.add(p1);
        for (int i = 0; i < IMAGES.length; i++) {
            //每次添加一张图片到PDF
            image = new Image(ImageDataFactory.create(IMAGES[i]));
            pdfDoc.addNewPage(new PageSize(image.getImageWidth()+100, image.getImageHeight()+600));
            // Notice that now it is not necessary to set image position,
            // because images are not overlapped while adding.
            image.setFixedPosition(i + 2, 70, 550);
            doc.add(image);
            doc.setMargins(20, 50, 20, 50);  
            //添加表格,插入数据
            Table table = new Table(new float[]{1, 1, 1});  
            table.setWidthPercent(100); 
            //设置表格所在的页面i+2,相对坐标(0,0)的位置(35,50),表格宽度
            table.setFixedPosition(i+2, 35, 50, table.getWidth());
            //根据不同的类型给表格传递相应参数列表
            List<HomeAcidEvent> list;
            if(i==0) {
                list=cc.get("ImJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            if(i==1) {
                list=cc.get("WeiboJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            if(i==2) {
                list=cc.get("DownloadJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            if(i==3) {
                list=cc.get("JobJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            if(i==4) {
                list=cc.get("VideoJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            if(i==5) {
                list=cc.get("ShoppingJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            if(i==6) {
                list=cc.get("GammingJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            if(i==7) {
                list=cc.get("StockJson");
                createTable(list,table, bold, true);
                createTable(list,table,bold, false);  //读其他行
            doc.add(table); 
        doc.close();
    //根据选择的时间跨度计算统计时间
    private String getBatchTime(String batch) {
        String batchTime=null;
        if(batch!=null){
            if(batch.equals("week")){
                Calendar c = Calendar.getInstance();
                c.add(Calendar.DATE, -7); 
                batchTime= new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());  
            }else if(batch.equals("month")){
                Calendar c = Calendar.getInstance();
                c.add(Calendar.MONTH, -1); 
                batchTime= new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());  
            }else if(batch.equals("quarter")){
                Calendar c = Calendar.getInstance();
                c.add(Calendar.MONTH, -3); 
                batchTime= new SimpleDateFormat("yyyy-MM-dd").format(c.getTime()); 
            }else if(batch.equals("halfYear")){
                Calendar c = Calendar.getInstance();
                c.add(Calendar.MONTH, -6); 
                batchTime= new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());  
            }else if(batch.equals("year")){
                Calendar c = Calendar.getInstance();
                c.add(Calendar.YEAR, -1); 
                batchTime= new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());  
        }else{
            Calendar c = Calendar.getInstance();
            c.add(Calendar.DATE, -7); 
            batchTime= new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());  
        return batchTime;
    //根据8种类型中的一种类型传入的数据填充表格
    public void createTable(List<HomeAcidEvent> list,Table table,PdfFont font, boolean isHeader) {  
//      StringTokenizer tokenizer = new StringTokenizer(line, ";");  
//      while (tokenizer.hasMoreTokens()) {  
//       BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//         Font FontChinese = new Font(bfChinese, 14, Font.NORMAL);
          if (isHeader) {
              table.addHeaderCell(  
                  new Cell().add(  
                      new Paragraph("用户名").setFont(font)));
              table.addHeaderCell(  
                      new Cell().add(  
                          new Paragraph("次数").setFont(font)));
              table.addHeaderCell(  
                      new Cell().add(  
                          new Paragraph("比例 (%)").setFont(font)));
          } else { 
              int countAll=0;
              for(int j=0;j<list.size();j++) {
                  countAll+=list.get(j).getCount();
              for(int i=0;i<list.size();i++) {
                  String username=list.get(i).getUsername();
                  if(list.get(i).getUsername()==null||list.get(i).getUsername()=="") {
                      username="未知";
                  table.addHeaderCell(  
                      new Cell().add(  
                          new Paragraph(username).setFont(font)));
                  table.addHeaderCell(  
                          new Cell().add(  
                              new Paragraph(String.valueOf(list.get(i).getCount())).setFont(font)));
                  float num= ((float)((float)list.get(i).getCount()/countAll)*100);//乘100相当于加上%号  
                  //获取格式化对象,格式化小数,保留两位小数,不足的补0
                  DecimalFormat df = new DecimalFormat("0.00");
                  String  string = df.format(num);
                  table.addHeaderCell(  
                          new Cell().add(  
                              new Paragraph(string).setFont(font)));

参考资料链接:
iText框架官方网站
iText官方pom.xml配置
iText参考示例1
iText参考示例2
iText参考说明

    在这一章中,我们通过添加BlockElement和Image对象添加到RootElement实例的方式来创建PDF文档。RootElement是拥有两个子类的抽象类:Document和Canvas: Document是创建自定义PDF的时候默认的根元素。由它来管理很多高等级(high-level)的操作例如设置页面大小和旋转角度,添加元素和添加文本......... iText 7 Core可以被Java或.NET(C#)对PDF文档进行编程。 iText是一个通用的、可编程的和企业级的PDF解决方案,允许你将其功能嵌入到你自己的软件中,以实现数字化转型。 iText 7 Core以开放源码(AGPL)以及商业许可的形式提供。 虽然是开源但是也不代表完全免费,详情可搜索“AGPL协议”。 iText 7 Core (open source) pdf2Data* (closed source) pdfCalligraph (closed so 我是itext中的新手,我使用的是7.1.4版,并获得了试用许可证密钥版本3.0.0和排版版本2.0.2 .public ByteArrayInputStream pdfReport()throws MalformedURLException, IOException, DocumentException, SurveyException {LicenseKey.loadLicenseFile("... 和将该文件转换为 PDF。当您查阅类 的 API 文档时,您会发现这些方法的更多变体。在下一章中,我们将选择其中一种方法来转换不同的 HTML 文件。这些 HTML 文件中的每一个都将以不同的方式使用 CSS。 这个问题我在网上搜了很久,没有找到什么解决方案,需求其实很简单,就是添加背景图片。 在解决这个问题之前,我们需要了解什么是背景图片?背景图片就是位于文档最底层的图片,文字和其他内容可以浮在它的上面。这又分为两种情况,一是局部的背景图片,一是全局的背景图片。局部的背景图片一般很少遇到,这里我要加的是整体上的一个背景图片。它往往是一些单纯的颜色图片,跟网页的背景图片一样。 所以怎么做?我突发奇想,... import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.L... iText简介与前期准备:iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。相关网站: 链接说明iText的官方主页http://www.lowagie.com/iT 对PDF中敏感信息脱敏操作,比如将银行电子回执单内的收款账号、付款账号进行脱敏替换。 支持如下银行网商银行、平安银行、光大银行、招商银行、民生银行、天津金城银行、建设银行、广发网上银行、中国建设银行 ......