我用的是itext7打印,引入下面这些包
下面请看代码,里面每句都有注释:
package com.gx.servlet;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.itextpdf.io.source.ByteArrayOutputStream;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.UnitValue;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//定义返回类型 这里为返回文件 text.pdf
response.addHeader("Content-Disposition", "attachment;filename=test.pdf"); ByteArrayOutputStream bao = new ByteArrayOutputStream();//新建一个输出流
PdfWriter writer = new PdfWriter(bao);//pdfWriter 使用传递输出流为参数的构造函数
PdfDocument pdfDoc = new PdfDocument(writer);
//构建文档对象,可以设置PageSize.A1——A4纸大小
Document doc = new Document(pdfDoc,PageSize.A2);
doc.setMargins(10, 10, 10, 10); //设置外边距
//解决中文字体问题
PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
// new Paragraph("") 添加标题; //段落方法
doc.add(new Paragraph("成本进度分析").setFont(sysFont).setTextAlignment
(TextAlignment.CENTER).setFontSize(20l).setBold());//构建表格以100%的宽度//new
float[]{2,2,6}声数组,有多少个值就有多少列,里面的值代表对应列的宽度比例
Table table = new Table(new float[]{1, 1, 1,1, 1, 1,1, 1}).setWidth
(UnitValue.createPercentValue(100));//给8个1代表8列 1值是宽度
//添加表头new Cell(2,1)意思是合并单元格几行几列 前面的代表列,后面参数是行,setBackgroundColor颜色的值 setPaddingTop文字垂直居中
Cell cell0=new Cell(2,1).add(new Paragraph("费用项")).setFont(sysFont).setTextAlignment
(TextAlignment.CENTER).setBackgroundColor(new DeviceRgb(221,234,238)).setPaddingTop(14f);
Cell cell00=new Cell(2,1).add(new Paragraph("合同金额")).setFont(sysFont).setTextAlignment
(TextAlignment.CENTER).
setBackgroundColor(new DeviceRgb(221,234,238)).setPaddingTop(14f);
Cell cell03=new Cell(2,1).add(new Paragraph("预算总成本")
).setFont(sysFont).setTextAlignment(TextAlignment.CENTER).
setBackgroundColor(new DeviceRgb(221,234,238)).setPaddingTop(14f);
Cell cell04=new Cell(2,1).add(new Paragraph("单方造价")).setFont(sysFont).setTextAlignment
(TextAlignment.CENTER).setBackgroundColor(new DeviceRgb(221,234,238)).setPaddingTop(14f);
Cell cell004=new Cell(1,4).add(new Paragraph("完工量")).setFont(sysFont)
.setTextAlignment(TextAlignment.CENTER).setBackgroundColor(new DeviceRgb(221,234,238));
Cell cell05=new Cell(1,1).add(new Paragraph("年初完工量")).setFont(sysFont)
.setTextAlignment(TextAlignment.CENTER).setBackgroundColor(new DeviceRgb(221,234,238));
Cell cell06=new Cell(1,1).add(new Paragraph("本月")).setFont(sysFont)
.setTextAlignment(TextAlignment.CENTER).setBackgroundColor(new DeviceRgb(221,234,238));
Cell cell07=new Cell(1,1).add(new Paragraph("本年完工量")).setFont(sysFont)
.setTextAlignment(TextAlignment.CENTER).setBackgroundColor(new DeviceRgb(221,234,238));
Cell cell08=new Cell(1,1).add(new Paragraph("累计完工量")).setFont(sysFont)
.setTextAlignment(TextAlignment.CENTER).setBackgroundColor(new DeviceRgb(221,234,238));
table.addHeaderCell(cell0);
table.addHeaderCell(cell00);
table.addHeaderCell(cell03);
table.addHeaderCell(cell04);
table.addHeaderCell(cell004);
table.addHeaderCell(cell05);
table.addHeaderCell(cell06);
table.addHeaderCell(cell07);
table.addHeaderCell(cell08);
SYS_ChenBenJinDuService userService = new SYS_ChenBenJinDuServiceImpl();
List<SYS_ChenBenJinDuPo> po = userService.selectfindall();//如果list没数据就会报500的错
//向表格添加数据
for (SYS_ChenBenJinDuPo sys_ChenBenJinDuPo : po) {
Cell cell1=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getCostResolveName()))
.setFont(sysFont).setTextAlignment(TextAlignment.CENTER);
Cell cell2=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getSignaMoney()))
.setFont(sysFont).setTextAlignment(TextAlignment.CENTER);
Cell cell3=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getTargetPrimeCost())
).setFont(sysFont).setTextAlignment(TextAlignment.CENTER);
Cell cell4=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getDanFangZaoJia())
).setFont(sysFont).setTextAlignment(TextAlignment.CENTER);
Cell cell5=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getComplete())).setFont(sysFont)
.setTextAlignment(TextAlignment.CENTER);
Cell cell6=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getMorthFenComplete())
).setFont(sysFont).setTextAlignment(TextAlignment.CENTER);
Cell cell7=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getYeatComplete())
).setFont(sysFont).setTextAlignment(TextAlignment.CENTER);
Cell cell8=new Cell().add(new Paragraph(sys_ChenBenJinDuPo.getLeijiTiaoZhen())
).setFont(sysFont).setTextAlignment(TextAlignment.CENTER);
table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3);
table.addCell(cell4);
table.addCell(cell5);
table.addCell(cell6);
table.addCell(cell7);
table.addCell(cell8);
}
//将表格添加入文档并页面居中
doc.add(table.setHorizontalAlignment(HorizontalAlignment.CENTER));
doc.close();//关闭对象
//将输出流转换为输入流
ByteArrayInputStream swapStream = new ByteArrayInputStream(bao.toByteArray());
ServletOutputStream out=response.getOutputStream();
byte[] buffer=new byte[1024];//定义byte数组
int count;
//循环输出流
while((count=swapStream.read(buffer))!=-1){
out.write(buffer, 0, count);
}
//关闭流
out.flush();
out.close();
swapStream.close();
}
Jsp代码:
$("#DAYIN").click(function(){
window.open("${ctx}/servlet/JinDUFenXin");
});
打印结果如下: