Java:PDF图片抽取的两种方法

        图片和PDF是我们日常生活和工作中经常接触到的文档格式。PDF是人们日常使用最多的跨平台文档,是一种用独立于应用程序、硬件、操作系统的方式呈现文档的文件格式。每个PDF文件包含固定布局的平面文档的完整描述,包括文本、字形、图形及其他需要显示的信息。然而,从图片或PDF中提取出关键内容并不是一件简单的事情。

        最近开发项目需要抽取PDF中的图片,做了一些研究,记录一下!PDF中的图片分为两种,一种是传统意义上的图片,可以直接进行抽取;另一种是各种图形的组合,这种图片不能够直接进行抽取。

1、方法一:可以直接从PDF中抽取的图片

1.1 Maven引入

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version><type>jar</type>
</dependency>

1.2 代码
 

public static List<String> extractImage(String pdfPath,Integer pdfPage,String picPath) {FileInputStream fis = null;PDDocument document = null;List<String> imageUrls = new ArrayList<>();try {File file = new File( picPath);if (!file.exists()) {file.mkdirs();}// 打开pdf文件流fis = new FileInputStream(pdfPath);// 加载 pdf 文档,获取PDDocument文档对象document = PDDocument.load(fis);PDPage page = document.getPage(pdfPage);PDResources resources = page.getResources();Iterable<COSName> xObjectNames = resources.getXObjectNames();int i = 1;if (xObjectNames != null){Iterator<COSName> iterator = xObjectNames.iterator();while (iterator.hasNext()){COSName key =  iterator.next();if (resources.isImageXObject(key)){PDImageXObject image = (PDImageXObject) resources.getXObject(key);BufferedImage bImage = image.getImage();String imageUrl = picPath + File.separator + pdfPage + "-" + i + "."+ image.getSuffix();ImageIO.write(bImage, image.getSuffix(), new File(imageUrl));imageUrls.add(imageUrl);}i++;}}fis.close();document.close();} catch (Exception e) {e.printStackTrace();System.out.println("有异常图片");}return imageUrls;}

2、方法二:图形的组合,截图

2.1 Maven引入

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.17</version>
</dependency>

2.2 代码 

 /*** 将PDF文档拆分成多张图片,并返回所有图片的路径** @param pdfPath* @param pictureFolderPath* @return* @throws Exception*/public static List<String> pdfSwitchToPicture(String pdfPath, String pictureFolderPath,Integer startPage,Integer endPage) {List<String> picUrlList = new ArrayList<>();File file = new File(pictureFolderPath);if (!file.exists()) {file.mkdirs();}try {List<byte[]> imageList = handlePdf(pdfPath,startPage,endPage);AtomicInteger pictureNameNumber = new AtomicInteger(startPage);for (byte[] image : imageList) {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byteArrayOutputStream.write(image);String pictureUrl = file.getAbsolutePath() + File.separator + pictureNameNumber.getAndIncrement() + ".jpg";byteArrayOutputStream.writeTo(new FileOutputStream(pictureUrl));picUrlList.add(pictureUrl);byteArrayOutputStream.close();}} catch (Exception e) {throw new RuntimeException(e);}return picUrlList;}/*** 处理PDF文档** @param pdfPath* @return* @throws Exception*/public static List<byte[]> handlePdf(String pdfPath,Integer startPage,Integer endPage) throws Exception {File pdfFile = new File(pdfPath);//加载PDF文档PDDocument pdDocument = PDDocument.load(pdfFile);//创建PDF渲染器PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);int pageNum = endPage!=null ? endPage : pdDocument.getNumberOfPages();List<byte[]> list = new ArrayList<>();for (int i = startPage-1; i < pageNum; i++) {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//将PDF的每一页渲染成一张图片BufferedImage image = pdfRenderer.renderImage(i);ImageIO.write(image, "jpg", outputStream);list.add(outputStream.toByteArray());outputStream.close();}pdDocument.close();return list;}

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

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

相关文章

如何利用HubSpot海外获客系统实现海外市场扩张?

在当今全球化的时代&#xff0c;企业面临着越来越激烈的竞争&#xff0c;而海外市场则被视为获取更多增长机会的重要途径之一。针对这一挑战&#xff0c;企业需要建立一个完整的海外获客系统&#xff0c;而HubSpot软件的应用则成为了关键。作为HubSpot的合作伙伴&#xff0c;我…

librtmp源码分析

阅读了librtmp的源码&#xff0c;简单记录下。 首先补充下AMF格式基本知识 1 AMF格式 AMF是Action Message Format(动作消息格式)的简写&#xff0c;它是一种二进制的数据格式。它的设计是为了把actionscript里面的数据(包括Object, Array, Boolean, Number等)序列化成二进制…

jvm 基础知识和jvm 调优

类装载分为以下 5 个步骤&#xff1a; 加载&#xff1a;根据查找路径找到相应的 class 文件然后导入&#xff1b; 检查&#xff1a;检查加载的 class 文件的正确性&#xff1b; 准备&#xff1a;给类中的静态变量分配内存空间&#xff1b; 解析&#xff1a;虚拟机将常量池中的符…

C# 异步返回类型详解

在现代软件开发中&#xff0c;异步编程已经成为一种重要的编程范式&#xff0c;尤其是在需要与I/O密集型操作交互的上下文中&#xff0c;比如网络请求、数据库操作等。C# 语言提供了强大的异步支持&#xff0c;使得异步编程变得更加简单和直观。本文将详细介绍C#中异步返回类型…

vue3学习 【5】watch的使用

什么是watch 当我们需要根据一个数据的变化来进行一些操作的时候我们需要使用侦听器&#xff0c;它能够在响应式数据发生变化的时候触发提供的回调函数 基础侦听 watch 可以侦听不同的数据源。例如&#xff1a; ref计算属性响应式对象getter函数多个数据源组层的数据 cons…

20240229金融读报:央行阿拉善创新融资模式与碳排放权交易条例实施,新春政策聚焦新生产力及金融风险防范

1、人民银行阿拉善盟分行实例&#xff1a;再贷款产业链&#xff08;活体牲畜抵押贷款牲畜死亡率保险&#xff09;、“再贷款新型农牧业经营主体”&#xff08;基础设施薄弱、产业结构单一&#xff0c;筹集资金创办嘎查集体经济股份合作社贷款&#xff09; 2、建设银行实例&…

oracle11安装及使用

安装oracle11 官网下载地址 Oracle Database 11g Release 2 for Microsoft Windows (x64) 官网下载慢可访问我的资源 也可以网盘获取 链接&#xff1a;https://pan.baidu.com/s/1RDrGkqDA7tfKRnpJXUBMDw 提取码&#xff1a;z3na 上传安装包到服务器 在指定目录下创建文件…

adb命令

1. 常用命令&#xff1a; adb devices #查看连接设备adb -s cf27456f shell # 指定连接设备使用命令adb install test.apk # 安装应用adb install -r demo.apk #安装apk 到sd 卡&#xff1a;adb uninstall cn.com.test.mobile #卸载应用&#xff0c;需要指定包adb uninstall -…

Windows系统x86机器安装龙芯(loongarch64)3A5000虚拟机系统详细教程

本次介绍在window系统x86机器上安装loongarch64系统的详细教程。 1.安装环境准备。 首先&#xff0c;你得有台电脑。 配置别太差&#xff0c;至少4核8G内存&#xff0c;安装window10或者11都行&#xff08;为啥不能是Window7&#xff0c;你要用也不是不行&#xff0c;你先解决…

leetcode:860.柠檬水找零

题意&#xff1a;按照支付顺序&#xff0c;进行支付&#xff0c;能够正确找零。 解题思路&#xff1a;贪心策略&#xff1a;针对支付20的客人&#xff0c;优先选择消耗10而不是消耗5&#xff0c;因为5可以用来找零10或20. 代码实现&#xff1a;有三种情况&#xff08;代表三种…

vscode中使用python的cv2.imread()读取图片为None

这是之前的代码&#xff1a; import cv2img_path c:\\Users\\LENOVO\\Desktop\\QQ截图20240228234801.jpg print(img_path) print(cv2.__version__)img cv2.imread(img_path) print(img)运行结果&#xff1a; c:\Users\LENOVO\Desktop\QQ截图20240228234801.jpg 3.4.1 None…

Linux下主线程 return 0 和 pthread_exit(NULL) 的区别

1. 背景 在Linux环境下&#xff0c;主线程以return 0结束时&#xff0c;程序会在主线程运行完毕后结束。而当主线程以pthread_exit(NULL)作为返回值时&#xff0c;主线程会等待子线程结束后才会退出程序。本文将详细探讨这两种方式的区别&#xff0c;并提供相应的代码示例。 …

String类的使用

String常用的构造方法 String的源码 内部是一个数组和hash值&#xff0c;涉及到常量池后续补充&#xff08;常量池&#xff1a;存储相同的字符时只会存储一租&#xff09; String的比较 equals()与&#xff1a;String里面为我们提供了许多方法&#xff0c;可直接调用&#xf…

2024最新-ubuntu22.04安装最新版QT6.6~6.8教程

​ 1. 在官网下载 online_installer&#xff1a; https://download.qt.io/archive/online_installers/4.7/qt-unified-linux-x64-4.7.0-online.run 或者直接镜像站下载&#xff1a; http://mirrors.ustc.edu.cn/qtproject/archive/online_installers/4.7/qt-unified-linux-x6…

数据结构之二叉树的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

苹果汽车项目的败局:起步失误与方向迷茫

苹果汽车的发展方向内部分歧导致项目多年挣扎&#xff0c;最终在本周宣布终止。 Brian X. Chen 和 Tripp Mickle 从项目初期就开始关注苹果的汽车项目。 在过去十年中&#xff0c;许多参与苹果秘密汽车项目“泰坦”&#xff08;内部代号&#xff09;的员工戏称其为“泰坦尼克…

Python实现链表:从基础到应用

一、引言 链表是一种常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。链表在内存中的存储不是连续的&#xff0c;这使得它在插入和删除操作上具有较高的效率。本文将使用Python语言来实现一个简单的链表&#xff0c;并展示其…

【前端面试题1】伪类与伪元素有什么区别

伪类与伪元素的区别&#xff1a; 1.伪类使用单冒号&#xff0c;而伪元素使用双冒号。如 :hover 是伪类&#xff0c;::before 是伪元素 2.伪元素会在文档流生成一个新的元素&#xff0c;但伪元素本身并不是DOM元素&#xff0c;并且可以使用 content 属性设置内容 CSS伪类与伪元…

卷积神经网络基本概念补充

卷积&#xff08;convolution&#xff09;、通道&#xff08;channel&#xff09; 卷积核大小一般为奇数&#xff0c;有中心像素点&#xff0c;便于定位卷积核。 步长&#xff08;stride&#xff09;、填充&#xff08;padding&#xff09; 卷积核移动的步长&#xff08;stride…

小白提示您:FaceTime诈骗持续高发,小伙伴们谨防诈骗!

前几天小白的iPhone突然接到了个FaceTime通话请求&#xff0c;说是某抖音账号需要续费啥的才能解锁某些功能。&#xff08;具体小白也记不太清了&#xff09; 这几天也有朋友说有个支付宝客服打FaceTime通话给他说快递出现了点问题&#xff0c;需要操作认证一下才能退款啥的。…