From 8ef265891b46994a8569c3f5195b9413a0d2a240 Mon Sep 17 00:00:00 2001 From: ryoeiken <754264374@qq.com> Date: Mon, 1 Feb 2021 16:19:44 +0800 Subject: [PATCH] =?UTF-8?q?pdf=20=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-system/pom.xml | 14 ++ .../system/fantang/common/NumberToList.java | 120 +++++++++++++++--- .../controller/FtPrepaymentDaoController.java | 63 ++++----- .../ruoyi/system/fantang/utils/PdfUtils.java | 73 +++++++++++ ruoyi-ui/src/api/fantang/prepayment.js | 2 +- .../src/views/fantang/prepayment/index.vue | 5 +- 6 files changed, 222 insertions(+), 55 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/fantang/utils/PdfUtils.java diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index cddc6a3a4..d3a4048d3 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -23,6 +23,20 @@ ruoyi-common + + + com.itextpdf + itextpdf + 5.5.13.2 + + + + + com.itextpdf + itext-asian + 5.2.0 + + \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/fantang/common/NumberToList.java b/ruoyi-system/src/main/java/com/ruoyi/system/fantang/common/NumberToList.java index 06b95fc56..be6d1a263 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/fantang/common/NumberToList.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/fantang/common/NumberToList.java @@ -1,49 +1,139 @@ package com.ruoyi.system.fantang.common; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class NumberToList { - public static Map convertTo(float number, int level) { + public static Map convertTo(float number, String level) { String[] str = {"fen","jiao","yuan", "shi", "bai", "qian", "wan", "shiwan", "baiwan", "qianwan"}; Map map = new HashMap<>(); // 最大转换20W以内的数值 - if (number >= 100000000 || number <= 0 ) + if (number >= 100000000 || number <= 0 ){ return null; + } + long ret = (long) (number*100); + boolean flag = false; + for (String s : str) { switch (s) { case "fen": - map.put(s + String.valueOf(level), String.valueOf(number%10)); + map.put(s + level, String.valueOf(ret%10)); + if (ret < 10) { + flag = true; + } break; case "jiao": - map.put(s + String.valueOf(level), String.valueOf((number/10)%10)); + if (flag){ + if (ret < 100) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + } + } else { + map.put(s + level, String.valueOf((ret/10)%10)); + } break; case "yuan": - map.put(s + String.valueOf(level), String.valueOf((number/100)%10)); + if (flag) { + if (ret < 1000) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + } + } else { + map.put(s + level, String.valueOf((ret/100)%10)); + } break; case "shi": - map.put(s + String.valueOf(level), String.valueOf((number/1000)%10)); + if (flag) { + if (ret < 10000) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + flag = true; + } + } else { + map.put(s + level, String.valueOf((ret/1000)%10)); + } break; case "bai": - map.put(s + String.valueOf(level), String.valueOf((number/10000)%10)); + if (flag) { + if (ret < 100000) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + } + } else { + map.put(s + level, String.valueOf((ret/10000)%10)); + } break; case "qian": - map.put(s + String.valueOf(level), String.valueOf((number/100000)%10)); + if (flag) { + if (ret < 1000000) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + } + } else { + map.put(s + level, String.valueOf((ret/100000)%10)); + } break; case "wan": - map.put(s + String.valueOf(level), String.valueOf((number/1000000)%10)); + if (flag) { + if (ret < 10000000) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + } + } else { + map.put(s +level, String.valueOf((ret/1000000)%10)); + } break; case "shiwan": - map.put(s + String.valueOf(level), String.valueOf((number/10000000)%10)); + if (flag) { + if (ret < 100000000) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + } + } else { + map.put(s + level, String.valueOf((ret/10000000)%10)); + } break; case "baiwan": - map.put(s + String.valueOf(level), String.valueOf((number/100000000)%10)); + if (flag) { + if (ret < 1000000000) { + map.put(s + level, "¥"); + flag = true; + } else { + map.put(s + level, " "); + } + } else { + map.put(s + level, String.valueOf((ret/100000000)%10)); + } + break; + default: break; } } + +// flag = false; +// for (String s : str) { +// if (flag == false) { +// if (Objects.equals(map.get(s + level), " ")) { +// flag = true; +// map.put(s + level, "¥"); +// } +// } +// } + return map; } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/fantang/controller/FtPrepaymentDaoController.java b/ruoyi-system/src/main/java/com/ruoyi/system/fantang/controller/FtPrepaymentDaoController.java index 9c9c54d94..01c036eba 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/fantang/controller/FtPrepaymentDaoController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/fantang/controller/FtPrepaymentDaoController.java @@ -5,29 +5,23 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.fantang.common.NumberToList; import com.ruoyi.system.fantang.domain.FtPrepaymentDao; import com.ruoyi.system.fantang.domain.FtPrepaymentVo; import com.ruoyi.system.fantang.service.IFtPrepaymentDaoService; +import com.ruoyi.system.fantang.utils.PdfUtils; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URLEncoder; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.util.*; /** * 收费管理Controller @@ -186,32 +180,29 @@ public class FtPrepaymentDaoController extends BaseController { return toAjax(iFtPrepaymentDaoService.removeByIds(Arrays.asList(prepaymentIds)) ? 1 : 0); } - @GetMapping("/generateReceiptPdf") - public void generateReceiptPdf(HttpServletRequest request, HttpServletResponse response) throws IOException { + @PostMapping("/generateReceiptPdf") + public AjaxResult generateReceiptPdf(@RequestBody JSONObject params) { + Map convert = NumberToList.convertTo(123.12F, "1"); + System.out.println(convert); + + // 模板路径 + String templatePath = "F:\\pdfTemplate\\饭堂票据模板.pdf"; + + System.out.println(RuoYiConfig.getUploadPath()); + + // 生成的新文件路径 + String outputPath = RuoYiConfig.getUploadPath() + "\\饭堂票据.pdf"; + + // 数据 + Map values = new HashMap<>(); + + // 填入模板 + PdfUtils.fillTemplate(templatePath, outputPath, values); + + // 下载地址 + String downloadPath = "profile/upload/饭堂票据.pdf"; + + return AjaxResult.success(downloadPath); - //根据文件信息中文件名字 和 文件存储路径获取文件输入流 - String realpath = "E:\\Dev\\jmfx_1\\fantang\\ruoyi-ui\\src\\assets\\images\\login-background.jpg"; - //PDF文件地址 - File file = new File(realpath); - 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(); - } - } - } } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/fantang/utils/PdfUtils.java b/ruoyi-system/src/main/java/com/ruoyi/system/fantang/utils/PdfUtils.java new file mode 100644 index 000000000..97aaf409e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/fantang/utils/PdfUtils.java @@ -0,0 +1,73 @@ +package com.ruoyi.system.fantang.utils; + +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.pdf.*; + +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class PdfUtils { + + public static void fillTemplate(String templatePath, String outputPath, Map values) { + + PdfReader reader; + FileOutputStream out; + ByteArrayOutputStream bos; + PdfStamper stamper; + try { + out = new FileOutputStream(outputPath); + reader = new PdfReader(templatePath); + bos = new ByteArrayOutputStream(); + stamper = new PdfStamper(reader, bos); + AcroFields form = stamper.getAcroFields(); + + BaseFont baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); + form.addSubstitutionFont(baseFont); + + Map map = new HashMap<>(); + map.put("departName", "杜阮颐养院"); + map.put("payUnit", "苏镜泉"); + map.put("hospitalId", "R20081001"); + Date date = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); + map.put("invoiceDate", sdf.format(date)); + map.put("projName1", "预付款 2020.10.06 至 2021.02.01"); + map.put("oneQian1", "1"); + map.put("oneBai1", "1"); + map.put("oneShi1", "1"); + map.put("oneWan", "1"); + map.put("oneQian2", "1"); + map.put("oneBai2", "1"); + map.put("oneShi2", "1"); + map.put("oneYuan", "1"); + map.put("oneJiao", "1"); + map.put("oneFen", "1"); + map.put("priceLite", "¥11111111.11"); + map.put("priceBig", "壹仟壹佰壹拾壹万壹仟壹佰壹拾壹元壹角壹分"); + map.put("remarks1", "测试收据样式"); + map.put("payee", "江门市第三人民医院"); + + + for (String name : form.getFields().keySet()) { + form.setField(name, map.get(name)); + } + //true代表生成的PDF文件不可编辑 + stamper.setFormFlattening(false); + stamper.close(); + Document doc = new Document(); + PdfCopy copy = new PdfCopy(doc, out); + doc.open(); + PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1); + copy.addPage(importPage); + doc.close(); + } catch (IOException | DocumentException e) { + e.printStackTrace(); + } + } +} diff --git a/ruoyi-ui/src/api/fantang/prepayment.js b/ruoyi-ui/src/api/fantang/prepayment.js index ccc7f7a34..e135d4d3c 100644 --- a/ruoyi-ui/src/api/fantang/prepayment.js +++ b/ruoyi-ui/src/api/fantang/prepayment.js @@ -105,7 +105,7 @@ export function exportPrepayment(query) { export function generateReceiptPdf(data) { return request({ url: '/fantang/prepayment/generateReceiptPdf', - method: 'get', + method: 'post', data: data }) } diff --git a/ruoyi-ui/src/views/fantang/prepayment/index.vue b/ruoyi-ui/src/views/fantang/prepayment/index.vue index c9f2cebde..775c1781a 100644 --- a/ruoyi-ui/src/views/fantang/prepayment/index.vue +++ b/ruoyi-ui/src/views/fantang/prepayment/index.vue @@ -252,11 +252,10 @@ export default { }, - // 生产收据 pdf + // 生成收据 pdf handleGenerateReceiptPdf(row) { - console.log(row); generateReceiptPdf(row).then(response => { - // window.open("http://47.106.12.11:8080/prod-api/" + response.msg) + window.open("http://192.168.3.93:9001/dev-api/" + response.msg) }) console.log(process.env); },