使用 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;
}
}