生成复杂PDF文件

使用 com.lowagie 动态添加表头和页眉,支持复杂表头、单元格合并。

依赖、示例代码如下:

<dependency>
   <groupId>com.lowagie</groupId>
   <artifactId>itext</artifactId>
   <version>2.1.7</version>
</dependency>

版本2.1.7

import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class test {
    public static void main(String[] args) throws Exception {
        String targetPath = "D:\\Temp\\test.pdf";
        File pdfFile = new File(targetPath);
        pdfFile.setWritable(true, false);

        OutputStream out = new FileOutputStream(targetPath);

        BaseFont bfChinese = BaseFont.createFont("D:\\Temp\\simfang.ttf",
                BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        com.lowagie.text.Document pdfDoc = new com.lowagie.text.Document(com.lowagie.text.PageSize.A4.rotate(), 20, 20, 20, 20);
        Font title = new Font(bfChinese, 20, Font.BOLD);
        Font cellTitle = new Font(bfChinese, 12, Font.BOLD);
        Font cellContent = new Font(bfChinese, 11, Font.NORMAL);

        PdfWriter writer = PdfWriter.getInstance(pdfDoc, out);
        MyPdfEvent myPdfEvent = new MyPdfEvent();
        writer.setPageEvent(myPdfEvent);

        List<Map<String,String>> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Map<String,String> map = new HashMap<>();
            map.put("id",i+"");
            map.put("name","zs"+i);
            map.put("age","1"+i);
            list.add(map);
        }

        pdfDoc.open();

        int[] hwidths = { 10,40, 30 };
        PdfPTable headTable = new PdfPTable(3);
        headTable.setWidthPercentage(100);
        headTable.setSpacingBefore(10);
        headTable.setWidths(hwidths);
        for (Map<String,String> data:list){
            PdfPCell headTableCell = null;
            headTableCell = createPdfPCell(data.get("id"),cellContent,1,1,20);
            headTable.addCell(headTableCell);
            headTableCell = createPdfPCell(data.get("name"),cellContent,1,1,20);
            headTable.addCell(headTableCell);
            headTableCell = createPdfPCell(data.get("age"),cellContent,1,1,20);
            headTable.addCell(headTableCell);
        }
        pdfDoc.add(headTable);
        pdfDoc.close();
        writer.close();
    }

    public static PdfPCell createPdfPCell(String string, Font font, int colspan, int rowspan, float fixedHeight) {
        PdfPCell pdfPCell = new PdfPCell(new Paragraph(string, font));
        pdfPCell.setHorizontalAlignment(com.lowagie.text.Element.ALIGN_CENTER);
        pdfPCell.setVerticalAlignment(com.lowagie.text.Element.ALIGN_MIDDLE);
        pdfPCell.setColspan(colspan);
        pdfPCell.setRowspan(rowspan);
//        pdfPCell.setFixedHeight(fixedHeight * rowspan);
        pdfPCell.setNoWrap(false);
        return pdfPCell;
    }
}
import com.lowagie.text.*;
import com.lowagie.text.Font;
import com.lowagie.text.pdf.*;

import java.awt.*;
import java.io.IOException;

public class MyPdfEvent extends PdfPageEventHelper {
    @Override
    public void onEndPage(PdfWriter pdfWriter, Document document) {
        int index = pdfWriter.getPageNumber();
        Phrase phrase;
        if (index>1){//添加页眉
            phrase = new Phrase("qqq");
        }else{
            phrase = new Phrase("test 1");
        }
        HeaderFooter headerFooter = new HeaderFooter(phrase,false);
        headerFooter.setBorder(0);
        headerFooter.setBottom(0);
        headerFooter.setBorderColor(Color.WHITE);
        headerFooter.setAlignment(Element.ALIGN_CENTER);
        document.setHeader(headerFooter);
        System.out.println(pdfWriter.getPageNumber());
        super.onEndPage(pdfWriter, document);
    }

    @Override
    public void onStartPage(PdfWriter pdfWriter, Document document) {
        int index = pdfWriter.getPageNumber();
        if (index>1){//添加表头
            BaseFont bfChinese = null;
            try {
                bfChinese = BaseFont.createFont("D:\\Temp\\simfang.ttf",
                        BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Font cellTitle = new Font(bfChinese, 12, Font.BOLD);
            System.out.println(pdfWriter.getPageNumber());
            int[] hwidths = { 10,40, 30 };
            PdfPTable headTable = new PdfPTable(3);
            headTable.setWidthPercentage(100);
            headTable.setSpacingBefore(10);
            try {
                headTable.setWidths(hwidths);
            } catch (DocumentException e) {
                e.printStackTrace();
            }
            PdfPCell headTableCell = null;
            headTableCell = createPdfPCell("编号",cellTitle,1,1,20);
            headTable.addCell(headTableCell);
            headTableCell = createPdfPCell("姓名",cellTitle,1,1,20);
            headTable.addCell(headTableCell);
            headTableCell = createPdfPCell("年龄",cellTitle,1,1,20);
            headTable.addCell(headTableCell);
            try {
                document.add(headTable);
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }

        super.onStartPage(pdfWriter, document);
    }
    public static PdfPCell createPdfPCell(String string, Font font, int colspan, int rowspan, float fixedHeight) {
        PdfPCell pdfPCell = new PdfPCell(new Paragraph(string, font));
        pdfPCell.setHorizontalAlignment(com.lowagie.text.Element.ALIGN_CENTER);
        pdfPCell.setVerticalAlignment(com.lowagie.text.Element.ALIGN_MIDDLE);
        pdfPCell.setColspan(colspan);
        pdfPCell.setRowspan(rowspan);
//        pdfPCell.setFixedHeight(fixedHeight * rowspan);
        pdfPCell.setNoWrap(false);
        return pdfPCell;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值