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.pswp.cn/news/712135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712135.shtml
英文地址,請注明出處:http://en.pswp.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;需要操作認證一下才能退款啥的。…