当前位置: 首页 > news >正文

kkFileView二开之pdf转图片接口

kkFileView二开之Pdf转图片接口

  • 1 kkFileView源码下载及编译
  • 2 Pdf转图片接口
    • 2.1 背景
    • 2.2 分析
    • 2.2 接口开发
      • 2.2.1 编写Pdf转图片方法
      • 2.2.2 编写转换接口
    • 2.3 接口测试
      • 2.3.1 Pdf文件准备
      • 2.3.2 pdf2Image
  • 3 部署

1 kkFileView源码下载及编译

前文 【kkFileView二开之源码编译及部署】 已完成了kkFileView源码二开的基础准备。

2 Pdf转图片接口

2.1 背景

在实际工作过程中,存在Pdf转图片的需求,比如人员证书,通过pdf模板填充后,生成对应的图片。

2.2 分析

kkFiewView 针对pdf在线预览会有两种方式,一种是转换为图片进行预览,一种是保留原始pdf格式进行预览,此处可以调用kkfiewView底层中pdf转图片预览的方式,实现对应的接口

2.2 接口开发

2.2.1 编写Pdf转图片方法

在cn.keking.service.FileHandlerService.java 中,新增转换方法:

/**
     * pdf转换为图片
     * @param pdfFilePath
     * @param fileAttribute
     * @return
     * @throws Exception
     */
    public List<String> pdf2jpgBase64(String pdfFilePath,FileAttribute fileAttribute) throws Exception {
        String filePassword = fileAttribute.getFilePassword();
        PDDocument doc = null;
        List<String> imageFile = new ArrayList<>();
        try {
            File pdfFile = new File(pdfFilePath);
            if (!pdfFile.exists()) {
                return null;
            }
            doc = Loader.loadPDF(pdfFile, filePassword);
            doc.setResourceCache(new NotResourceCache());
            int pageCount = doc.getNumberOfPages();
            PDFRenderer pdfRenderer = new PDFRenderer(doc);
            for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) {
                BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, ConfigConstants.getPdf2JpgDpi(), ImageType.RGB);
                imageFile.add(ImgUtil.toBase64DataUri(image,"jpg"));
            }
        } catch (IOException e) {
            logger.error("Convert pdf to jpg exception, pdfFilePath:{}", pdfFilePath, e);
            throw new Exception(e);
        } finally {
            if (doc != null) {   //关闭
                doc.close();
            }
        }
        return imageFile;
    }

2.2.2 编写转换接口

在cn.keking.web.controller包下,新增ConvertController.java 文件

package cn.keking.web.controller;

import cn.hutool.core.io.FileUtil;
import cn.keking.config.ConfigConstants;
import cn.keking.model.FileAttribute;
import cn.keking.model.FileType;
import cn.keking.service.FileHandlerService;
import cn.keking.service.OfficeToPdfService;
import cn.keking.utils.KkFileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 文件转换接口
 */
@Controller
public class ConvertController {
    private final String fileDir = ConfigConstants.getFileDir();
    //临时目录
    private final String tempPath = "temp" + File.separator;
    @Autowired
    private OfficeToPdfService officeToPdfService;
    @Autowired
    private FileHandlerService fileHandlerService;
    private static final String FILE_DIR = ConfigConstants.getFileDir();
    
    /**
     * pdf转换为图片
     * @param req
     * @param rep
     * @param file
     */
    @PostMapping("/pdf2Image")
    @ResponseBody
    public Map<String,Object> pdf2Image(HttpServletRequest req, HttpServletResponse rep, @RequestParam("file") MultipartFile file) {
        Map<String,Object> result = new HashMap<>();
        FileAttribute fileAttribute = new FileAttribute();
        String fullFileName = file.getOriginalFilename();
        fileAttribute.setType(FileType.typeFromFileName(fullFileName));
        fileAttribute.setName(fullFileName);
        fileAttribute.setSuffix(KkFileUtils.suffixFromFileName(fullFileName));
        try {
            String pdfName = fullFileName.substring(0, fullFileName.lastIndexOf(".") + 1) + "pdf";
            String outFilePath = FILE_DIR + pdfName;
            FileUtil.writeFromStream(file.getInputStream(),outFilePath);
            List<String> imageUrls = fileHandlerService.pdf2jpgBase64(outFilePath, fileAttribute);
            result.put("code",200);
            result.put("msg","转换成功");
            result.put("data",imageUrls);
        }catch (Exception e){
            e.printStackTrace();
            result.put("code",500);
            result.put("msg","pdf转换图片异常:"+e.getMessage());
        }
        return result;
    }
}

2.3 接口测试

2.3.1 Pdf文件准备

在这里插入图片描述

2.3.2 pdf2Image

使用Apifox新建接口,按如下方式配置,并点击发送
注意:通过源码分析可知,在Pdf进行预览过程中,预览速度会随着pdf的大小不同而不同,pdf越大,则接口速度越慢,因为是一次性将对应的pdf全部转换后返回至前端的。
在这里插入图片描述
结果格式化效果(pdf文件有85页,所以data中有85条数据)
在这里插入图片描述
按如下方式,将生成的每一条数据写入到img标签中

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta charset="utf-8" />
	<title>New Document</title>
</head>
<body>
	<img src="data标签中的每一行数据" alt="" />
</body>
</html>

在浏览器中打开编写的html文件,如效果图所示,即为转换后的base64图片
在这里插入图片描述

3 部署

可参考 【kkFileView二开之源码编译及部署】 文档中,【部署】目录下的方式,根据部署的平台选择合适的方式进行部署。

相关文章:

  • 你如何利用SIMD(如SSE/AVX)优化图像处理的性能?
  • 数据结构 二叉树
  • 超纯水设备的智能化控制系统为用户带来安全简便的操作体验
  • AWS SES 邮件服务退信/投诉处理与最佳实践指南
  • 记一次MySQL故障解决
  • Unity入门3 添加碰撞体
  • 打造高效狼性团队的实践指南
  • 将错误消息输出到标准错误流:Rust中的最佳实践
  • 掌控系统性能的利器:自动化系统性能监控工具
  • 使用c风格和c++风格逐行读取文件
  • 力扣19题——删除链表的倒数第 N 个结点
  • ping使用的协议,ping使用的协议是
  • linux系统测试网络pps、带宽和延时(方案来源于阿里云)
  • 解锁建造者模式:Java 编程中的对象构建秘籍
  • IT行业方向细分,如何做到专家水平——4.网络安全(Cybersecurity)
  • 进化强化学习
  • 计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习
  • 自建 Redis 中设置 ACL 用户和权限
  • 【Matlab算法】基于人工势场的多机器人协同运动与避障算法研究(附MATLAB完整代码)
  • Unity与SVN集成:实现高效版本控制
  • 竞彩湃|足总杯决赛或有冷门,德甲欧冠资格之争谁笑到最后
  • 61岁云浮市律师协会副会长谭炳光因突发疾病逝世
  • 病愈出院、跳大神消灾也办酒,新华每日电讯:农村滥办酒席何时休
  • 以军证实空袭也门多个港口
  • 广西百色“致富果”:高品质芒果直供香港,带动近五千户增收
  • 埃尔多安:愿在土耳其促成俄乌领导人会晤