pdf表单模板
js : 渲染出动态的html ,其实就是一个a标签
Visitor.operateFormatter = function(value, row, index) {
//编辑
var editButton = '<button type="button" class="btn btn-success btn-xs" onclick="Visitor.openUpdateVisitor(\'' + row.id + '\')" ';
if($("#visitor_update").val() == undefined){
editButton += 'disabled="disabled"';
}
editButton += '><i class="fa fa-edit"></i> 编辑</button>';
//删除
var deleteButton = '<button type="button" class="btn btn-danger btn-xs button-margin" onclick="Visitor.delete(\'' + row.id + '\')" ';
if($("#visitor_delete").val() == undefined){
deleteButton += 'disabled="disabled"';
}
deleteButton += '><i class="fa fa-remove"></i> 删除</button>';
//pdf下载
var pdfButton = '<a href="visitor/exportPDF/' + row.id + '" ';
pdfButton += '> PDF</a>';
return [ editButton,deleteButton,pdfButton,].join('');
}
controller
/**
* pdf导出
**/
@RequestMapping(value ="/exportPDF/{visitorId}")
public ModelAndView exportPDF(@PathVariable Integer visitorId,HttpServletRequest request, HttpServletResponse response) {
Visitor visitor = visitorService.selectById(visitorId);
String title ="访客信息";
try {
PdfReader reader = new PdfReader("C:\\Users\\donald\\Desktop\\visitor.pdf");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
/**
* 使用中文字体 使用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体 Adobe 宋体 std L
*/
AcroFields s = ps.getAcroFields();
//设置key-value值
//通过s.setFieldProperty("字段名", "textfont", BaseFont , null); 设置字段的格式或者在模板中修改样式
s.setField("parkId",visitor.getParkId().toString());
s.setField("visitorName",visitor.getVisitorName());
s.setField("visitorMobile",visitor.getVisitorMobile());
SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
s.setField("appointTime",simpledateformat.format(visitor.getAppointTime()));
s.setField("inviter",visitor.getInviter());
// 设为true
ps.setFormFlattening(true);
ps.close();
// excel 表文件名
String fileName = title + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".pdf";
String fileName11 = URLEncoder.encode(fileName,"UTF-8");
String headStr = "attachment; filename=\"" + fileName11 + "\"";
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", headStr);
//通过response对象获取OutputStream流
OutputStream out = response.getOutputStream();
out.write(bos.toByteArray());
out.close();
} catch (IOException | DocumentException e) {
e.printStackTrace();
}
return null;
}
maven 加载的jar包
<!--pdf 导出需要的jar包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.6</version>
</dependency>
参考网址:https://blog.csdn.net/u011391773/article/details/53084231
pdf文件导出进阶版
1. pdf文件网页预览
2.pdf文件合并
3.删除项目路径的pdf
引入pdfjs
js:
WorkOrder.printReceipt = function () {
if (this.check()) {
window.open('/static/js/plugins/pdfjs/web/viewer.html?file=' + encodeURIComponent(Feng.ctxPath + "/workOrder/print_receipt/"+ this.ids,"pdf"));
}
};
//ids 是check 方法里面把多个id 用都用隔开保存的一个js属性
controller:
/**
* @Author Donald
*/
@Permission
@RequestMapping(value = "/print_receipt/{ids}")
@ResponseBody
public void printReceipt(@PathVariable String ids){
try {
String workOrderIds[] = ids.split(","); //运单id数组
List<File> fileList = new ArrayList<>(); // 每页pdf文件一个file集合
String path = Class.class.getClass().getResource("/").getPath();
path = path.replace("/target/classes/","/src/main/webapp/static/file/"); //读取模板的文件夹路径
int workOrderId;
//遍历运单
for(int i = 0 ;i < workOrderIds.length; i++) {
workOrderId = Integer.parseInt(workOrderIds[i]);
WorkOrder workOrder = workOrderService.selectById(workOrderId);
//获取商品明细行
List<Map<String, Object>> result = workOrderLineService.selectOrderLineListByWorkOrderId(String.valueOf(workOrderId) ,null ,true);
int x = result.size(); //运单的商品行总数,每行商品录入后减一
int y = x/7 ; //获得整除数, 每页签收单最多7行数据
int z = result.size(); //获得余数,
int itemNo = 1;
//遍历,满7行的一页,不够7行当一页
for( int a = y ; a >= 0 ; a = a - 1){
PdfReader reader = new PdfReader(path+"ReceipTemplate.pdf");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
AcroFields s = ps.getAcroFields();
//设置中文字体
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
s.addSubstitutionFont(bfChinese);
//设置key-value值
//通过s.setFieldProperty("字段名", "textfont", BaseFont , null); 设置字段的格式或者在模板中修改样式
s.setField("itemNo" ,String.valueOf(itemNo) ); // 签收单序号
Consigner consigner = consignerService.selectById(workOrder.getOriginConsignerId());
s.setField("ConsignerName",consigner.getConsignerName()); // 货主名字
s.setField("toAddress",workOrder.getToAddress()); // 地址
s.setField("toReceiver",workOrder.getToReceiver()); //联系人
if(workOrder.getToMobile().length() > 0){
s.setField("toMobile",workOrder.getToMobile()); //联系方式
}else {
s.setField("toMobile",workOrder.getToPhone()); //联系方式
}
// 获取运单历史,根据接收者类型,分别在公司表或者是司机表里面获取其名字
WorkOrderHistory workOrderHistory = workOrderHistoryService.selectByWorkOrderIdAndFromUser(workOrderId,workOrder.getOriginLogisticsCompanyId(),0);
int receiverType = workOrderHistory.getReceiverType();
int receiverId = workOrderHistory.getReceiverId();
String receiverName ;
if(receiverType==0){
LogisticsCompany logisticsCompany = logisticsCompanyService.selectById(receiverId);
receiverName = logisticsCompany.getLogisticsCompanyName();
}else{
CarrierInfo carrierInfo = carrierInfoService.selectById(receiverId);
receiverName = carrierInfo.getUserName();
}
s.setField("receiverName",receiverName); // 承运商
String planShippedDateStr = (new java.text.SimpleDateFormat("yyyy-MM-dd ")).format(workOrder.getPlanShipDate());
s.setField("shippedDate",planShippedDateStr); // 发货日期
// a > 0 满7行一页
if(a > 0){
for(int b = 1 ;b <= 7 ; b++ ){
Map<String, Object> workOrderLine = result.get(result.size() - x);
s.setField("workNo" + b ,workOrderLine.get("work_no").toString()); // 发货单号
s.setField("description" + b ,workOrderLine.get("description").toString()); // 型号
s.setField("quantity" + b ,workOrderLine.get("quantity").toString()); //数量
s.setField("partNo" + b ,workOrderLine.get("part_no").toString()); //物料编号
if(workOrderLine.get("customer_po_no") !=null){
s.setField("customerPoNo" + b ,workOrderLine.get("customer_po_no").toString()); //订单号
}
if(workOrderLine.get("customer_note") !=null){
s.setField("noteText" + b ,workOrderLine.get("customer_note").toString()); // 备注
}
x = x - 1;
}
}else if( (a == 0) && (x > 0)){
for(int c = 1 ;c <= x ; c++ ){
Map<String, Object> workOrderLine = result.get(result.size() - x - c + 1);
s.setField("workNo" + c ,workOrderLine.get("work_no").toString()); // 发货单号
s.setField("description" + c ,workOrderLine.get("description").toString()); // 型号
s.setField("quantity" + c ,workOrderLine.get("quantity").toString()); //数量
s.setField("partNo" + c ,workOrderLine.get("part_no").toString()); //物料编号
if(workOrderLine.get("customer_po_no") !=null){
s.setField("customerPoNo" + c ,workOrderLine.get("customer_po_no").toString()); //订单号
}
if(workOrderLine.get("customer_note") !=null){
s.setField("noteText" + c ,workOrderLine.get("customer_note").toString()); // 备注
}
}
}
// 设为true
ps.setFormFlattening(true);
ps.close();
// 生成单个pdf文件存入temp里面,并添加到fileList
File file = new File(path+"temp/"+ String.valueOf(System.currentTimeMillis()).substring(4, 13)+".pdf");
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(bos.toByteArray());
fileOutputStream.flush();
fileOutputStream.close();
fileList.add(file);
bos.flush();
bos.close();
reader.close();
}
}
// 把个fileList的多个file 合成一个多页的file2 pdf文件
File file2 = new File(path+"temp/" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".pdf");
PdfReader reader2 = new PdfReader(fileList.get(0).getPath());
Document document = new Document(reader2.getPageSize(1));
if (!file2.exists()) {
file2.createNewFile();
}
PdfCopy copy = new PdfCopy(document, new FileOutputStream(file2.getPath()));
document.open();
for (int i = 0; i < fileList.size(); i++)
{
PdfReader reader = new PdfReader(fileList.get(i).getPath());
int n = reader.getNumberOfPages();
for (int j = 1; j <= n; j++)
{
document.newPage();
PdfImportedPage page = copy.getImportedPage(reader, j);
copy.addPage(page);
}
reader.close();
}
reader2.close();
document.close();
copy.close();
//输出pdf文件到html页面
FileInputStream fileInputStream = new FileInputStream(file2);
HttpServletResponse response = getHttpServletResponse();
response.setHeader("Content-Disposition", "attachment;fileName="+ new String("成品签收单.pdf".getBytes("utf-8"),"ISO8859-1"));
response.setContentType( "multipart/form-data");
OutputStream outputStream = response.getOutputStream();
IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);
fileInputStream.close();
outputStream.flush();
outputStream.close();
//删除fileList文件
for( File file3 : fileList){
if(file3.exists()){
file3.delete();
}
}
//删除file2
if(file2.exists()){
file2.delete();
}
} catch (IOException e){
e.printStackTrace();
} catch (DocumentException e){
e.printStackTrace();
}
catch(Exception e) {
e.printStackTrace();
}finally {
}
}
maven:
<!-- pdf文件html页面浏览需要的io -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!--pdf 导出需要的jar包 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.6</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>