使用Itext 进行PDf导出功能

本文介绍如何利用iText库实现PDF文件的导出功能,包括必要的Maven依赖及核心代码实现。文中提供了一个简单的示例,展示了如何创建带有中文内容及自定义样式的PDF文档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 最近项目要用到pdf导出功能,这个功能此前一直都没接触过,最近通过Itext实现了,特此记录一下,方便日后需要。话不多说:

  • maven 依赖

<dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itext-asian</artifactId>
      <version>5.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
    <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.5.10</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
    <dependency>
      <groupId>com.lowagie</groupId>
      <artifactId>itext</artifactId>
      <version>2.1.7</version>
    </dependency>

这里使用的itext的版本不是最新的itext7,但是能够使用,完成功能。

  • 代码
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 com.origin.eurybia.utils.DateUtils;

import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;


public class ExportReportPdfUtil {

    /**
     * 报表导出功能
     *
     * @param fileName
     * @param tableList
     * @param response
     * @throws Exception
     */
    public static void export(String fileName, List<PDFTable> tableList, HttpServletResponse response) throws Exception {
        Document document = new Document();

        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font titFont = new Font(bfChinese, 20, Font.NORMAL);
        Font docFont = new Font(bfChinese, 12, Font.NORMAL);
        Font subTitle = new Font(bfChinese, 16, Font.NORMAL);
        Font footnoteFont = new Font(bfChinese, 10, Font.NORMAL);

        // 设置response参数,可以打开下载页面
        response.reset();
        response.setContentType("application/pdf;charset=utf-8");
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1"));

        PdfWriter.getInstance(document, response.getOutputStream());

        //设置标题
        document.addTitle("XXXXX");
        //打开文档
        document.open();

        //设置title
        Paragraph header = new Paragraph("XXXXX", titFont);
        header.setAlignment(1);
        document.add(header);
        //设置报告出具时间
        Paragraph time = new Paragraph("【报告出具时间:" + DateUtils.formatDate(new Date(), "yyyy 年 MM 月 dd") + " 】", docFont);
        time.setIndentationLeft(300);
        document.add(time);

        for (PDFTable table : tableList) {
            Paragraph title = new Paragraph(table.getTitle(), subTitle);
            document.add(title);
            if (table.getTextDescription() != null) {
                Paragraph textDescription = new Paragraph(table.getTextDescription() + "\n", docFont);
                textDescription.setSpacingBefore(10f);
                textDescription.setIndentationLeft(50);
                document.add(textDescription);
            }
            if (table.getFootnote() != null) {
                Paragraph footnote = new Paragraph(table.getFootnote(), footnoteFont);
                footnote.setIndentationLeft(50);
                document.add(footnote);
            }
            PdfPTable conTable = new PdfPTable(table.getConWidths());
            conTable.setSpacingBefore(5f);
            conTable.setWidthPercentage(80);
            for (PDFColumn column : table.getColumns()) {
                PdfPCell cell = new PdfPCell(new Paragraph(column.getText(), docFont));
                if (column.isBold) {
                    cell.setBackgroundColor(BaseColor.LIGHT_GRAY);
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                }
                cell.setSpaceCharRatio(10f);
                conTable.addCell(cell);
            }
            document.add(conTable);
        }

        String str = "\n" + "厂商确认(盖章)";
        Paragraph strGaiZhang = new Paragraph(str, titFont);
        strGaiZhang.setIndentationLeft(250);
        document.add(strGaiZhang);

        //关闭文档
        document.close();
    }
}

这里只是简单的一个实例,其中需要注意的是

BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

这句主要是用来解决中文字体的问题,关于pdf上的文字的排版需要去查看API了,对于段前段后距离多少,居中还是距离左边的距离等都有相应的方法。

  • 这里的PDFTable和PDFColumn是自定义的表格JavaBean可以根据自己的需要自定义。
    PDFTable
import java.util.List;

/**
 * Created by silence on 2016/11/1.
 * Desc :
 */
public class PDFTable {
    private String title;
    private int numColumns;
    private float widthPercent;
    private List<PDFColumn> columns;
    private float[] conWidths;

    private String textDescription;
    private String footnote;

    public String getTextDescription() {
        return textDescription;
    }

    public void setTextDescription(String textDescription) {
        this.textDescription = textDescription;
    }

    public String getFootnote() {
        return footnote;
    }

    public void setFootnote(String footnote) {
        this.footnote = footnote;
    }

    public float[] getConWidths() {
        return conWidths;
    }

    public void setConWidths(float[] conWidths) {
        this.conWidths = conWidths;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getNumColumns() {
        return numColumns;
    }

    public void setNumColumns(int numColumns) {
        this.numColumns = numColumns;
    }

    public float getWidthPercent() {
        return widthPercent;
    }

    public void setWidthPercent(float widthPercent) {
        this.widthPercent = widthPercent;
    }

    public List<PDFColumn> getColumns() {
        return columns;
    }

    public void setColumns(List<PDFColumn> columns) {
        this.columns = columns;
    }
}

PDFColumn

/**
 * Created by silence on 2016/11/1.
 * Desc :
 */
public class PDFColumn {
    private String text;
    public boolean isBold = false;

    public boolean isHeader(){
        return false;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

个人公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值