在此之前我曾发布过一篇关于Java实现导出PDF的文章,那篇文章需要事先建好模板,设置好模板变量然后才导出,这样的模板比较适合导出一些格式固定好的内容。而今天这篇文章采用iTEXT导出PDF,不需要模板,可直接在java代码里设置好内容和样式,扩展性灵活性很强。
先看一下导出效果:
首先导入依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
代码,内容看似多,其实不复杂。
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
@Slf4j
@RestController
@RequestMapping("/exportPDF")
public class ExportPDFController {
/**
* 订单PDF导出
* @param
* @return
*/
@GetMapping("exportOrder")
public JSONObject exportOrder(HttpServletResponse response){
//创建文件
Document document = new Document();
ByteArrayOutputStream ba = new ByteArrayOutputStream();
//建立一个书写器
PdfWriter writer = PdfWriter.getInstance(document, ba);
response.reset();
//打开文件
document.open();
//中文字体,解决中文不能显示问题
BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
Font blackFont = new Font(bfChinese);
blackFont.setColor(BaseColor.BLACK);
// new Font(bfChinese)中加参数6表示字体的大小,什么都不加表示默认的大小
Font blackFontB = new Font(bfChinese,6);
blackFontB.setColor(BaseColor.BLACK);
//添加内容
// document.add(new Paragraph("表格",blackFont));
// 创建一个表格 8代表这个表格有8列
PdfPTable table1 = new PdfPTable(8);
table1.setWidthPercentage(100); // 表格宽度100%填充
// 设置每一列的宽度
float[] columnWidths1= new float[]{6f, 8f, 6f, 10f, 10f, 10f, 8f, 10f};
table1.setWidths(columnWidths1);
// 获取这个表格的行数,用来向表格中添加数字
ArrayList<PdfPRow> listRow1 = table1.getRows();
PdfPCell cells0[]= new PdfPCell[8];
// 设置第一行第一列的内容
cells0[0] = new PdfPCell(new Paragraph("车龄", blackFont));
cells0[0].setVerticalAlignment(Element.ALIGN_MIDDLE); //水平居中
cells0[0].setHorizontalAlignment(Element.ALIGN_CENTER); // 垂直居中
cells0[0].setFixedHeight(30f); //行高
cells0[1] = new PdfPCell(new Paragraph(" ", blackFont));
cells0[1].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells0[1].setHorizontalAlignment(Element.ALIGN_CENTER);
cells0[1].setFixedHeight(30f);
cells0[2] = new PdfPCell(new Paragraph("类型", blackFont));
cells0[2].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells0[2].setHorizontalAlignment(Element.ALIGN_CENTER);
cells0[2].setFixedHeight(30f);
cells0[3] = new PdfPCell(new Paragraph(model, blackFontB));
cells0[3].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells0[3].setHorizontalAlignment(Element.ALIGN_CENTER);
cells0[3].setFixedHeight(30f);
cells0[4] = new PdfPCell(new Paragraph("应收", blackFont));
cells0[4].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells0[4].setHorizontalAlignment(Element.ALIGN_CENTER);
cells0[4].setFixedHeight(30f);
cells0[5] = new PdfPCell(new Paragraph(totalPay, blackFont));
cells0[5].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells0[5].setHorizontalAlignment(Element.ALIGN_CENTER);
cells0[5].setFixedHeight(30f);
cells0[6] = new PdfPCell(new Paragraph("实付", blackFont));
cells0[6].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells0[6].setHorizontalAlignment(Element.ALIGN_CENTER);
cells0[6].setFixedHeight(30f);
cells0[7] = new PdfPCell(new Paragraph(actualPay, blackFont));
cells0[7].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells0[7].setHorizontalAlignment(Element.ALIGN_CENTER);
cells0[7].setFixedHeight(30f);
// 将以上每一列的内容加到第一行中
PdfPRow pdfPRow0 = new PdfPRow(cells0);
listRow1.add(pdfPRow0);
// 新的一行
PdfPCell cells1[]= new PdfPCell[8];
cells1[0] = new PdfPCell(new Paragraph("车架号", blackFont));
cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells1[0].setHorizontalAlignment(Element.ALIGN_CENTER);
cells1[0].setFixedHeight(22f);
cells1[1] = new PdfPCell(new Paragraph("34324ws", blackFont));
cells1[1].setFixedHeight(22f);
cells1[2] = new PdfPCell(new Paragraph(" ", blackFont));
cells1[2].setFixedHeight(22f);
cells1[3] = new PdfPCell(new Paragraph(" ", blackFont));
cells1[3].setFixedHeight(22f);
cells1[4] = new PdfPCell(new Paragraph(" ", blackFont));
cells1[4].setFixedHeight(22f);
cells1[5] = new PdfPCell(new Paragraph(" ", blackFont));
cells1[5].setFixedHeight(22f);
cells1[6] = new PdfPCell(new Paragraph(" ", blackFont));
cells1[6].setFixedHeight(22f);
cells1[7] = new PdfPCell(new Paragraph(" ", blackFont));
cells1[7].setFixedHeight(22f);
// 合并列(从第二列开始,向后合并,共合并7列)
cells1[1].setColspan(7);
PdfPRow pdfPRow1 = new PdfPRow(cells1);
listRow1.add(pdfPRow1);
// 第二个table
PdfPTable table2 = new PdfPTable(4);
float[] columnWidths2= new float[]{20f, 15f, 20f, 15f};
table2.setWidths(columnWidths2);
table2.setWidthPercentage(100); // 宽度100%填充
ArrayList<PdfPRow> listRow2 = table2.getRows();
PdfPCell cells201[]= new PdfPCell[4];
cells201[0] = new PdfPCell(new Paragraph("项目", blackFont));
cells201[0].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells201[0].setHorizontalAlignment(Element.ALIGN_CENTER);
cells201[0].setFixedHeight(22f);
cells201[1] = new PdfPCell(new Paragraph("售价", blackFont));
cells201[1].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells201[1].setHorizontalAlignment(Element.ALIGN_CENTER);
cells201[1].setFixedHeight(22f);
cells201[2] = new PdfPCell(new Paragraph("材料", blackFont));
cells201[2].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells201[2].setHorizontalAlignment(Element.ALIGN_CENTER);
cells201[2].setFixedHeight(22f);
cells201[3] = new PdfPCell(new Paragraph("成本", blackFont));
cells201[3].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells201[3].setHorizontalAlignment(Element.ALIGN_CENTER);
cells201[3].setFixedHeight(22f);
PdfPRow pdfPRow2 = new PdfPRow(cells201);
listRow2.add(pdfPRow2);
// 循环向表格添加数据(添加了3行)
for(int i = 0; i < 3; i++){
PdfPCell cells301[]= new PdfPCell[4];
cells301[0] = new PdfPCell(new Paragraph("水泥灰",blackFont));
cells301[0].setHorizontalAlignment(Element.ALIGN_CENTER);
cells301[0].setFixedHeight(22f);
cells301[1] = new PdfPCell(new Paragraph("8000.00", blackFont));
cells301[1].setHorizontalAlignment(Element.ALIGN_CENTER);
cells301[1].setFixedHeight(22f);
cells301[2] = new PdfPCell(new Paragraph(" ", blackFont));
cells301[2].setHorizontalAlignment(Element.ALIGN_CENTER);
cells301[2].setFixedHeight(22f);
cells301[3] = new PdfPCell(new Paragraph(" ", blackFont));
cells301[3].setHorizontalAlignment(Element.ALIGN_CENTER);
cells301[3].setFixedHeight(22f);
PdfPRow pdfPRow301= new PdfPRow(cells301);
listRow2.add(pdfPRow301);
}
// 添加空白行
for(int i = 0; i < 27; i++){
// 列表底部留出空白
PdfPCell cells302[]= new PdfPCell[4];
cells302[0] = new PdfPCell(new Paragraph(" ",blackFont));
cells302[0].setHorizontalAlignment(Element.ALIGN_CENTER);
cells302[0].setFixedHeight(22f);
cells302[1] = new PdfPCell(new Paragraph(" ", blackFont));
cells302[1].setHorizontalAlignment(Element.ALIGN_CENTER);
cells302[1].setFixedHeight(22f);
cells302[2] = new PdfPCell(new Paragraph(" ", blackFont));
cells302[2].setHorizontalAlignment(Element.ALIGN_CENTER);
cells302[2].setFixedHeight(22f);
cells302[3] = new PdfPCell(new Paragraph(" ", blackFont));
cells302[3].setHorizontalAlignment(Element.ALIGN_CENTER);
cells302[3].setFixedHeight(22f);
PdfPRow pdfPRow302= new PdfPRow(cells302);
listRow2.add(pdfPRow302);
}
// 把表格加入容器中
document.add(table1);
document.add(table2);
//关闭文档
document.close();
//关闭书写器
writer.close();
// 告诉浏览器这是一个附件 直接下载
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(("订单"+".pdf").getBytes("utf-8"),"ISO8859-1") + "\"");
response.setDateHeader("Expires", (System.currentTimeMillis() + 1000));
response.setContentLength(ba.size());
OutputStream out = response.getOutputStream();
ba.writeTo(out);
out.flush();
return null;
}
}
到此为止一个表格就导出为PDF了,样式可以自己设置,内容也可以根据业务层添加。然后去浏览器访问该接口,浏览器会自己下载该PDF文件
如果想了解更多制作表格的属性可去看我的iTEXT专栏。