• java使用world模板动态生成PDF文件


    根据项目需求,需要用到一个功能,根据页面参数需要动态的生成一个world,并将world生成两份PDF文件,一份正式文件,一份临时的电子文件(带有二维码,扫描可以下载正式文件的电子版本)。同时上传到文件存储服务器minio上,下面介绍具体的实现步骤

    1、首先准备一个world模板,新建一个world如下图所示

    在需要动态填入数据的地方采用字母代替(此处注意,字母需要大写),用于占位操作。

    2、编辑代码,项目接口,我采用的是一般的是SpringBoot项目结构,具体不多述,下面贴出关键代码:①根据接口获取到的参数,来开始命名最后要生成的pdf文件

     scXwblPdfRequest  是接口传来的实体形的参数

    1. //生成文件名
    2. String pdfName = FileUpload.aliyungenFileNameNew("文档名_"+scXwblPdfRequest.getWorkUnit()+"_"+scXwblPdfRequest.getName());
    3. String fileName = pdfName + "_2.pdf";
    4. String fileNameZswj = pdfName+".pdf";

    ②准备文件

    1. String pdfUrl = fwurl +bucketName+Constants.SPRIT+ fileName;
    2. String pdfUrlZswj = fwurl +bucketName+Constants.SPRIT+ fileNameZswj;
    3. //获取本地准备的world模板
    4. String mblj = "file/xwbl_1.doc";
    5. Map textMap = createXwblTextMap(scXwblPdfRequest );
    6. //设置pdf的文件地址(含二维码)
    7. String pdfUrl = fwurl +bucketName+Constants.SPRIT+ fileName;
    8. //设置pdf的正式文件地址(不含二维码)
    9. String pdfUrlZswj = fwurl +bucketName+Constants.SPRIT+ fileNameZswj;

    方法说明:createXwblTextMap是将接口传来的实体参数,进行处理,以map形式处理好

    1. //构造textMap
    2. public Map createXwblTextMap(ScXwblPdfRequest xwblPdfRequest){
    3. Map textMap = new HashMap<>();
    4. //开始时间
    5. textMap.put("STIME",String.valueOf(xwblPdfRequest.getStartTime()));
    6. //结束时间
    7. textMap.put("ETIME",String.valueOf(xwblPdfRequest.getEndTime()));
    8. //地点
    9. textMap.put("XWADRESS",xwblPdfRequest.getXwadress());
    10. //姓名
    11. textMap.put("NAME",xwblPdfRequest.getName());
    12. //性别
    13. textMap.put("SEX",xwblPdfRequest.getSex());
    14. return textMap;
    15. }

    3、文件的其他信息处理,uploadforXwblUrl:是处理world完成后生成含有二维码的pdf文件,XwblzswjUrl :是处理world完成后生成不含有二维码的pdf文件

    1. //保存两个pdf,一个含二维码的临时文件,一个正式文件
    2. //加了二维码,用于扫码下载 (pdfUrlZswj 用于给二维码下载地址)
    3. textMap.put("EWMTIPS","扫描二维码查看、下载正式文件");
    4. //不带二维码的地址
    5. String withoutEwmUrl = pdfUrlZswj;
    6. String uploadforXwblUrl = xwblcs(bucketName,textMap , pdfUrl , fileName , true , mblj , withoutEwmUrl );
    7. //没有二维码
    8. textMap.put("EWMTIPS","");
    9. String XwblzswjUrl = xwblcs(bucketName,textMap , pdfUrlZswj , fileNameZswj , false , mblj ,"");
    10. result.put("uploadforXwblUrl",uploadforXwblUrl);
    11. result.put("XwblzswjUrl", XwblzswjUrl);

    方法说明:xwblcs作用:主要用于生成PDF文件

    1. //生成PDF文件
    2. public String xwblcs(String bucketName,Map textMap , String pdfUrl ,String fileName , boolean ewm , String mbwj ,String withoutEwmUrl ){
    3. try{
    4. MinioUtils minio = new MinioUtils();
    5. //读取doc模板文件
    6. ClassPathResource classPathResource = new ClassPathResource(mbwj);
    7. Document doc = new Document(classPathResource.getInputStream());
    8. DocumentBuilder builder = new DocumentBuilder(doc);
    9. //关闭文件流
    10. classPathResource.getInputStream().close();
    11. //向文档中插入文字
    12. AsposeUtil.docTextReplace(doc , textMap);
    13. //插入二维码
    14. if(ewm){
    15. AsposeUtil.docEwmReplace(builder ,withoutEwmUrl);
    16. }
    17. OutputStream outputStreamPdf= new ByteArrayOutputStream(1024);
    18. doc.save(outputStreamPdf, SaveFormat.PDF);
    19. ByteArrayOutputStream baosPdf = (ByteArrayOutputStream) outputStreamPdf ;
    20. ByteArrayInputStream inputStreamPdf = new
    21. ByteArrayInputStream(baosPdf.toByteArray());
    22. /**生成好的PDF文件上传到minio**/
    23. minio.putObject(bucketName,fileName,inputStreamPdf,"application/pdf");
    24. //关闭流
    25. baosPdf.close();
    26. inputStreamPdf.close();
    27. outputStreamPdf.close();
    28. /**生成的刚上传的PDF文件返文件路径**/
    29. return pdfUrl;
    30. }catch (Exception e){
    31. log.error(e.toString());
    32. throw new BussinessException(BizExceptionEnum.PDF_ERROR);
    33. }
    34. }

    AsposeUtil:工具类,用于处理文字、图片插入插入文档,贴代码

    1. @Slf4j
    2. public class AsposeUtil {
    3. /**
    4. * word转pdf
    5. */
    6. public static void docToPdf(String intPath, String outPath) throws Exception {
    7. Document doc = new Document(intPath);
    8. FileOutputStream os = null;
    9. //新建一个pdf文档
    10. //File file = new File(outPath);
    11. //os = new FileOutputStream(file);
    12. //保存为pdf文件,saveFormat取的是words包下的,值为:40
    13. doc.save(outPath);
    14. //os.close();
    15. }
    16. public static void docTextReplace(Document doc, Map textMap) throws Exception {
    17. Range range = doc.getRange();
    18. for (Map.Entry entry : textMap.entrySet()) {
    19. range.replace(entry.getKey(), entry.getValue(), true, false);
    20. }
    21. }
    22. public static void docEwmReplace(DocumentBuilder builder , String pdfUrl) throws Exception {
    23. //读取用于放在二维码中间的图片
    24. ClassPathResource classPathResource1 = new ClassPathResource("file/ewmLogo.jpg");
    25. OutputStream outputStream = new ByteArrayOutputStream(1024);
    26. QRCodeUtil.encode(pdfUrl, classPathResource1.getInputStream(),outputStream , true);
    27. classPathResource1.getInputStream().close();
    28. ByteArrayOutputStream baos = (ByteArrayOutputStream) outputStream ;
    29. ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
    30. //插入二维码
    31. builder.moveToBookmark("EWM");
    32. builder.insertImage(inputStream , 150 , 150);
    33. outputStream.close();
    34. baos.close();
    35. inputStream.close();
    36. inputStream.close();
    37. }
    38. }

    这里需要注意的是。在这个工具类中,有向world中插入图片的操作,builder.moveToBookmark("EWM");,这里插入进去的图片,不是用占位符去对应的,而是在world模板中需要插入一个名为“EWM”的书签,

     最后流程介绍到此结束。最后用接口工具调用该接口,会返回两个地址,一个带二维码。一个不带二维码

     

    最后访问minio的地址获取到两个pdf文件。同时手机或者pad,扫描带有二维码的pdf上的二维码,也能下载不带二维码,用于打印的文档

  • 相关阅读:
    C# 通关手册(持续更新......)
    vue+echarts项目七:热销商品占比(可切换饼图)
    STM32CubeMX 下载和安装 详细教程
    93 # 实现 express 错误处理中间件
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    造轮子之种子数据
    实战PyQt5: 155-QChart图表之极坐标图表
    解决TensorRT加速推理SDXL出现黑图问题
    JVM笔记:GC 日志分析
    Linux 系统中查看和停止删除定时任务
  • 原文地址:https://blog.csdn.net/qq_34178998/article/details/127859670