java 模板 word转pdf 可分页 带图片

java 模板 word转pdf 可分页 带图片

之前写过一个简单的案例,但是在项目中完全不能满足客户的需求,所以重新用啦一种方式来写,采用了word转换pdf的方式,这种经过不断研究,满足了可分页,列表循环数据可带图片,可以说很完善了。

第一步:先来编写word自定义模板以及转换模板,转换模板可以直接是客户发过来的样式模板,自定义模板呢,就是带java中赋值的占位符字段。

下面举例几个:

单个:
java 模板 word转pdf 可分页 带图片_第1张图片

列表:无边框
java 模板 word转pdf 可分页 带图片_第2张图片
列表:有边框
java 模板 word转pdf 可分页 带图片_第3张图片
列表:带图片 单个图片 日期格式
java 模板 word转pdf 可分页 带图片_第4张图片

@ApiOperation(value = "导出pdf报告")
    @GetMapping("/exportPdf/{id}")
    public void exportPdf(HttpServletResponse response, @PathVariable Integer id) {
        mLegalCompanyService.exportPdf(response, id);
    }

//两个模板 写模板docx 转换模板docx

   @Value("${upload.dir}")
    String ulr;//word模板路径
   @Value("${imgUrl.url}")
    String path;//图片路径
    
  /**
     * 根据 企业id生成 word
     * word 转换PDF
     *
     * @param response
     * @param id
     */
    @Override
    public void exportPdf(HttpServletResponse response, Integer id) {

		//本地调试路径
        //if (!System.getProperty("os.name").toLowerCase().contains("win")) {
        //    ulr = "/Users/xxx/Desktop/files/项目/转换dpf/";
        //}
        long old = System.currentTimeMillis();

        LegalCompany legalCompany = this.getById(id);
        if (ObjectUtils.isEmpty(legalCompany)) {
            return;
        }
        HashMap<String, Object> map = new HashMap<>();
        //头部标题
        map.put("title", legalCompany.getCompanyName());
		//报告时间
        map.put("date1", 	"第一次检查");
		// 评估依据
        addBasis(map, legalCompany);
        // 现场检查发现的问题
        addRectifyList(map, legalCompany);
        //日期
        map.put("date", new Date());
        
        //签名图片
         if (StringUtils.isNotEmpty(legalCompany.getSignaturePicture())) {
            ImageEntity image = new ImageEntity();
            image.setHeight(842);
            image.setWidth(595);
            //这里我的路径需要拼接,只要图片路径能访问就可以。
            image.setUrl(path + legalCompany.getSignaturePicture());
            image.setType(ImageEntity.URL);
            map.put("SignaturePicture", image);
        }
        try {
            XWPFDocument doc = WordExportUtil.exportWord07(ulr + "/写模板.docx", map);
            FileOutputStream fos = new FileOutputStream(ulr + "/转换模板.docx");
            doc.write(fos);
            fos.close();

            // 开始转换pdf
            InputStream inputStream = new FileInputStream(ulr + "/转换模板.docx");
            OutputStream outputStream = response.getOutputStream();

            response.setCharacterEncoding("utf-8");
            response.setHeader("content-type", "application/octet-stream");
            String fileName = URLEncoder.encode(legalCompany.getCompanyName() + "-" + TimeUtils.formatDate(inspectData, TimeUtils.DATE_FORMAT_DATEONLY) + "-" + "检查报告" + ".pdf", "UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");


            // 验证License 若不验证则转化出的pdf文档会有水印产生
            if (!AsposeWordsUtils.getLicense()) {
                return;
            }

            //要转换的word文件
            Document doct = new Document(inputStream);
            doct.save(outputStream, SaveFormat.PDF);

            long now = System.currentTimeMillis();
            //转化用时
            log.info("共耗时:" + ((now - old) / 1000.0) + "秒");

            outputStream.flush();
            outputStream.close();

        } catch (IOException e) {
            log.info("IOException==>异常:{}==>{}", e);
        } catch (Exception e) {
            log.info("Exception==>异常:{}==>{}", e);
        }
    }


 	 /**
     * 评估依据
     *
     * @param map
     * @param legalCompany
     */
    private void addBasis(HashMap<String, Object> map, LegalCompany legalCompany) {

        List<String> list = Lists.newArrayList();
        //根据企业id查询检查完毕最后一条数据
        LegalCheckTheRecord checkTheRecord = legalCheckTheRecordService.getByCompanyId(legalCompany.getCompanyId());

        List<BasisInfo> basisInfoList = basisInfoService.findListByBasisId(checkTheRecord.getBasisId());

        if (CollectionUtils.isNotEmpty(basisInfoList)) {
            for (int i = 0; i < basisInfoList.size(); i++) {
                list.add(basisInfoList.get(i).getBasisInfoName());
            }
            map.put("basis", list);
        }
    }


    /**
     * 设置 “现场检查发现的问题及整改情况”
     *
     * @param map
     * @param legalCompany
     */
    private void addRectifyList(HashMap<String, Object> map, LegalCompany legalCompany) {
        List<HashMap<String, Object>> list = new ArrayList<>();

        // 数据
        List<LegalInspect> legalInspects = legalInspectService.selectList(legalCompany.getCompanyId);
        
        if (CollectionUtils.isNotEmpty(legalInspects)) {
            // 数据 for 循环
            for (int i = 1; i <= legalInspects.size(); i++) {
                LegalInspect legalInspect = legalInspects.get(i - 1);
                HashMap<String, Object> mapData = new HashMap<>();
                mapData.put("id", isNull(i));
                mapData.put("problem", legalInspect.getProblem());
                mapData.put("levelId", legalInspect.getLevelId().equals(1) ? "一般隐患" : "重大隐患");
                //检查图片
                if (StringUtils.isNotEmpty(legalInspect.getLivePhotos())) {
                
                //这里我的路径需要拼接,只要图片路径能访问就可以。
                    ImageEntity image = new ImageEntity(path + legalInspect.getLivePhotos(), 100, 100);
                    mapData.put("livePhotos", image);
                }
                mapData.put("isRectify", legalInspect.getIsRectify().equals(1) ? "未整改" : "已整改");
				//整改图片
                if (StringUtils.isNotEmpty(legalInspect.getFinalPhotos())) {
                
                    ImageEntity image = new ImageEntity(path + legalInspect.getFinalPhotos(), 100, 100);
                    mapData.put("finalPhotos", image);
                }

                mapData.put("measure", legalInspect.getMeasure());
                mapData.put("safetyPrincipal", legalCompany.getSafetyPrincipal());
                if (null != periodMap && periodMap.containsKey(legalInspect.getDeadlineId())) {
                    mapData.put("deadlineNum", periodMap.get(legalInspect.getDeadlineId()).getDeadlineNum() + "天");
                }
				//检查次数
                Long between = DateUtiles.between(legalInspect.getSubmitTime().getTime(), 					    System.currentTimeMillis());
                int num = 1;
                if (between > legalCompany.getCycleDate()) {
                    num += between / legalCompany.getCycleDate();
                }

                mapData.put("num", "第" + num + "次检查");
                list.add(mapData);
            }
        }
        map.put("inspect", list);
    }

// AsposeWordsUtils类
public class AsposeWordsUtils {
/**
	 * 判断是否有授权文件 如果没有则会认为是试用版,转换的文件会有水印
	 */
	public static boolean getLicense() {
		boolean result = false;
		try {
			InputStream is = AsposeWordsUtils.class.getClassLoader().getResourceAsStream("license.xml");
			License aposeLic = new License();
			aposeLic.setLicense(is);
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
}

pdf下载后:
java 模板 word转pdf 可分页 带图片_第5张图片

java 模板 word转pdf 可分页 带图片_第6张图片

java 模板 word转pdf 可分页 带图片_第7张图片
java 模板 word转pdf 可分页 带图片_第8张图片
java 模板 word转pdf 可分页 带图片_第9张图片
java 模板 word转pdf 可分页 带图片_第10张图片
这个报告文件页码很长,我只截取了一小部分,代码很多,但是只截取了一些,可能没办法提供全,有些涉及企业机密,要是有哪不懂,可以评论留言,如果有需要可以提供其他的给你们参考。

这个是不限页面的,单图片 列表图片都可以下载下来。

你可能感兴趣的:(java,pdf模板导出)