kkFileView二开之pdf转图片接口

news2025/5/19 15:57:14

kkFileView二开之Pdf转图片接口

  • kkFileView二开系列文章:
  • 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 部署

kkFileView二开系列文章:

  1. kkFileView二开之源码编译及部署
  2. kkFileView二开之内外网转换
  3. kkFileView二开之word转pdf接口
  4. kkFileView二开之Excel转pdf接口
  5. kkFileView二开之pdf转图片接口
  6. kkFileView二开之企业级安全问题处理
    对应二开代码仓库:https://gitee.com/wbj_1/kk-file-view

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二开之源码编译及部署】 文档中,【部署】目录下的方式,根据部署的平台选择合适的方式进行部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2300035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络常见激活函数 9-CELU函数

文章目录 CELU函数导函数函数和导函数图像优缺点pytorch中的CELU函数tensorflow 中的CELU函数 CELU 连续可微指数线性单元&#xff1a;CELU&#xff08;Continuously Differentiable Exponential Linear Unit&#xff09;,是一种连续可导的激活函数&#xff0c;结合了 ELU 和 …

什么是网关?网关有什么作用?API网关的主要功能,SpringCloud可以选择有哪些API网关?什么是限流算法?网关如何实现限流?一篇文章读懂网关的前世今生

1、什么是网关&#xff1f; API网关&#xff08;API Gateway&#xff09;是一种中间层服务器&#xff0c;用于集中管理&#xff0c;保护和路由对后端服务的访问。它充当了客户端与后端服务之间的入口点&#xff0c;提供了一组统一的接口管理和控制API的访问。 2、网关示意图 3…

从安装软件到flask框架搭建可视化大屏(一)——创建一个flask页面,零基础也可以学会

1.第一步&#xff1a;安装软件 Flask是一个轻量级Web应用框架&#xff0c;用python代码编写&#xff0c;简单方便应用。 如何安装pycharm_pycharm只能安装在c盘吗-CSDN博客 Pycharm分为专业版和社区版&#xff0c;是python的主流工具 如何安装Anaconda_如何安装anacoda csdn-…

python opencv基础使用总结

1.安装opencv库&#xff1a;pip install opencv-python 2.基础使用范例 import cv2 #图片的基本操作#1.读取一张图片 参数 1&#xff1a;图片的文件名如果图片放在当前文件夹下&#xff0c;直接写文件名就行&#xff0c;如lena.jpg否则需要给出绝对路径&#xff0c;如D:\Ope…

【已解决】TypeError: AsyncConnectionPool.__init__(), new install bug, httpx==0.24.1

1&#xff0c;参考社区链接&#xff0c;首先降低gradio版本&#xff0c;降低到4以下&#xff0c;但是也不能降太低&#xff0c;也不能太高&#xff0c;要适中&#xff0c;推荐版本3.39.0 pip install gradio3.39.0 2&#xff0c;下载正确的httpx版本 参考社区链接&#xff0…

清华大学KVCache.AI团队联合趋境科技联合的KTransformers开源项目为什么那么厉害

KTransformers是一个由清华大学KVAV.AI团队开发的开源项目&#xff0c;旨在优化大语言模型&#xff08;LLM&#xff09;的推理性能&#xff0c;特别是在有限显存资源下运行大型模型。以下是KTransformers的详细介绍&#xff1a; 1. 核心特点 高性能优化&#xff1a;KTransfor…

matlab模拟风场的随机脉动风

1、内容简介 matlab137-模拟风场的随机脉动风 可以交流、咨询、答疑 2、内容说明 略 模拟风场的随机脉动风&#xff0c;并进行相关的统计分析和计算&#xff0c;包括风速谱、空间相关性、自谱、互谱、以及POD&#xff08;Proper Orthogonal Decomposition&#xff09;分解等…

Code::Blocks 创建 C 项目 二

Code::Blocks 创建 C 项目 二 Code::Blocks 安装请看 Code::Blocks 安装 启动 Code Blocks 选择 Create a new project 弹出界面选择 Projects -> Console application -> Go 选择 C &#xff1a;表示创建的是 C 语言项目 点击 Next Project title&#xff1a;项目名 …

Javascript网页设计案例:通过PDF.js实现一款PDF阅读器,包括预览、页面旋转、页面切换、放大缩小、黑夜模式等功能

前言 目前功能包括&#xff1a; 切换到首页。切换到尾页。上一页。下一页。添加标签。标签管理页面旋转页面随意拖动双击后还原位置 其实按照自己的预期来说&#xff0c;有很多功能还没有开发完&#xff0c;配色也没有全都搞完&#xff0c;先发出来吧&#xff0c;后期有需要…

【IoTDB 线上小课 11】为什么 DeepSeek 要选择开源?

新年新气象&#xff0c;【IoTDB 视频小课】第十一期全新来临&#xff01; 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源... 一个问题重点&#xff0c;3-5 分钟&#xff0c;我们讲给你听&#xff1a; 开源“加成”再次展现&#xff01; 现在…

【ESP32】ESP-IDF开发 | WiFi开发 | HTTPS服务器 + 搭建例程

1. 简介 1.1 HTTPS HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;全称安全套接字层超文本传输协议&#xff0c;一般理解为HTTPSSL/TLS&#xff0c;通过SSL证书来验证服务器的身份&#xff0c;并为浏览器和服务器之间的通信…

ollama离线环境部署deepseek及对话网站开发

ollama离线环境部署deepseek及局域网对话网站开发 需要在离线环境下面部署deepseek大模型&#xff0c;而且局域网内用户能在浏览器直接对话&#xff0c;主机的操作系统是win10 经不断探索&#xff0c;找到一条能走通的路&#xff0c;大致流程和思路如下&#xff1a; 局域网服…

【Unity】 HTFramework框架(六十)Assistant助手(在Unity中接入DeepSeek等AI语言大模型)

更新日期&#xff1a;2025年2月14日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Assistant助手安装Ollama使用Assistant&#xff08;在编辑器中&#xff09;打开Assistant配置Assistant使用Assistant处理Assistant回复的内容使用推理大…

Spring AI集成DeepSeek,实现流式输出

前面一篇文章我们实现了《Spring AI集成DeepSeek&#xff1a;三步搞定Java智能应用》&#xff0c;大模型的响应速度是很慢的&#xff0c;为了提升用户体验&#xff0c;我们通常会使用流式输出一点点将结果输出给用户。先看下效果&#xff1a; 在 SpringBoot 中实现流式输出可以…

搭建一个经典的LeNet5神经网络

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络 一、LeNet-5背景 LeNet-…

DeepSeek-R1:通过强化学习激励大型语言模型的推理能力

摘要 我们介绍了第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个通过大规模强化学习(RL)训练而成的模型,无需监督微调(SFT)作为初步步骤,展示了卓越的推理能力。通过RL,DeepSeek-R1-Zero自然涌现出许多强大而有趣的推理行为。然而,它也面临诸如…

Unity 编辑器热更C# FastScriptReload

工具源码&#xff1a;https://github.com/handzlikchris/FastScriptReload 介绍 用于运行时修改C#后能快速重新编译C#并生效&#xff0c;避免每次改C#&#xff0c;unity全部代码重新编译&#xff0c;耗时旧且需要重启游戏。 使用 需要手动调整AssetPipeline自动刷新模式&…

DeepSeek在linux下的安装部署与应用测试

结合上一篇文章&#xff0c;本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型&#xff0c;主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署&#xff0c;Open WebUI官网也提供了完整的docker部署说明&#xff0c;大家可…

VNC远程控制Mac

前言 macOS系统自带有VNC远程桌面&#xff0c;我们可以在控制端上安装配置VNC客户端&#xff0c;以此来实现远程控制macOS。但通常需要在不同网络下进行远程控制&#xff0c;为此&#xff0c;我们可以在macOS被控端上使用cpolar做内网穿透&#xff0c;映射VNC默认端口5…

计算机视觉:卷积神经网络(CNN)基本概念(一)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…