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

kkFileView二开之pdf转图片接口

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;@Autowiredprivate OfficeToPdfService officeToPdfService;@Autowiredprivate FileHandlerService fileHandlerService;private static final String FILE_DIR = ConfigConstants.getFileDir();/*** pdf转换为图片* @param req* @param rep* @param file*/@PostMapping("/pdf2Image")@ResponseBodypublic 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二开之源码编译及部署】 文档中,【部署】目录下的方式,根据部署的平台选择合适的方式进行部署。

相关文章:

kkFileView二开之pdf转图片接口

kkFileView二开之Pdf转图片接口 kkFileView二开系列文章&#xff1a;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二开系列文章&#x…...

利用亚马逊云科技RDS for SQL Server配置向量数据存储

生成式人工智能&#xff08;AI&#xff09;正迎来又一个快速发展期&#xff0c;引起了开发者们的广泛关注。将生成式能力集成到商业服务和解决方案中变得非常重要。当前的生成式AI解决方案是机器学习和深度学习模型逐步进化迭代的结果。从深度学习到生成式AI的质变飞跃主要是由…...

vLLM 部署 DeepSeek 大模型避坑指南

本文基于实战经验&#xff0c;提供从环境准备到性能调优的全流程避坑指南。 一、环境准备&#xff1a;驱动与硬件兼容性 1. NVIDIA 驱动与 CUDA 版本对齐 确保NVIDIA驱动和CUDA版本相互匹配是关键。例如&#xff0c;CUDA 12.x需要至少525.60的驱动版本。 # 使用 nvidia-smi…...

本地部署MindSearch(开源 AI 搜索引擎框架),然后上传到 hugging face的Spaces——L2G6

部署MindSearch到 hugging face Spaces上——L2G6 任务1 在 官方的MindSearch页面 复制Spaces应用到自己的Spaces下&#xff0c;Space 名称中需要包含 MindSearch 关键词&#xff0c;请在必要的步骤以及成功的对话测试结果当中 实现过程如下&#xff1a; 2.1 MindSearch 简…...

【大模型系列】Windows系统上运行大语言模型方式

在Windows系统上运行大语言模型&#xff08;LLMs&#xff09;有多种方式&#xff0c;以下是一些具体的方法&#xff1a; GPT4All 简介&#xff1a;GPT4All是一个适用于所有操作系统的LLM框架和聊天机器人应用程序&#xff0c;可以本地运行LLMs&#xff0c;并通过API将其与任何…...

Linux Mem -- Where the mte store and check in the real hardware platform

目录 1 前言 2 MTE tag分类 3 Address tag 4 Memory tag 5 Tag Check 6 Cortex-A710 和 CI-700 系统示例&#xff1a; 1 前言 ARM的MTE允许分配、设置、比较一个 4bit的allocation tag 为16字节粒度的物理地址。当对MTE有一定了解后&#xff0c;应该会产生如下疑问&#…...

连锁企业管理系统的五大核心功能

连锁管理系统对于连锁企业的运营和发展至关重要&#xff0c;以下以核货宝连锁管理系统为例&#xff0c;介绍其五大核心功能&#xff1a; 门店管理功能 门店信息管理&#xff1a;核货宝连锁管理系统可集中管理所有门店的详细信息&#xff0c;包括门店地址、联系方式、营业时间、…...

Docker配置镜像加速-解决黑马商城部署Mysql失败问题

随着 Docker 在容器化应用中的广泛应用&#xff0c;越来越多的开发者选择通过 Docker 来简化开发和部署过程。然而&#xff0c;在使用 Docker 部署应用时&#xff0c;有时会遇到因为镜像下载速度慢或者 MySQL 部署失败等问题&#xff0c;特别是在中国地区&#xff0c;由于网络环…...

Cherno C++ P54 内存:栈与堆

这篇文章我们来谈论一下计算机的内存。在这里&#xff0c;我们着重讨论内存的两个部分&#xff1a;栈与堆。我们需要注意的一点是&#xff0c;这两个概念不是虚拟的&#xff0c;而是在计算机内部真实存在的。它们是我们的CPU当中RAM部分物理上存在的两个区域。我们之所以要重点…...

对项目交接的一些思考

天下大势&#xff0c;分久必合合久必分。这些年交接了很多项目&#xff0c;也从别人那里接手了很多项目。最近又接收了一些项目&#xff0c;但团队接收的效果不是很好&#xff0c;或者说掌握的不全面&#xff0c;所以就在想怎么能够做的更好一些&#xff1f; 团队关系 其实我…...

【PYTORCH】官方的turoria实现中英文翻译

参考 https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html 背景 pytorch官方的是seq2seq是法语到英文&#xff0c;做了一个中文到英文的。 数据集 下载后解压&#xff0c;使用的data\testsets\devset\UNv1.0.devset.zh和UNv1.0.devset.en&#x…...

【算法与数据结构】并查集详解+题目

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…...

【动态路由】系统web url整合系列【springcloud-gateway实现】【不改hosts文件版】组件一:多个Eureka路由过滤器

需求 实现URL web资源整合&#xff0c;实现使用一个web地址访问多个web资源 方案 本方案使用SpringCloud Gateway实现&#xff0c;不需要在hosts文件加添加域名映射&#xff08;也不需要定义一系列域名&#xff09;&#xff0c;通过url路径来将请求转发到不同的Web资源 如&…...

Mybatis-扩展功能

逻辑删除乐观锁 MyBatisPlus从入门到精通-3&#xff08;含mp代码生成器&#xff09; Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解&#xff0c;很不灵活 希望用枚举类来代替这个Integer 这样的话我…...

基于SpringBoot实现的大学社团平台系统实现功能六

一、前言介绍&#xff1a; 1.1 项目摘要 随着高校社团活动的日益丰富和多样化&#xff0c;学生对于社团管理和参与的需求也在不断增加。传统的社团管理方式往往存在效率低下、信息不透明等问题&#xff0c;无法满足现代学生对于便捷、高效社团管理的需求。因此&#xff0c;利…...

电子电气架构 --- 机器学习推动车载雷达的发展

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

python从入门到进去

python从入门到进去 第一章、软件和工具的安装一、安装 python 解释器二、安装 pycharm 第二章、初识 python一、注释可分三种二、打印输入语句三、变量1、基本数据类型1.1、整数数据类型 int1.2、浮点数数据类型 float1.3、布尔数据类型 boolean1.4、字符串数据类型 string 2、…...

智能化客户画像构建管理:AI视频监控在大型商场的技术

前言&#xff1a;某商家为了优化卖场服务与营销策略&#xff0c;希望通过非侵入式手段获取客户画像&#xff0c;不仅可以帮助卖场提升服务质量、优化营销策略&#xff0c;还能通过数据驱动的方式提升销售业绩和顾客满意度&#xff0c;为卖场的长期发展奠定坚实的基础。 具体需求…...

php 拼接字符串

php 拼接字符串 .连字符"Hello, $name" 双引号内会解析变量"Hello, {$name}Doe" 使用花括号可以更明确标识变量名sprintf("Hello, %s", $name) 使用sprintfheredoc语法&#xff0c;同样支持变量的解析$html <<<EOT <p>Hello, $…...

Deepseek实用万能提问模板

一&#xff0c;背景需求约束条件 背景:提供与问题相关的时间、地点、人物、事件等信息&#xff0c;帮助 DeepSeek 更好地理解问题的情境。 需求:清晰明确地阐述你希望 DeepSeek完成的任务或提供的信息。 约束条件:可根据具体情况&#xff0c;对回答的范围、格式、字数等进行…...

采购成本总是说不清?怎么打造让老板一眼看透的采购成本地图?

每100元营收中&#xff0c;就有超过60元经由采购之手花出去。 然而&#xff0c;辛辛苦苦一年&#xff0c;到了年底&#xff0c;采购最常听到的却是…… “钱到底花哪了&#xff1f;” “还能再降降吗&#xff1f;” 只有采购人员知道&#xff0c;各项费用成本明细分散在纸质合同…...

特朗普家族涉足AI,WorldRouter平台能否打破AI模型使用价格壁垒?

5月5日&#xff0c;与特朗普及其家族密切相关的加密货币公司WLFI&#xff0c;联合WorldClaw推出AI模型路由平台WorldRouter&#xff0c;可用加密货币结算模型token&#xff0c;还提供优惠。这会是一门好生意吗&#xff1f;平台亮点&#xff1a;功能丰富且价格诱人WorldRouter酷…...

GetQzonehistory:一站式自动化QQ空间历史数据备份解决方案

GetQzonehistory&#xff1a;一站式自动化QQ空间历史数据备份解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益重要的今天&#xff0c;如何安全高效地备份个人社交…...

明日方舟全自动小助手:解放双手的终极效率工具

明日方舟全自动小助手&#xff1a;解放双手的终极效率工具 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode.co…...

MicroG在HarmonyOS系统上的兼容性挑战与解决方案

MicroG在HarmonyOS系统上的兼容性挑战与解决方案 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore MicroG作为一个开源的Google移动服务替代框架&#xff0c;为没有原生Google Play服务的Andr…...

如何在10分钟内掌握自动化操作?告别重复工作的新选择

如何在10分钟内掌握自动化操作&#xff1f;告别重复工作的新选择 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 你是否曾在…...

基于kubeadm-playbook快速部署生产级Kubernetes集群实战指南

1. 项目概述与核心价值如果你正在寻找一种能让你在十分钟内&#xff0c;从几台裸机或虚拟机开始&#xff0c;得到一个功能齐全、生产就绪的Kubernetes集群的方法&#xff0c;那么你找对地方了。kubeadm-playbook这个Ansible项目&#xff0c;正是为了解决“从零到一”部署K8s集群…...

HarmonyOS内嵌浏览器实战:ArkWeb组件从入门到混合开发

文章目录一、项目概述二、核心概念解析2.1 用生活比喻理解核心概念2.2 两种混合开发模式三、架构与流程图四、核心代码逐行讲解4.1 基础用法&#xff1a;加载网页4.2 监听页面事件4.3 原生调用网页 JavaScript&#xff08;runJavaScript&#xff09;4.4 网页调用原生代码&#…...

自动化代码审查机器人:从原理到实战,提升团队研发效能

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“xmanrui/OpenClaw-bot-review”。光看名字&#xff0c;你可能会有点懵——“OpenClaw”是啥&#xff1f;“bot-review”又是干嘛的&#xff1f;这其实是一个专注于自动化代码审查的机器人项目。简单…...

astral-sh发布的musl和gnu版本standalone python 性能比较

musl版本standalone python在wsl默认的ubuntu中无法运行。说是找不到文件&#xff0c;其实文件就在那里 C:\d>wget https://mirror.nju.edu.cn/github-release/astral-sh/python-build-standalone/LatestRelease/cpython-3.14.5rc1%2B20260504-x86_64-unknown-linux-musl-in…...