java spring maven pdf 导出

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>&nbsp;编辑</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>&nbsp;删除</button>';
    //pdf下载
    var pdfButton = '<a href="visitor/exportPDF/' + row.id + '" ';
    pdfButton += '>&nbsp;&nbsp;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>

猜你喜欢

转载自my.oschina.net/u/3556610/blog/2243487