java导出pdf文件

java生成pdf文件


好久没写博客了,前段时间老板让写一个把列表导成pdf的功能,当时我上网查了一下,应该是两种方案。第一种方案就是建立一个pdf模板,然后把数据给它填写进去,这也是我第一次采用的办法,但是呢,这有个特别明显的弊端,就是模板只有一页那么大,因为这是自己建立的,所以就那么大,你数据少的话,一页能装下的那种,用这种是没问题的,但是你要是列表,这就装不下了,它还是一页,下边数据就显示不出来了,所以我又用了第二种方法。第二种办法就灵活了,直接自己在java代码里写标题,自己画table表格,反正一切操作都是在代码里边实现,一切都是动态的,这样就弥补了第一种方案的模板弊端,更加灵活,所以我就采用了第二种方案。

maven包

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

java代码

package com.chengxiang.cashieringapi.controller.receipt;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import com.chengxiang.cashieringapi.base.BaseController;
import com.chengxiang.cashieringapi.model.InvoiceEmail;
import com.chengxiang.cashieringapi.model.basic.ExpenseCategory;
import com.chengxiang.cashieringapi.model.basic.PaymentPay;
import com.chengxiang.cashieringapi.model.receipt.FundReceipt;
import com.chengxiang.cashieringapi.service.basic.ExpenseCategoryService;
import com.chengxiang.cashieringapi.service.basic.PaymentPayService;
import com.chengxiang.cashieringapi.service.receipt.FundReceiptService;
import com.chengxiang.cashieringapi.utils.SendCloud;
import com.chengxiang.michain.wallet.common.model.ResponseData;
import com.github.pagehelper.PageInfo;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * The type Pdf report controller.
 * 生成pdf
 */
@RestController
@RequestMapping("/test")
public class PDFReportController extends BaseController {

    @Autowired
    private FundReceiptService fundReceiptService;

    @Autowired
    private ExpenseCategoryService expensService;

    @Autowired
    private PaymentPayService payService;

    public static final boolean isDeBug = true;
    public static final String printPDFpath = "http://www.baidu.com/";
    public static final String printPDFpath_test = "http://localhost:8090/pdf/";
    public static final String PDF_PRINT_PATH = isDeBug ? printPDFpath : printPDFpath_test;
    // 上传地址
    public static final String scPDFpath = "D:\\apache-tomcat-slmall\\apache-tomcat-8.5.32-SLMall-Image\\webapps\\";
//    public static final String scPDFpath = "D:\\kaifa\\apache-tomcat-7.0.79\\webapps\\pdf\\";

    private static Font headfont ;// 设置字体大小
    private static Font keyfont;// 设置字体大小
    private static Font datefont;// 设置字体大小
    private static Font textfont;// 设置字体大小
    private static Font explainfont;// 设置字体大小

    static{
        BaseFont bfChinese;
        try {
            bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
            headfont = new Font(bfChinese, 16, Font.BOLD);// 设置字体大小
            keyfont = new Font(bfChinese, 14, Font.BOLD);// 设置字体大小
            datefont = new Font(bfChinese, 10, Font.NORMAL);// 设置字体大小
            textfont = new Font(bfChinese, 10, Font.NORMAL);// 设置字体大小
            explainfont = new Font(bfChinese, 8, Font.UNDEFINED);// 设置字体大小
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public PdfPCell createCell(String value, Font font, int align){
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setPhrase(new Phrase(value,font));
        return cell;
    }

    public PdfPCell createCell(String value,Font font){
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setPhrase(new Phrase(value,font));
        return cell;
    }

    public PdfPCell createCell(String value,Font font,int align,int colspan,boolean boderFlag){
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);       // 设置列数
//        cell.setRowspan(23);  // 设置行数
        cell.setPhrase(new Phrase(value,font));
        cell.setPadding(3.0f);
        if(!boderFlag){
            cell.setBorder(0);
            cell.setPaddingTop(10.0f);
            cell.setPaddingBottom(8.0f);
        }
        return cell;
    }

    public PdfPCell createCell1(String value,Font font,int align,int colspan,boolean boderFlag){
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setColspan(colspan);       // 设置列数
//        cell.setRowspan(23);  // 设置行数
        cell.setPhrase(new Phrase(value,font));
        cell.setBorder(0);
        cell.setPadding(2.0f);
        if(!boderFlag){
//            cell.setBorder(0);
            cell.setPaddingTop(10.0f);
//            cell.setPaddingBottom(8.0f);
        }
        return cell;
    }

    public PdfPTable createTable(int colNumber){
        PdfPTable table = new PdfPTable(colNumber);
        try{
            int maxWidth = 520;
            table.setTotalWidth(maxWidth);
//            int[] TableWidths = { 15, 40, 15, 20 , 100,100,100,100, 100,100};//按百分比分配单元格宽带
//            table.setWidths(TableWidths);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.getDefaultCell().setBorder(1);
        }catch(Exception e){
            e.printStackTrace();
        }
        return table;
    }

    public void generatePDF(File file,List<FundReceipt> list) throws Exception{
        Document document = new Document();// 建立一个Document对象
        try {
            PdfWriter writer =PdfWriter.getInstance(document,new FileOutputStream(file));
            document.open();
            document.setPageSize(PageSize.A4);// 设置页面大小Rectangle
            PdfPTable table = createTable(11);
//            table.getDefaultCell().setBorder(0);
            table.addCell(createCell("收款单", headfont,Element.ALIGN_CENTER,11,false));
            // 当前时间
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
            String date=df.format(new Date());
            table.addCell(createCell("打印时间:"+date, datefont,Element.ALIGN_RIGHT,11,false));

            table.addCell(createCell("店铺号", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("店铺名", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("金额", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("手续费", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("单号", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("类型", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("日期", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("单据号", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("收银员", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("姓名", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("电话", keyfont, Element.ALIGN_CENTER));
            String companyCode=getCompanyCode();
            PageInfo<ExpenseCategory> pageList=expensService.doSelectAll(1,0,companyCode,"");
            List<ExpenseCategory> expenseCategoryList=pageList.getList();
            SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
            if(list.size()>0){
                for(int i=0;i<list.size();i++){
                    FundReceipt fundReceipt=list.get(i);
                    table.addCell(createCell(fundReceipt.getShopStoreCode(),textfont));
                    table.addCell(createCell(fundReceipt.getShopStoreName(), textfont));
                    table.addCell(createCell(String.valueOf(fundReceipt.getOrderMoney()), textfont));
                    table.addCell(createCell(String.valueOf(fundReceipt.getFeeMoney()), textfont));

                    table.addCell(createCell(fundReceipt.getSaleCode(), textfont));
                    // 费用类别名称
                    String name="";
                    if(fundReceipt.getExpenseCode().equals("XS")){
                       name="销售收款";
                    }else{
                        for (ExpenseCategory expense:expenseCategoryList) {
                            if(fundReceipt.getExpenseCode().equals(expense.getExpenseCode())){
                                name=expense.getExpenseName();
                                break;
                            }
                        }
                    }
                    if(name.equals("")){
                        name="未知";
                    }
                    table.addCell(createCell(name, textfont));
                    String orderGoodsDate=df1.format(fundReceipt.getOrderGoodsDate());
                    table.addCell(createCell(orderGoodsDate, textfont));
                    table.addCell(createCell(fundReceipt.getOrderCode(), textfont));
                    table.addCell(createCell(fundReceipt.getCashierName(), textfont));
                    table.addCell(createCell(fundReceipt.getCustomerName(), textfont));
                    table.addCell(createCell(fundReceipt.getCustomerTelephone(), textfont));
                }
            }
            table.addCell(createCell("技术支持:善良的良小爷", explainfont,Element.ALIGN_RIGHT,11,false));
            table.addCell(createCell1("网站:https://www.baidu.com/", explainfont,Element.ALIGN_RIGHT,11,true));
            document.add(table);
            document.close();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Select payment pay response data.
     * 查询是否填写邮件地址
     * @return the response data
     */
    @GetMapping("selectPaymentPay")
    public ResponseData selectPaymentPay() {
        // 从参数表查询收邮件人地址
        PaymentPay pay=payService.selectByCompanyCode(getCompanyCode());
        if(pay.getEmail()==null || pay.getEmail().equals("")){
            return new ResponseData(false);
        }
        return new ResponseData(true,pay.getEmail());
    }

    /**
     * 创建多级文件夹
     * @param file
     * @return
     */
    private static boolean createFileOrDir(File file) {
        System.out.println(file.getPath());
        if (file.isDirectory()) {
            return file.mkdirs();
        }
        File parentFile = file.getParentFile();
        if (!parentFile.exists()) {
            System.out.println(parentFile.getPath());
            boolean mkdirs = parentFile.mkdirs();
            if (!mkdirs)
                return false;
        } else {
            if (!parentFile.isDirectory()) {
                boolean delete = parentFile.delete();
                boolean mkdirs = parentFile.mkdirs();
                if (!delete || !mkdirs) return false;
            }
        }
        try {
            return file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * Print taxpayer pdf response data.
     * 输出pdf文件
     * @param pageNum       the page num
     * @param pageSize      the page size
     * @param orderCode     the order code
     * @param shopCode      the shop code
     * @param shopStoreCode the shop store code
     * @param startDate     the start date
     * @param endDate       the end date
     * @param expenseCode   the expense code
     * @param cashierId     the cashier id
     * @return the response data
     */
    @GetMapping("pdf")
    public ResponseData printTaxpayerPDF(Integer pageNum, Integer pageSize, String orderCode, String shopCode,
                                         String shopStoreCode, String startDate, String endDate, String expenseCode, String cashierId) {
        PageInfo<FundReceipt> pageDate = fundReceiptService.listPageAll(pageNum,pageSize,getCompanyCode(),
                orderCode,shopCode,shopStoreCode,startDate,endDate,expenseCode,cashierId);
        String printFileName = System.currentTimeMillis() + ".pdf";
        // pdf文件地址
        String pdfUrl=PDF_PRINT_PATH + printFileName;
        String pdfUrl1=scPDFpath + printFileName;
        File file = new File(pdfUrl1);
        try {
            if(!file.exists()){     //如果文件夹不存在
//                file2.mkdir();           //创建文件夹,这个只能创建一级文件夹,所以弃用
                createFileOrDir(file);
            }
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        List<FundReceipt> list=pageDate.getList();
        try {
            // 生成PDF
            generatePDF(file,list);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 从参数表查询收邮件人地址
        PaymentPay pay=payService.selectByCompanyCode(getCompanyCode());
        if(pay==null){
            return new ResponseData(false);
        }
        try {
            // 调用邮箱平台接口
            SendCloud.send_template(new InvoiceEmail(pdfUrl,pay.getEmail()),"shop_get","","店铺通");
            return new ResponseData(true);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseData(false);
        }
//        return new ResponseData(true);
    }

    public static void main(String[] args) throws Exception {
        File file = new File("D:\\kaifa\\apache-tomcat-7.0.79\\webapps\\text.pdf");
        file.createNewFile();
//        new PDFReportController(file).generatePDF();
    }


}

注释:这就是生成pdf的全部代码,里边都有注释,所以只说几个需要注意的点。

  • 这段代码是为了创建文件夹,因为你上边写的地址,有时候服务器上会没有,或者是忘了创建这个文件夹了,它就报错了,因为没这个地址,所以这个地址是为了防止此类错误,没有的话给它自动创建文件夹。
File file = new File(pdfUrl1);
        try {
            if(!file.exists()){     //如果文件夹不存在
//                file2.mkdir();           //创建文件夹,这个只能创建一级文件夹,所以弃用
                createFileOrDir(file);
            }
  • 这段代码就是给它生成了一个时间戳,然后这个pdf名就是这个
String printFileName = System.currentTimeMillis() + ".pdf";
  • 这段是生成pdf文件以后,给用户发一个邮件,所以需要在系统里边填一下邮箱地址,然后给用户发邮件,邮件里边有这个pdf的url,这个下一篇文章在仔细介绍。
// 调用邮箱平台接口
SendCloud.send_template(new InvoiceEmail(pdfUrl,pay.getEmail()),"shop_get","","店铺通");
return new ResponseData(true);

好,现在来看一下效果
在这里插入图片描述
注释:pdf的名就是自己定义的时间戳
在这里插入图片描述
注释:里边的宽度啥的都是可以调的,我代码里有注释;样子就是这样,然后可以打印啊啥的,就由用户自己了。

大概就是这个意思,如果大伙儿还有不太清楚的地方,大伙儿可以在下面给我留言,或者发我邮箱邮件,邮箱地址是2978975101@qq.com,如有不足之处,也希望大家提出来,我们一起进步,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值