JAVA 实现PDF转图片(pdfbox版)

依赖:

pdf存放路径

正文开始:

pdf转换多张图片、长图

@Test
void pdf2Image() {
        String dstImgFolder = "";
        String PdfFilePath = "";
 
        String relativelyPath=System.getProperty("user.dir");
        PdfFilePath = relativelyPath + "/uploadTest/"+"文档.pdf";
        dstImgFolder = relativelyPath + "/uploadTest/";
        /* dpi越大转换后越清晰,相对转换速度越慢 */
        int dpi = 450;
        File file = new File(PdfFilePath);
        PDDocument pdDocument; // 创建PDF文档
        try {
            String imgPDFPath = file.getParent();
            int dot = file.getName().lastIndexOf('.');
            String imagePDFName = file.getName().substring(0, dot); // 获取图片文件名
            String imgFolderPath = null;
            if (dstImgFolder.equals("")) {
                imgFolderPath = imgPDFPath + File.separator;// 获取图片存放的文件夹路径
            } else {
                imgFolderPath = dstImgFolder + File.separator;
            }
            if (createDirectory(imgFolderPath)) {
                pdDocument = PDDocument.load(file);
                PDFRenderer renderer = new PDFRenderer(pdDocument);
                PdfReader reader = new PdfReader(PdfFilePath);
                int pages = reader.getNumberOfPages();
                StringBuffer imgFilePath = null;
               BufferedImage[] bufferedImages = new BufferedImage[pages];
                for (int i = 0; i < pages; i++) {
                    String imgFilePathPrefix = imgFolderPath + File.separator;
                    imgFilePath = new StringBuffer();
                    imgFilePath.append(imgFilePathPrefix);
                    imgFilePath.append("_");
                    imgFilePath.append(i + 1);
                    imgFilePath.append(".png");
                    // File dstFile = new File(imgFilePath.toString());
                    BufferedImage image = renderer.renderImageWithDPI(i, dpi);
                   bufferedImages[i] = image;
                    // ImageIO.write(image, "png", dstFile);
                }
                dstImgFolder = dstImgFolder + imagePDFName + ".png";
                // PDF文件全部页数转PNG图片,若多张展示注释即可 工具类贴在下面
               ImageMergeUtil.mergeImage(bufferedImages, 2, dstImgFolder);
                System.out.println("PDF文档转PNG图片成功!");
            } else {
                System.out.println("PDF文档转PNG图片失败:" + "创建" + imgFolderPath + "失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    private static boolean createDirectory(String folder) {
        File dir = new File(folder);
        if (dir.exists()) {
            return true;
        } else {
            return dir.mkdirs();
        }
    }

// ImageMergeUtil 图片的合并,多张图片合成长图
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
 
public class ImageMergeUtil {
    public static void main(String[] args) throws IOException {
        String filePath = "D:\\temp\\ImageMergeUtil\\";
        String path1 = filePath + "a.png";
        String path2 = filePath + "b.png";
        mergeImage(path1, path2,  2, filePath+"c.png");
    }
 
    /**
     * 图片拼接
     * @param path1     图片1路径
     * @param path2     图片2路径
     * @param type      1 横向拼接, 2 纵向拼接
     * (注意:必须两张图片长宽一致)
     */
    public static void mergeImage( String path1, String path2, int type, String targetFile) throws IOException {
        File file1 = new File(path1);
        File file2 = new File(path2);
        //两张图片的拼接
        int len = 2;
        BufferedImage[] images = new BufferedImage[len];
        images[0] = ImageIO.read(file1);
        images[1] = ImageIO.read(file2);
        mergeImage(images, type, targetFile);
 
    }
 
    /**
     * 图片拼接
     * @param images     图片数组
     * @param type      1 横向拼接, 2 纵向拼接
     * (注意:必须两张图片长宽一致)
     */
    public static void mergeImage(BufferedImage[] images, int type, String targetFile) throws IOException {
        int len = images.length;
        int[][] ImageArrays = new int[len][];
 
        for (int i = 0; i < len; i++) {
            int width = images[i].getWidth();
            int height = images[i].getHeight();
            ImageArrays[i] = new int[width * height];
            ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width);
        }
        int newHeight = 0;
        int newWidth = 0;
        for (int i = 0; i < images.length; i++) {
            // 横向
            if (type == 1) {
                newHeight = newHeight > images[i].getHeight() ? newHeight : images[i].getHeight();
                newWidth += images[i].getWidth();
            } else if (type == 2) {// 纵向
                newWidth = newWidth > images[i].getWidth() ? newWidth : images[i].getWidth();
                newHeight += images[i].getHeight();
            }
        }
        if (type == 1 && newWidth < 1) {
            return;
        }
        if (type == 2 && newHeight < 1) {
            return;
        }
        // 生成新图片
        try {
            BufferedImage ImageNew = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
            int height_i = 0;
            int width_i = 0;
            for (int i = 0; i < images.length; i++) {
                if (type == 1) {
                    ImageNew.setRGB(width_i, 0, images[i].getWidth(), newHeight, ImageArrays[i], 0,
                            images[i].getWidth());
                    width_i += images[i].getWidth();
                } else if (type == 2) {
                    ImageNew.setRGB(0, height_i, newWidth, images[i].getHeight(), ImageArrays[i], 0, newWidth);
                    height_i += images[i].getHeight();
                }
            }
 
            //输出想要的图片
            ImageIO.write(ImageNew, "png", new File(targetFile));
        } catch (Exception e) {
 
            e.printStackTrace();
        }
    }

展示效果:

附加:小程序预览wxml代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4.4 多态

思维导图&#xff1a; 4.4 多态 在深入研究对象的世界后&#xff0c;我们已经学到了封装和继承。接下来&#xff0c;我们要讨论的是面向对象编程的另一个核心概念&#xff1a;多态。 4.4.1 多态概述 多态是面向对象的三大特性之一&#xff0c;它允许我们以统一的方式处理不同…

518抽奖软件,可从Excel~Word~Pdf~网页导入名单

518抽奖软件简介 518抽奖软件&#xff0c;518我要发&#xff0c;超好用的年会抽奖软件&#xff0c;简约设计风格。 包含文字号码抽奖、照片抽奖两种模式&#xff0c;支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 从Excel、WPS表格导入 整列&#xff1a; 用鼠…

Vue路由(router)的安装和使用

Vue路由&#xff08;router&#xff09;的安装和使用 安装vue-router插件 第一步&#xff1a;在CMD窗口中&#xff0c;使用命令跳转到vue的安装路径下第二步&#xff1a;输入命令&#xff1a;npm i vue-router3 vue2 要安装 vue-router3 npm i vue-router3 vu3 要安装 vue-ro…

如何使用IP归属地查询API加强网络安全

目录 一、背景与意义 二、IP归属地查询API加强网络安全的方式 三、IP归属地API的使用教程 四、实际代码示例 五、结合其他安全技术加强网络安全 六、注意事项 总结 一、背景与意义 在数字化的今天&#xff0c;网络安全问题变得尤为重要。企业、组织乃至个人都面临着网络…

MacBook终端安装tree命令(保证好使)

1. 首先在终端安装brew 由于mac是没有原生支持tree命令的&#xff0c;所以我们在安装tree命令之前&#xff0c;先安装brew。 先输入下面命令&#xff0c;安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)…

CRM系统如何帮助大客户销售

我们知道大客户都具备这样的特点&#xff1a;对企业价值高、成交难度大、成单周期长&#xff0c;因此这一部分客户需要销售团队投入更多的时间和精力。大客户销售如何利用好CRM系统更大程度地挖掘大客户价值&#xff1f;关键还在于维护好客户生命周期。 销售人员想要拿下大客户…

综合实验案例配置

目录 核心交换机与出口路由器的连接 网络出口的配置 策略路由的配置 1.教学楼的流量走电信出口&#xff0c;宿舍楼流量走联通出口&#xff08;基于源&#xff09; 2.访问带内心的服务器走电信出口&#xff0c;访问联通服务器走联通出口 案例图如下&#xff1a; acsw的配置…

RecyclerView在点击事件的处理上也优于ListView

主要是细节的支持&#xff0c;ListView直接提供setOnItemClickListener,而RecyclerView没有&#xff0c;是因为RV考虑的更细节&#xff0c;比如我要点击条目上的某个图标生效&#xff0c;使用ListView会很难实现&#xff0c;但是RV实现会很容易&#xff0c;直接在适配器中由Vie…

【进阶C语言】数组笔试题解析

本节内容以刷题为主&#xff0c;大致目录&#xff1a; 1.一维数组 2.字符数组 3.二维数组 学完后&#xff0c;你将对数组有了更全面的认识 在刷关于数组的题目前&#xff0c;我们先认识一下数组名&#xff1a; 数组名的意义&#xff1a;表示数组首元素的地址 但是有两个例外…

Kubernetes·陈述式声明式资源管理

目录 k8s陈述资源管理方法的说明 陈述式资源管理方法 声明式资源管理方法 GUI式资源管理方法 kubectl命令行工具 的说明 查看版本信息 查看资源对象简写 查看集群信息 配置kubectl自动补全 node节点查看日志 k8s基本信息查看 查看 master 节点状态 查看命名空间 …

【MySQL】MySQL的安装与配置环境变量(使其在控制台上使用)

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

sqlite3 关系型数据库语言 SQL 语言

SQL(Structured Query Language)语言是一种结构化查询语言,是一个通用的,功能强大的关系型数据库操作语言. 包含 6 个部分: 1.数据查询语言(DQL:Data Query Language) 从数据库的二维表格中查询数据,保留字 SELECT 是 DQL 中用的最多的语句 2.数据操作语言(DML) 最主要的关…

【Git企业开发】第四节.Git的分支管理策略和bug分支

文章目录 前言一、Git的分支管理策略 1.1 Fast forward 模式和--no-ff 模式 1.2 企业分支管理策略二、bug分支三、删除临时分支四、总结总结 前言 一、Git的分支管理策略 1.1 Fast forward 模式和--no-ff 模式 通常合并分支时&#xff0c;如果可能&#xff0c;Git 会…

Mac docker+vscode

mac 使用docker vs code 通过vscode 可以使用docker容器的环境。 可以在容器安装gdb, 直接调试代码。 创建容易时候可以指定目录和容易目录可以共享文件。

空气质量查询API促使空气数据可视化

引言 在当今的现代化社会中&#xff0c;关注和改善空气质量已成为人们共同的关切。随着科技的不断发展&#xff0c;空气质量查询API为我们提供了一种前所未有的方式来实时监测、分析和改善我们所处的环境。这一工具不仅让我们更深入地了解空气质量&#xff0c;还鼓励了空气数据…

Java如何使用KEPserver 实现S71500 OPC通信

一.PLC和OPC 使用的PLC&#xff1a;西门子PLC S7-1500 使用的OPC server软件&#xff1a; KEPServer V6 二.连接测试 OPC是工业控制和生产自动化领域中使用的硬件和软件的接口标准&#xff0c;以便有效地在应用和过程控制设备之间读写数据。O代表OLE(对象链接和嵌入)&am…

Qt 使用Quazip解压缩、压缩文件

1.环境搭建 Quazip&#xff0c;是在zlib基础上进行了简单封装的开源库&#xff0c;适用于多种平台&#xff0c;利用它可以很方便将单个或多个文件打包为zip文件&#xff0c;且打包后的zip文件可以通过其它工具打开。 下载Quazip QuaZIP download | SourceForge.net 解压后&…

cnpm windows系统安装后查看版本cnpm -v报错Error: Cannot find module ‘node:util‘

1、报错截图 2、原因 在网上查了一些资料&#xff0c;有的说配置环境变量就可以&#xff0c;但经过配置后发现还是会报错。又查到说是由于cnpm和npm的版本不一致导致的&#xff0c;最后尝试成功解决&#xff01;&#xff01;&#xff01; 2、解决办法 1、先卸载掉之前安装的c…

【扩散模型】理解扩散模型的微调(Fine-tuning)和引导(Guidance)

理解扩散模型的微调Fine-tuning和引导Guidance 1. 环境准备2. 加载预训练过的管线3. DDIM——更快的采样过程4. 微调5. 引导6. CLIP引导参考资料 微调&#xff08;Fine-tuning&#xff09;指的是在预先训练好的模型上进行进一步训练&#xff0c;以适应特定任务或领域的过程。这…

DSP 开发例程: 单镜像多核引导

目录 DSP 开发例程: 单镜像多核引导新建工程源码编辑multicore_boot.c config.hos.cmain.c测试 DSP 开发例程: 单镜像多核引导 此例程实现在 EVM6678L 开发板上将单镜像应用程序进行多核引导, 核0-核4 分别控制一个LED 闪烁, 并通过串口打印日志信息. 例程源码可从我的 gitee …