詳解如何通過Java實(shí)現(xiàn)壓縮PDF文檔
PDF文檔是我們?nèi)粘^k公中使用最頻繁的文檔格式。但因?yàn)榇蠖鄶?shù)PDF文檔都包含很多頁(yè)面圖像或大量圖片,這就導(dǎo)致PDF文檔過大,處理起來較為麻煩。PDF文件過大,就會(huì)導(dǎo)致傳輸或者下載的速度變慢,也會(huì)增加傳輸失敗的風(fēng)險(xiǎn),影響辦公效率。因此我們需要對(duì)PDF文檔進(jìn)行壓縮。本文將從以下兩方面介紹如何通過Java應(yīng)用程序壓縮PDF文檔。
在使用PDF文件過程中,經(jīng)常會(huì)出現(xiàn)由于體積過大導(dǎo)致文件傳輸失敗的情況。遇到這種情況,我們可以先將PDF文件壓縮一下再進(jìn)行傳輸。而除了壓縮文檔內(nèi)容以外,壓縮圖片是縮小PDF文檔的主要方法之一。本文將分為2部分分別介紹如何通過Java代碼壓縮PDF文檔。希望這篇文章能對(duì)大家有所幫助。
- 壓縮PDF文檔中的內(nèi)容及圖片
- 壓縮PDF文檔中的高分辨率圖片
引入jar包
導(dǎo)入方法1:
手動(dòng)引入。將Free Spire.PDF for Java下載到本地,解壓,找到lib文件夾下的Spire.PDF.jar文件。在IDEA中打開如下界面,將本地路徑中的jar文件引入Java程序:
導(dǎo)入方法2:如果您想通過Maven安裝,則可以在 pom.xml 文件中添加以下代碼導(dǎo)入 JAR 文件。
<repositories> <repository> <id>com.e-iceblue</id> <url>https://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf.free</artifactId> <version>5.1.0</version> </dependency> </dependencies>
壓縮PDF文檔中的內(nèi)容及圖片
壓縮PDF文檔中的內(nèi)容及圖片的詳細(xì)步驟如下:
- 創(chuàng)建 PdfDocument 類的對(duì)象。
- 使用 PdfDocument.loadFromFile() 方法加載 PDF 文檔。
- 使用 PdfDocument.getFileInfo().setIncrementalUpdate() 方法將增量更新設(shè)置為false。
- 使用 PdfDocument.setCompressionLevel() 方法將壓縮級(jí)別設(shè)置為最佳,以壓縮文檔中的內(nèi)容。 您可以從 PdfCompressionLevel 枚舉中選擇其他一些級(jí)別。
- 循環(huán)遍歷文檔中的頁(yè)面,使用 PdfPageBase.getImagesInfo() 方法獲取每個(gè)頁(yè)面的圖像信息集合。
- 遍歷集合中的所有項(xiàng)目,并使用 PdfBitmap.setQuality() 方法壓縮特定圖像的質(zhì)量。
- 使用 PdfPageBase.replaceImage() 方法將原始圖像替換為壓縮圖像。使用 PdfDocument.saveToFile() 方法將文檔保存到另一個(gè) PDF 文件。
完整代碼
import com.spire.pdf.PdfCompressionLevel; import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.exporting.PdfImageInfo; import com.spire.pdf.graphics.PdfBitmap; public class CompressPDFImage { public static void main(String[] args) { //創(chuàng)建 PdfDocument 類的對(duì)象。 PdfDocument doc = new PdfDocument(); //加載 PDF 文檔 doc.loadFromFile("測(cè)試文檔.pdf"); //將增量更新設(shè)置為false doc.getFileInfo().setIncrementalUpdate(false); //將壓縮級(jí)別設(shè)置為最佳 doc.setCompressionLevel(PdfCompressionLevel.Best); //循環(huán)遍歷文檔中的頁(yè)面 for (int i = 0; i < doc.getPages().getCount(); i++) { //獲取特定頁(yè)面 PdfPageBase page = doc.getPages().get(i); //獲取每個(gè)頁(yè)面的圖像信息集合 PdfImageInfo[] images = page.getImagesInfo(); //遍歷集合中的項(xiàng)目 if (images != null && images.length > 0) for (int j = 0; j < images.length; j++) { //獲取指定圖像 PdfImageInfo image = images[j]; PdfBitmap bp = new PdfBitmap(image.getImage()); //設(shè)置壓縮質(zhì)量 bp.setQuality(20); //用壓縮后的圖片替換原始圖片 page.replaceImage(j, bp); } //保存文件 doc.saveToFile("壓縮PDF文檔.pdf"); doc.close(); } } }
效果對(duì)比圖
壓縮 PDF 文檔中的高分辨率圖像
本方法僅對(duì)文檔中的高分辨率圖像進(jìn)行無損壓縮,而低分辨率的圖像將不再被壓縮。
- 創(chuàng)建 PdfDocument 類的對(duì)象。
- 使用 PdfDocument.loadFromFile() 方法加載 PDF 文檔。
- 使用 PdfDocument.getFileInfo().setIncrementalUpdate() 方法將 IncrementalUpdate 設(shè)置為 false。
- 聲明一個(gè) PdfPageBase 變量。
- 循環(huán)遍歷頁(yè)面并使用 PdfDocument.getPages().get() 方法獲取特定頁(yè)面。
- 循環(huán)遍歷頁(yè)面中的圖像。并使用 page.tryCompressImage(info.Index) 方法壓縮高分辨率圖像。
- 使用 PdfDocument.saveToFile() 方法將文檔保存到另一個(gè) PDF 文件。
完整代碼
import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.exporting.PdfImageInfo; public class CompressPDFImage { public static void main(String[] args) { //創(chuàng)建 PdfDocument 類的對(duì)象 PdfDocument doc = new PdfDocument //加載 PDF 文檔 doc.loadFromFile("示例文檔.pdf"); //將IncrementalUpdate設(shè)置為false doc.getFileInfo().setIncrementalUpdate(false); //聲明一個(gè) PdfPageBase 變量 PdfPageBase page; //循環(huán)遍歷頁(yè)面 for (int i = 0; i < doc.getPages().getCount(); i++) { //獲取指定頁(yè)面 page = doc.getPages().get(i); if (page != null) { if(page.getImagesInfo() != null){ //循環(huán)遍歷頁(yè)面中的圖像 for (PdfImageInfo info: page.getImagesInfo()) { //使用tryCompressImage方法壓縮高分辨率圖像 page.tryCompressImage(info.getIndex()); } } } } //保存文件 doc.saveToFile("輸出結(jié)果.pdf"); } }
效果對(duì)比圖
到此這篇關(guān)于詳解如何通過Java實(shí)現(xiàn)壓縮PDF文檔的文章就介紹到這了,更多相關(guān)Java壓縮PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中EasyExcel實(shí)現(xiàn)Excel文件的導(dǎo)入導(dǎo)出
這篇文章主要介紹了SpringBoot中EasyExcel實(shí)現(xiàn)Excel文件的導(dǎo)入導(dǎo)出,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Mybatis遷移到Mybatis-Plus的實(shí)現(xiàn)方法
這篇文章主要介紹了Mybatis遷移到Mybatis-Plus的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Java實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法,文中通過一個(gè)示例帶大家具體了解了實(shí)現(xiàn)的方法,需要的可以參考一下2022-08-08Java基礎(chǔ)學(xué)習(xí)之關(guān)鍵字和變量數(shù)據(jù)類型的那些事
變量就是系統(tǒng)為程序分配的一塊內(nèi)存單元,用來存儲(chǔ)各種類型的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)學(xué)習(xí)之關(guān)鍵字和變量數(shù)據(jù)類型的那些事,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07java實(shí)現(xiàn)十六進(jìn)制字符unicode與中英文轉(zhuǎn)換示例
當(dāng)需要對(duì)一個(gè)unicode十六進(jìn)制字符串進(jìn)行編碼時(shí),首先做的應(yīng)該是確認(rèn)字符集編碼格式,在無法快速獲知的情況下,通過一下的str4all方法可以達(dá)到這一目的2014-02-02Springboot應(yīng)用中Mybatis輸出SQL日志的3種方法代碼示例
在前臺(tái)請(qǐng)求數(shù)據(jù)的時(shí)候,sql語(yǔ)句一直都是打印到控制臺(tái)的,有一個(gè)想法就是想讓它打印到日志里,該如何做呢?這篇文章主要給大家介紹了關(guān)于Springboot應(yīng)用中Mybatis輸出SQL日志的3種方法,需要的朋友可以參考下2024-01-01