java-pdf-itext7、itextpdf 生成pdf 文件

djq8080發表於2020-12-25

1、如果是收據或者其他不是A4大小的票據,首先將票據用印表機掃描成圖片格式,用ps等工具裁剪成實際票據的大小備用。
在這裡插入圖片描述

2、設計一張實際票據大小的空白pdf模板,備用。
3、用Adobe 等pdf編輯工具開啟上面製作的空白模板,點選編輯,在更多->背景->新增->選檔案->瀏覽,選中步驟1製作的票據點選確定。
4、在選單欄中選擇準備表單,點選開始,儲存到相應的資料夾。
在這裡插入圖片描述
5、在需要填入值的地方新增文字域,設定域名稱,需要注意的一點

  • 設定外觀->文字大小選項中,一定設定文字大小和
    字型(實際操作中,如果填入值只涉及數字不需要,如果有漢字最好設定一下,後期賦值很可能頁面不顯示漢字)
    在這裡插入圖片描述
    6、新增完文字域,選擇工具,編輯->更多->背景->刪除,刪除背景,只留下文字域,儲存成模板。
    至此,itextpdf模板製作完成。下來就是往裡面進行賦值,將生成的臨時檔案按檔案流返回給前端,進行列印即可。

程式碼如下:

 //預繳款收據
    @Override
    public String queryByPdfPrint(PdfPrintVo pdfPrintVo, String templateName, String type) {
        //伺服器地址
        String upFiles = uploadpath;
        String files = "files";
        String temp = "pdfPrint";
        //查詢模板的位置 File.separator 表示路徑中的\或者/
        String templatePath = upFiles +  File.separator + files + File.separator + temp + File.separator + templateName ;
        if (templatePath.contains("\\")) {
            templatePath = templatePath.replace("\\", "/");
        }
        ElderInfo elderInfo = elderInfoService.getOne(new QueryWrapper<ElderInfo>().eq("elder_number",pdfPrintVo.getElderNumber()).orderByAsc("create_time").last("limit 1"));
        File file = new File(upFiles + File.separator + files  + File.separator + elderInfo.getId());
        if (!file.exists()) {
            file.mkdirs();// 不存在則建立根目錄
        }
        String newPDFPath = file.getPath() + File.separator + templateName;
        if (newPDFPath.contains("\\")) {
            newPDFPath = newPDFPath.replace("\\", "/");
        }
        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
            out = new FileOutputStream(newPDFPath);//輸出流
            reader = new PdfReader(templatePath);//讀取pdf模板
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            //方法二:使用iTextAsian.jar中的字型
            BaseFont baseFont = BaseFont.createFont("STSong-Light",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
            Font font = new Font(baseFont);
            AcroFields form = stamper.getAcroFields();
            java.util.Iterator<String> it = form.getFields().keySet().iterator();
            if (type.equals(PdfPrintConstant.TYPE1)){
                while (it.hasNext()) {
                    String name = it.next().toString();
                    String sex = it.next().toString();
                 (StringUtils.isBlank(String.valueOf(pdfPrintVo.getEName())) ? "":String.valueOf(pdfPrintVo.getEName())));
                    form.setField(sex, (StringUtils.isBlank(String.valueOf(pdfPrintVo.getSex())) ? "":String.valueOf(pdfPrintVo.getSex())));
                }
            }
            stamper.setFormFlattening(true);//如果為false那麼生成的PDF檔案還能編輯,一定要設為true
            stamper.close();
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            doc.add(new Paragraph("解決中文問題了!",font));
            PdfImportedPage importPage = copy.getImportedPage(
                    new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();
        } catch (IOException e) {
            System.out.println(1);
        } catch (DocumentException e) {
            System.out.println(2);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return newPDFPath;
    }
 @AutoLog(value = "根據id和type,獲取PDF流")
	 @ApiOperation(value="根據id和type,獲取PDF流", notes="根據id和type,獲取PDF流")
	 @RequestMapping(value = "/preview", method = RequestMethod.GET)
	 public  void getTicketPDF(@RequestParam(name="id",required=true) @ApiParam(value = "費用結算傳老人id,預繳傳id")  String id
			 , @RequestParam(name="type",required=true) @ApiParam(value = "1 預繳 2費用結算") String type,HttpServletRequest request, HttpServletResponse response){
		 //獲取模板資料
		 String templateFile = null;
		 PdfPrintVo pdfPrintVo = new PdfPrintVo();
         if (type.equals(PdfPrintConstant.TYPE1)){
         	//查詢預繳收款
			 pdfPrintVo = costPayAdvanceService.listQueryByType1(id);
		 }else {
			 pdfPrintVo = costRetreatSettleService.queryPdfInfo(id);
		 }
		 if (pdfPrintVo!=null){
		 	if (type.equals(PdfPrintConstant.TYPE1)){
				templateFile = costPayAdvanceService.queryByPdfPrint(pdfPrintVo, PdfPrintConstant.YJSJ,type);
			}else if (type.equals(PdfPrintConstant.TYPE2)){
				templateFile = costPayAdvanceService.queryByPdfPrint(pdfPrintVo, PdfPrintConstant.JSPJ,type);
			}
			 File file = new File(templateFile);
			 if (file.exists()) {
				 byte[] data = null;
				 FileInputStream input=null;
				 try {
					 input= new FileInputStream(file);
					 data = new byte[input.available()];
					 input.read(data);
					 response.getOutputStream().write(data);
				 } catch (Exception e) {
					 System.out.println("pdf檔案處理異常:" + e);
				 }finally{
					 try {
						 if(input!=null){
							 input.close();
						 }
					 } catch (IOException e) {
						 e.printStackTrace();
					 }
				 }
			 }
		 }
	 }

相關文章