首页 > 其他分享 >使用itext生成PDF表格报表

使用itext生成PDF表格报表

时间:2023-07-26 09:48:46浏览次数:42  
标签:表格 import writer itext new persentFontSize PDF document public

使用iText生成PDF表格形式报表

1、引用JAR包

<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itextpdf</artifactId>
  <version>5.5.13.3</version>
</dependency>

 itext5是开源的,可以免费使用

2、开始创建PDF

package com.example.pdf.demo;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class PdfCreateUtil {
    //文件路径
    private static String filePath = "D:\\测试文档.pdf";
    //字体文件路径
    private static String fontPath = "C:\\Windows\\Fonts\\simhei.ttf";
    public static void  createPdf() throws IOException, DocumentException {
        //创建文档对象设置文档大小
        Document document = new Document(PageSize.A4);
        File file = new File(filePath);
        FileOutputStream fos = new FileOutputStream(file);
        PdfWriter writer = PdfWriter.getInstance(document, fos);
        // 如果直接需要输出到返回流中可以使用一下代码
        // HttpServletResponse res = null; 请求的返回体
        // PdfWriter.getInstance(document,res.getOutputStream());
        //字体
        BaseFont font = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        //添加页码
        addFooter(font,12,PageSize.A4,writer);
        document.open();

        //标题字体
        Font titleFont = new Font(font, 12, Font.BOLD);
        //设置每一列宽度
        float[] widths = {50f, 50f, 50f, 50f};
        //创建一个表格对象
        PdfPTable pdfPTable = new PdfPTable(widths);
        PdfPCell pdfPCell = null;
        for (int i = 0; i < 4; i++) {
            pdfPCell = new PdfPCell(new Paragraph("表头1", titleFont));
            //表格内容居中
            pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            pdfPTable.addCell(pdfPCell);
        }
        for (int i = 0; i < 20; i++) {
            pdfPCell = new PdfPCell(new Paragraph(i + "", titleFont));
            //表格内容居中
            pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);
            pdfPTable.addCell(pdfPCell);
        }
        document.add(pdfPTable);
        document.close();
    }

    public static void addFooter(BaseFont font,int fontSize,Rectangle pageSize,PdfWriter writer){
        ItextPdfHeaderFooter itextPdfHeaderFooter = new ItextPdfHeaderFooter(font,fontSize,pageSize);
        writer.setPageEvent(itextPdfHeaderFooter);
    }
    public static void main(String[] args) throws IOException, DocumentException {
        createPdf();
    }
}

3、页码生成监听器

package com.example.pdf.demo;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

public class ItextPdfHeaderFooter extends PdfPageEventHelper {
    /**
     * 页眉
     */
    public String header ="";
    /**
     * 文档字体大小
     */
    public int persentFontSize = 12;

    public Rectangle pageSize = PageSize.A4;

    public PdfTemplate total;

    public BaseFont bf = null;

    public Font fontDetail = null;

    public ItextPdfHeaderFooter() {
    }

    public ItextPdfHeaderFooter(BaseFont bf,int persentFontSize, Rectangle pageSize) {
        this.persentFontSize = persentFontSize;
        this.pageSize = pageSize;
        this.bf = bf;
    }

    public ItextPdfHeaderFooter(String header, int persentFontSize, Rectangle pageSize) {
        this.header = header;
        this.persentFontSize = persentFontSize;
        this.pageSize = pageSize;
    }

    public void setHeader(String header) {
        this.header = header;
    }

    public void setPersentFontSize(int persentFontSize) {
        this.persentFontSize = persentFontSize;
    }

    @Override
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(60,60);
    }

    /**
     * 写入页脚
     * @param writer
     * @param document
     */
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        //如果有封面第一页跳过,后续计算页码需要减去封面页数
//        if(writer.getPageNumber()==1)
//        {
//            return;
//        }
        try{
            if(fontDetail==null){
                fontDetail = new Font(bf,persentFontSize, Font.NORMAL);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        //1、写入页脚
        ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT,new Phrase(header,fontDetail),document.left(),document.top()+20,0);

        //有封面减去封面页数
        //        int pages = writer.getPageNumber()-1;
        int pages = writer.getPageNumber();
        String foot = "第"+pages+"页/共";
        Phrase footer = new Phrase(foot,fontDetail);

        //计算长度位置
        float len = bf.getWidthPoint(foot, persentFontSize);

        PdfContentByte cb = writer.getDirectContent();

        ColumnText.showTextAligned(cb,Element.ALIGN_CENTER,footer,(document.rightMargin()+document.right()+document.leftMargin()-document.left()-len)/2.0F+20F,document.bottom()-20,0);
        cb.addTemplate(total,(document.rightMargin()+document.right()+document.leftMargin()-document.left())/2.0F+20F,document.bottom()-20);
    }

    /**
     * 关闭文档时添加总页码
     * @param writer
     * @param document
     */
    @Override
    public void onCloseDocument(PdfWriter writer, Document document) {
        if(writer.getPageNumber()==1)
        {
            return;
        }
        total.beginText();
        total.setFontAndSize(bf,persentFontSize);
        //有封面减去封面页数
        //        String footT = "" + (writer.getPageNumber()-1)+"页";
        String footT = "" + (writer.getPageNumber())+"页";
        Phrase footer = new Phrase(footT,fontDetail);
        total.showText(footer.getContent());
        total.endText();
        total.closePath();
    }
}

4、最终实现效果如下

 

标签:表格,import,writer,itext,new,persentFontSize,PDF,document,public
From: https://www.cnblogs.com/sun-in-sky/p/17581512.html

相关文章

  • 用android studio 绘制行数不确定的表格
    用AndroidStudio绘制行数不确定的表格介绍在Android应用开发中,我们经常需要绘制表格来展示数据。有时候,表格的行数是不确定的,这就需要我们动态地生成表格,并根据数据的变化来更新表格的行数。本文将向你介绍如何使用AndroidStudio来实现这个功能。步骤步骤1:创建一个新的Andr......
  • 【专题】2022年中国企业数字化学习行业研究报告PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=32263原文出处:拓端数据公众号多变,不确定性,复杂,模糊不清的新业务图景,加快了公司人才发展模式的数字化转变;疫情冲击离线运输与公司现金流量,消费者支出减少,机构表现受压,数字化学习突破;行业数字化水平不断提高,商业体系和学习体系之间的关联性不断加强,企......
  • 【专题】2023新能源电池材料发展概览报告PDF合集分享(附原数据表)
    全文链接:http://tecdat.cn/?p=33303原文出处:拓端数据部落公众号《新能源电池材料发展概览报告合集》综合分析了电池下游应用场景以及当前材料体系所面临的问题,重点关注了光伏、储能和氢能领域的电池产品,预测了相关电池材料体系的发展趋势和投资价值。报告合集涵盖了光伏HJT电池......
  • antd 合并表格的最后一列,且增加点击事件
    实现:antd(版本1.7.8)+vue实现如下,点击导出导出该表格为excel table的columns里最后一列的操作这样写:在customRender里写合并最后一列的方法:判断index等于0,也就是第一行,进行行的合并,并且返回这一行的内容,是一个导出的链接,方法是exprotInterfaceData别的行返回的rowSpan是0......
  • 最好的PDF文本编辑开发库
     PDF文件是一种常见的文档格式,它具有跨平台、保持原样、安全性高等特点。但是,PDF文件也有一个缺点,就是不可编辑。如果我们想要修改PDF文件中的内容,比如文字、图片、表格等,就会很麻烦,需要转档为Word等其他可编辑的文档进行编辑后再转为PDF文件。为了解决这个问题,使我们工作中能够......
  • 15款提高表格操作的jQuery插件
       table表格由于它的浏览器兼容性和复杂的标签嵌套方式,可以算是添加样式最困难的对象之一了。大多数前端er都把网页中的table标签替换为div,主要就是因为div要比table更容易添加CSS样式。但是我们在日常应用中仍然要用到table表格,其中最好的例子就是对照表。今天彬Go将向大家......
  • 文字表格不听话的换页
    问题:将第二页中的文字移一部分到第一页下面的空白处解决: 选取整个表格》表格工具》表格属性》行》指定高度1.1》确定 ......
  • 前端拿到后端返回文件流后页面生成excel表格预览(Luckysheet)
    最近项目遇到一个需求,就是本来只需要导出的excel文件,客户要求在前端页面进行预览查看。在查找资料后,决定使用Luckysheet来进行excel文件的预览。1.安装npmiluckyexcel2.html中引入相关js,css文件,可以自己下下来放到本地引入<linkrel='stylesheet'href='https://cdn.......
  • JeecgBoot轻松解决ERP项目复杂布局需求,JVXETable高性能表格效果和项目案例
    ERP项目表格布局一般都很复杂,要求大数据、高性能操作,这个用JeecgBoot如何解决呢?下边是我们之前服务过的一个应用行编辑的ERP项目,以强大的行编辑功能,让客户很满意,下面我们来看一下这个项目:1.客户需求每行数据可以实时编辑、自动保存,其他用户数据实时刷新并且有日历翻牌效果......
  • pdf 等所有文件通过blog强制下载函数 downloadFileFromBlobByToken
    downloadFileFromBlobByTokenpdf等所有文件通过blog强制下载函数downloadFileFromBlobByTokenimport{getToken}from'@/libs/util'exportconstdownloadFile=src=>{console.log(src)letiframe=document.createElement('iframe')iframe.sr......