因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类。
如果需要编写样式或者插入背景,都可以查阅itex官方文档,进行扩展。
这个工具是基于 itext 写的,主要作用是生成最简洁的表格,选用的jar包版本是:
<dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency>
废话就不多说了,直接贴代码
import java.awt.Color; import java.util.List; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; public class PDFConstants { /** * PDF大标题字体 */ public static Font PDFTITLEFONT = new Font(null, 16, Font.BOLD); /** * PDF小标题字体 */ public static Font PDFTITLEFONT1 = new Font(null, 13, Font.NORMAL); /** * 表格宽度百分比 */ public static Integer WIDTHPERCENTAGE = 98; /** * 表格标题字体 */ public static Font TITLEFONT = new Font(null, 12, Font.COURIER); /** * 翻页加载表头 */ public static Integer HEADERROWS = 1; /** * 翻页不加载表头 */ public static Integer NOHEADERROWS = 0; /** * 表格内容字体 */ public static Font CONTENTFONT = new Font(null, 9, Font.NORMAL); /** * PDF表格样式 */ private static PdfPCell cell = new PdfPCell(); /** * 获取表格 */ public static PdfPCell getCell() { // 水平居中 cell.setHorizontalAlignment(Element.ALIGN_CENTER); // 垂直居中 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 边距 cell.setPadding(1); // 行高 cell.setMinimumHeight(22); // 不换行 // cell.setNoWrap(true); // 颜色淡化 cell.setBorderColor(Color.decode("#EBEEF5")); return cell; } /** * 获取表格并赋值 */ public static PdfPCell getCell(Paragraph content) { cell = getCell(); // 设置内容 cell.setPhrase(content); return cell; } /** * @Description 生成PDF表格 * @param titleNum * 列数 * @param tableWidth * 列宽 * @param titles * 标题集合 * @param contents * 内容集合 * @param headerRows * 是否再次加载表头 * @return * @throws Exception */ public static PdfPTable getPDFTable(int titleNum, int[] tableWidth, String[] titles, List<String> contents, int headerRows) throws Exception { // 创建表格对象 // 列数 PdfPTable table = new PdfPTable(titleNum); //表格宽度百分比 table.setWidthPercentage(WIDTHPERCENTAGE); // 列宽百分比 if (tableWidth != null) table.setWidths(tableWidth); // 翻页加载表头 if (headerRows == HEADERROWS) table.setHeaderRows(HEADERROWS); // 标题集合 String[] pdfTitles = titles; if (pdfTitles != null && pdfTitles.length > 0) { // 标题 for (String pdfTitle : pdfTitles) { PdfPCell title = getCell(new Paragraph(pdfTitle, TITLEFONT)); table.addCell(title); } } // 内容集合 List<String> pdfContents = contents; if (pdfContents != null && pdfContents.size() > 0) { // 内容 for (String pdfContent : pdfContents) { PdfPCell content = getCell(new Paragraph(pdfContent, CONTENTFONT)); table.addCell(content); } } return table; } }
具体调用方法不给demo了,拿出部分业务代码做例子,使用这个工具是很简单的
首先打开一个文档
// 定义文件路径 你可以完成过程后删掉这个临时文件 或者存在tmp里
File f = new File("xxxx/xxx.pdf"); FileOutputStream output = new FileOutputStream(f); // 实例化文档对象 Document document = new Document(PageSize.A4, 0, 0, 0, 0); // 创建 PdfWriter 对象 文件的输出路径+文件的实际名称 PdfWriter.getInstance(document, output); document.open();// 打开文档
Document有横向属性 使用方法是 PageSize.A4.rotate()这个rotate方法是个神奇的方法
后面四个数字对应的是边距 分别是 左,右,上,下
生成table几个传参的例子
// 标题 String[] title = { "Min.", "SUN", "MON", "TUE", "WED", "THUR", "FRI", "SAT" }; // 列数 Integer titleNum = 8; // 列宽 int tableWidth[] = { 15, 15, 15, 10, 10, 12, 12, 11 };
//内容 List<String> contents = new ArrayList<String>(); //TODO 业务代码填充contens // 获取PDFTable PdfPTable table = PDFConstants.getPDFTable(titleNum, tableWidth, title, contents, 0);
//表格上间距 table.setSpacingBefore(0); //添加进文档
document.add(table);
//关闭文档
document.close();
就是这样了,标题已经提供直接使用的字体了,最常用的是Paragraph和Phrase,具体API可以自行翻阅,加油!