Java使用Spire.PDF實現(xiàn)高效壓縮PDF文件
在數(shù)字化辦公場景中,PDF文件因格式通用性成為主流載體,但過大的文件體積常引發(fā)傳輸卡頓、加載緩慢等問題。本文將解析 Spire.PDF for Java 的 PDF 壓縮方案,包括文檔內(nèi)容、圖片、字體的壓縮等。
一、PDF壓縮的三大技術(shù)維度解析
Spire.PDF for Java 通過以下技術(shù)路徑實現(xiàn)精準壓縮:
1.圖像壓縮
圖片是導(dǎo)致PDF體積增大的主要因素,Spire.PDF for Java 支持設(shè)置setImageQuality()參數(shù),自動調(diào)整圖片質(zhì)量, 以及設(shè)置 setResizeImages() 來減少圖片大小。
2.字體精簡策略
通過 setCompressFonts() 來壓縮字體,也可以通過setUnembedFonts()方法取消嵌入字體以減小文件大小。
3.內(nèi)容優(yōu)化
通過 setCompressContents() 來壓縮PDF內(nèi)部內(nèi)容流,該方法能保持文檔完整性。
二、PDF 壓縮代碼
開發(fā)者可通過以下核心步驟實現(xiàn)壓縮 PDF:
// 創(chuàng)建 PdfCompressor 對象并傳入文檔
PdfCompressor compressor = new PdfCompressor("test.pdf");
// 壓縮內(nèi)容
OptimizationOptions options = compressor.getOptions();
options.setCompressContents(true);
// 壓縮圖片
options.getImageCompressionOptions().setCompressImage(true);
options.getImageCompressionOptions().setImageQuality(ImageQuality.Low);
options.getImageCompressionOptions().setResizeImages(true);
// 優(yōu)化字體
options.getTextCompressionOptions().setCompressFonts(true);
Maven 依賴配置:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.8.3</version>
</dependency>
免費版:
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>9.13.0</version>
</dependency>
技術(shù)亮點:
零依賴運行:無需安裝 Adobe Reader 或 Ghostscript
通過以上三重壓縮機制,Java開發(fā)者可以最大程度的減少 PDF 文檔大小。建議在文件生成階段即調(diào)用壓縮接口,相比后期處理更能節(jié)省系統(tǒng)資源。
三、方法補充
方法一:
添加依賴
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId><a target="_blank" rel="nofollow">aspose-pdf</a></artifactId>
<version>23.1</version>
</dependency>
示例代碼
public class OptimizePdf {
public static void optimize(String source, String target) {
<a target="_blank" rel="nofollow">Document</a> doc = new Document(source);
//設(shè)置壓縮屬性
<a target="_blank" rel="nofollow">OptimizationOptions</a> opt = new OptimizationOptions();
//刪除PDF不必要的對象
opt.setRemoveUnusedObjects(true);
//鏈接重復(fù)流
opt.setLinkDuplcateStreams(false);
//刪除未使用的流
opt.setRemoveUnusedStreams(false);
//刪除不必要的字體
opt.setUnembedFonts(true);
//壓縮PDF中的圖片
opt.getImageCompressionOptions().setCompressImages(true);
//圖片壓縮比, 0 到100可選,越低壓縮比越大
opt.getImageCompressionOptions().setImageQuality(50);
doc.optimizeResources(opt);
//優(yōu)化web的PDF文檔
doc.optimize();
doc.save(target);
}
public static void main(String[] args) {
String source = "/Users/zhanghe/Desktop/2.pdf";
String target = "/Users/zhanghe/Desktop/1.pdf";
optimize(source, target);
}
}方法二:
引入依賴
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.0</version>
</dependency>
完整代碼實現(xiàn)
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.cos.COSName;
import java.io.File;
import java.io.IOException;
public class TextOptimizedPdfCompressor {
public static void textOptimizedPdfCompressor(String inputPath, String outputPath) {
try (PDDocument document = Loader.loadPDF(new File(inputPath))) {
// 核心優(yōu)化流程(傳遞 document 參數(shù))
for (PDPage page : document.getPages()) {
compressContent(page);
compressImages(document, page); // ? 關(guān)鍵修改:傳入 document 對象
}
document.save(outputPath);
System.out.println("? 壓縮完成!");
} catch (IOException e) {
System.err.println("錯誤信息: " + e.getMessage());
}
}
// ================= 內(nèi)容流壓縮 =================
private static void compressContent(PDPage page) {
page.getCOSObject().setItem(COSName.FILTER, COSName.FLATE_DECODE);
page.getCOSObject().setInt(COSName.BITS_PER_COMPONENT, 8);
}
// ================= 圖片壓縮模塊 =================
private static void compressImages(PDDocument document, PDPage page) throws IOException {
PDResources resources = page.getResources();
if (resources == null) return;
for (COSName name : resources.getXObjectNames()) {
if (resources.isImageXObject(name)) {
PDImageXObject image = (PDImageXObject) resources.getXObject(name);
// 僅處理大尺寸圖片
if (image.getWidth() * image.getHeight() > 1_000_000) {
// ? 正確方式:使用傳入的 document 參數(shù)
PDImageXObject compressedImg = JPEGFactory.createFromImage(
document,
image.getImage(),
0.1f
);
resources.put(name, compressedImg);
}
}
}
}
}
到此這篇關(guān)于Java使用Spire.PDF實現(xiàn)高效壓縮PDF文件的文章就介紹到這了,更多相關(guān)Java壓縮PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java字符串與字符數(shù)組之間的互轉(zhuǎn)方式
這篇文章主要介紹了java字符串與字符數(shù)組之間的互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05
JDK8新特性-java.util.function-Function接口使用
這篇文章主要介紹了JDK8新特性-java.util.function-Function接口使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
深入學(xué)習(xí)java ThreadLocal的源碼知識
ThreadLocal是一個本地線程副本變量工具類。主要用于將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變量互不干擾,特別適用于各個線程依賴不通的變量值完成操作的場景。下面我們來詳細了解一下它吧2019-06-06

