詳解如何通過Java實(shí)現(xiàn)壓縮PDF文檔
PDF文檔是我們?nèi)粘^k公中使用最頻繁的文檔格式。但因?yàn)榇蠖鄶?shù)PDF文檔都包含很多頁面圖像或大量圖片,這就導(dǎo)致PDF文檔過大,處理起來較為麻煩。PDF文件過大,就會導(dǎo)致傳輸或者下載的速度變慢,也會增加傳輸失敗的風(fēng)險,影響辦公效率。因此我們需要對PDF文檔進(jìn)行壓縮。本文將從以下兩方面介紹如何通過Java應(yīng)用程序壓縮PDF文檔。
在使用PDF文件過程中,經(jīng)常會出現(xiàn)由于體積過大導(dǎo)致文件傳輸失敗的情況。遇到這種情況,我們可以先將PDF文件壓縮一下再進(jìn)行傳輸。而除了壓縮文檔內(nèi)容以外,壓縮圖片是縮小PDF文檔的主要方法之一。本文將分為2部分分別介紹如何通過Java代碼壓縮PDF文檔。希望這篇文章能對大家有所幫助。
- 壓縮PDF文檔中的內(nèi)容及圖片
- 壓縮PDF文檔中的高分辨率圖片
引入jar包
導(dǎo)入方法1:
手動引入。將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 類的對象。
- 使用 PdfDocument.loadFromFile() 方法加載 PDF 文檔。
- 使用 PdfDocument.getFileInfo().setIncrementalUpdate() 方法將增量更新設(shè)置為false。
- 使用 PdfDocument.setCompressionLevel() 方法將壓縮級別設(shè)置為最佳,以壓縮文檔中的內(nèi)容。 您可以從 PdfCompressionLevel 枚舉中選擇其他一些級別。
- 循環(huán)遍歷文檔中的頁面,使用 PdfPageBase.getImagesInfo() 方法獲取每個頁面的圖像信息集合。
- 遍歷集合中的所有項(xiàng)目,并使用 PdfBitmap.setQuality() 方法壓縮特定圖像的質(zhì)量。
- 使用 PdfPageBase.replaceImage() 方法將原始圖像替換為壓縮圖像。使用 PdfDocument.saveToFile() 方法將文檔保存到另一個 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 類的對象。
PdfDocument doc = new PdfDocument();
//加載 PDF 文檔
doc.loadFromFile("測試文檔.pdf");
//將增量更新設(shè)置為false
doc.getFileInfo().setIncrementalUpdate(false);
//將壓縮級別設(shè)置為最佳
doc.setCompressionLevel(PdfCompressionLevel.Best);
//循環(huán)遍歷文檔中的頁面
for (int i = 0; i < doc.getPages().getCount(); i++) {
//獲取特定頁面
PdfPageBase page = doc.getPages().get(i);
//獲取每個頁面的圖像信息集合
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();
}
}
}效果對比圖

壓縮 PDF 文檔中的高分辨率圖像
本方法僅對文檔中的高分辨率圖像進(jìn)行無損壓縮,而低分辨率的圖像將不再被壓縮。
- 創(chuàng)建 PdfDocument 類的對象。
- 使用 PdfDocument.loadFromFile() 方法加載 PDF 文檔。
- 使用 PdfDocument.getFileInfo().setIncrementalUpdate() 方法將 IncrementalUpdate 設(shè)置為 false。
- 聲明一個 PdfPageBase 變量。
- 循環(huán)遍歷頁面并使用 PdfDocument.getPages().get() 方法獲取特定頁面。
- 循環(huán)遍歷頁面中的圖像。并使用 page.tryCompressImage(info.Index) 方法壓縮高分辨率圖像。
- 使用 PdfDocument.saveToFile() 方法將文檔保存到另一個 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 類的對象
PdfDocument doc = new PdfDocument
//加載 PDF 文檔
doc.loadFromFile("示例文檔.pdf");
//將IncrementalUpdate設(shè)置為false
doc.getFileInfo().setIncrementalUpdate(false);
//聲明一個 PdfPageBase 變量
PdfPageBase page;
//循環(huán)遍歷頁面
for (int i = 0; i < doc.getPages().getCount(); i++) {
//獲取指定頁面
page = doc.getPages().get(i);
if (page != null) {
if(page.getImagesInfo() != null){
//循環(huán)遍歷頁面中的圖像
for (PdfImageInfo info: page.getImagesInfo()) {
//使用tryCompressImage方法壓縮高分辨率圖像
page.tryCompressImage(info.getIndex());
}
}
}
}
//保存文件
doc.saveToFile("輸出結(jié)果.pdf");
}
}效果對比圖

到此這篇關(guān)于詳解如何通過Java實(shí)現(xiàn)壓縮PDF文檔的文章就介紹到這了,更多相關(guān)Java壓縮PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用log4j2打印mybatis的sql執(zhí)行日志方式
這篇文章主要介紹了使用log4j2打印mybatis的sql執(zhí)行日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
springboot關(guān)于容器啟動事件總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于springboot容器啟動事件相關(guān)知識點(diǎn),需要的朋友們學(xué)習(xí)下。2019-10-10

