欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用Spire.PDF實現(xiàn)高效壓縮PDF文件

 更新時間:2025年08月29日 09:03:52   作者:咕白m625  
這篇文章主要介紹了過大的文件體積常引發(fā)傳輸卡頓、加載緩慢等問題,本文將解析?Spire.PDF?for?Java?的?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)文章

  • springboot 場景啟動器使用解析

    springboot 場景啟動器使用解析

    這篇文章主要介紹了springboot 場景啟動器使用解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 詳解Java Slipped Conditions

    詳解Java Slipped Conditions

    這篇文章主要介紹了Java Slipped Conditions的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • java通過ip獲取客戶端Mac地址的小例子

    java通過ip獲取客戶端Mac地址的小例子

    java通過ip獲取客戶端Mac地址的小例子,需要的朋友可以參考一下
    2013-03-03
  • Spring源碼解密之默認標簽的解析

    Spring源碼解密之默認標簽的解析

    這篇文章主要給大家介紹了關(guān)于Spring源碼解密之默認標簽的解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Java實現(xiàn)一個簡易版的多級菜單功能

    Java實現(xiàn)一個簡易版的多級菜單功能

    這篇文章主要給大家介紹了關(guān)于Java如何實現(xiàn)一個簡易版的多級菜單功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • java保留小數(shù)的四種實現(xiàn)方法

    java保留小數(shù)的四種實現(xiàn)方法

    這篇文章主要為大家詳細介紹了java保留小數(shù)的四種實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Java實現(xiàn)單例模式的五種方法介紹

    Java實現(xiàn)單例模式的五種方法介紹

    單例模式確保某個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。在計算機系統(tǒng)中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅(qū)動程序?qū)ο蟪1辉O(shè)計成單例
    2023-01-01
  • java字符串與字符數(shù)組之間的互轉(zhuǎn)方式

    java字符串與字符數(shù)組之間的互轉(zhuǎn)方式

    這篇文章主要介紹了java字符串與字符數(shù)組之間的互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • JDK8新特性-java.util.function-Function接口使用

    JDK8新特性-java.util.function-Function接口使用

    這篇文章主要介紹了JDK8新特性-java.util.function-Function接口使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 深入學(xué)習(xí)java ThreadLocal的源碼知識

    深入學(xué)習(xí)java ThreadLocal的源碼知識

    ThreadLocal是一個本地線程副本變量工具類。主要用于將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變量互不干擾,特別適用于各個線程依賴不通的變量值完成操作的場景。下面我們來詳細了解一下它吧
    2019-06-06

最新評論