如何使用 Node.js 壓縮 PDF 檔案

This article was translated from English: Does it need improvement?
Translated
View the article in English

大型 PDF 檔案會拖慢檔案傳輸速度、增加儲存成本,並在以文件為主的應用程式中降低效能。 IronPDF for Node.js 提供 compressSize 方法,該方法可降低嵌入式圖片的畫質,並可選擇性地將圖片重新調整為文件中的可見尺寸,通常能在不改變文件結構的情況下,將檔案大小縮減 50% 或更多。

快速入門:在 Node.js 中壓縮 PDF 檔案

安裝套件、載入 PDF 檔案,並呼叫 compressSize,同時指定 1 到 100 之間的品質值:

```javascript {.line-numbers} //:path=/static-assets/pdf/content-code-examples/how-to/nodejs-compress-pdf/quickstart.js import { PdfDocument } from "@ironsoftware/IronPDF";

// 載入現有 PDF const pdf = await PDFDocument.fromFile("report.pdf");

// 將嵌入的圖片壓縮至 60% 的 JPEG 品質 await pdf.compressSize(60);

// 儲存結果 await pdf.saveAs("report-compressed.pdf");


<div class="hsg-featured-snippet">
<h3>簡化工作流程(5 個步驟)</h3>

1. 安裝 IronPDF:`npm install @ironsoftware/ironpdf`
2. 從 `@ironsoftware/ironpdf` 匯入 `PdfDocument`
3. 載入原始檔案 `PdfDocument.fromFile(path)`
4. 呼叫 `await pdf.compressSize(quality)` -- 品質範圍 1-100
5. 將結果儲存為 `await pdf.saveAs(outputPath)`
</div>

## 為什麼 PDF 檔案大小對 Node.js 應用程式很重要?

PDF 檔案大小會直接影響兩項運作考量:傳輸速度與儲存成本。透過 API 端點傳送一份 20 MB 的報告 PDF 檔案,會在行動網路連線中造成可測量的延遲。 在每日處理數千份文件的批次處理流程中,即使僅減少 30% 的文件大小,累積下來也能帶來顯著的儲存空間節省。

IronPDF 的 `compressSize` 方法針對造成 PDF 檔案體積龐大的主要因素:嵌入式圖片。 文字與向量圖形在渲染時,於 PDF 物件層級能有效壓縮;然而,以原始解析度嵌入的點陣圖像,卻是典型商務文件中造成檔案過大主因。 將 JPEG 品質從預設值(通常為 95-100%)降低至 60-85%,可在視覺品質損失最小的情況下,實現最大的檔案大小壓縮效果。

提示在正常螢幕解析度下,品質分數達 80 或以上時,通常與原文難以區分。 (若檔案大小是主要限制因素,請將數值保留在 60 以下,以適用於歸檔或預覽情境。
## `compressSize` 方法是如何運作的? `compressSize` 方法接受兩個參數:`quality`(必填,整數 1-100)和 `scaleImages`(可選,布林值)。 當 `scaleImages` 設定為 `false`(預設值)時,此方法會將每個嵌入的 JPEG 檔案重新編碼為目標品質。 當 `scaleImages` 為 `true` 時,它也會對圖片進行降採樣,使其尺寸與 PDF 版面中的可見大小相符,從而降低頁面中以小尺寸呈現的圖片解析度。 ```javascript {.line-numbers} //:path=/static-assets/pdf/content-code-examples/how-to/nodejs-compress-pdf/compress-with-scaling.js import { PdfDocument } from "@ironsoftware/IronPDF"; // 載入原始文件 const pdf = await PdfDocument.fromFile("product-catalog.pdf"); // 將圖片壓縮至 90% 品質並縮放至可見尺寸 await pdf.compressSize(90, true); // 儲存最佳化的文件 await pdf.saveAs("product-catalog-optimized.pdf");

scaleImages 參數對於由高 DPI 掃描或 HTML 範本生成的 PDF 特別有效,這些範本會將圖片以全解析度嵌入,而不受顯示尺寸影響。啟用此參數可比單純調整品質更能有效縮小檔案大小,且在一般 PRINT 或螢幕解析度下不會造成任何可見的畫質劣化。

此方法會就地修改 PdfDocument 物件。 若需保留原始內容,請在呼叫 compressSize 之前複製文件,或使用不同的儲存路徑。

我應該使用哪種品質設定?

合適的品質設定取決於壓縮後的 PDF 將如何使用:

  • 90-100:近乎無損。 適用於文件將被列印或以全螢幕檢視的情況。
  • 80-89:高品質,檔案明顯較小。此為多數商務文件的預設起點。
  • 60-79:中等品質。 適用於螢幕顯示、網頁發布及電子郵件附件。
  • 低於 60:品質不佳。 適用於預覽縮圖、歸檔副本,或檔案大小至關重要的情況。

請注意此品質量表專指 JPEG 影像重新編碼。 PDF 中的文字、向量圖形及非 JPEG 圖片不受品質設定影響。)}]

如何在 Node.js 中測量壓縮結果?

使用 Node.js 的 fs 模組,即可輕鬆驗證壓縮效果是否達到預期的減量。 請先讀取呼叫 compressSize 前後的檔案大小,再計算比例以確認結果符合您的應用程式需求。

```javascript {.line-numbers} //:path=/static-assets/pdf/content-code-examples/how-to/nodejs-compress-pdf/measure-compression.js import { PdfDocument } from "@ironsoftware/IronPDF"; import { statSync } from "fs";

const inputPath = "annual-report.pdf"; const outputPath = "annual-report-compressed.PDF";

const beforeBytes = statSync(inputPath).size;

const pdf = await PdfDocument.fromFile(inputPath); await pdf.compressSize(75); await pdf.saveAs(outputPath);

const afterBytes = statSync(outputPath).size; const reduction = (((beforeBytes - afterBytes) / beforeBytes) * 100).toFixed(1);

console.log(Before: ${(beforeBytes / 1024).toFixed(1)} KB); console.log(After: ${(afterBytes / 1024).toFixed(1)} KB); console.log(Reduced by ${reduction}%);


[Node.js](https://nodejs.org/api/fs.html#fsstatsynspath-options) 的 [`fs.statSync` API](https://nodejs.org/api/fs.html#fsstatsynspath-options) 會傳回一個 `Stats` 物件,其中包含以位元組為單位的 `size` 屬性。 針對生產管線,請針對每份文件記錄此壓縮率,以便識別壓縮效果未如預期縮減檔案大小的異常值——通常是源頭已壓縮的掃描文件。

重要事項在伺服器環境中處理檔案前,請設定 `IRONPDF_ENGINE_PATH` 環境變數或配置 `IronPdfGlobalConfig`。 (有關引擎設定的詳細資訊,請參閱 [IronPDF](https://ironpdf.com/nodejs/docs/) for [Node.js 文件](https://ironpdf.com/nodejs/docs/)。)}]
## 如何批次壓縮多個 PDF 檔案? 生產環境中的應用程式很少會孤立地壓縮單一文件。 以下範例使用 `Promise.all` 並行處理一組檔案路徑,此機制可讓 Node.js 事件迴圈在不阻塞的情況下處理多項 `compressSize` 操作: ```javascript {.line-numbers} //:path=/static-assets/pdf/content-code-examples/how-to/nodejs-compress-pdf/batch-compress.js import { PdfDocument } from "@ironsoftware/IronPDF"; import path from "path"; async function compressPdfFiles(inputPaths, quality = 80) { const results = await Promise.all( inputPaths.map(async (inputPath) =&gt; { const pdf = await PdfDocument.fromFile(inputPath); await pdf.compressSize(quality); const outputPath = inputPath.replace(".pdf", "-compressed.pdf"); await pdf.saveAs(outputPath); return { input: inputPath, output: outputPath }; }) ); return results; } // 使用方式 const files = ["report-q1.pdf", "report-q2.pdf", "report-q3.pdf"]; const compressed = await compressPdfFiles(files, 75); compressed.forEach(r =&gt; console.log(`Saved: ${r.output}`));

每次對 PdfDocument.fromFilecompressSize 的呼叫皆為獨立操作,因此可安全地進行平行處理。若處理非常龐大的批次(數百個檔案),請考慮將陣列分塊處理,以避免超過 Node.js 的記憶體限制。 Node.js 關於事件迴圈的文件說明了 Promise.all 如何在不阻塞主執行緒的情況下,排程並發 I/O 作業。

如何將壓縮功能與其他 PDF 操作結合使用?

壓縮功能自然地融入更廣泛的文件處理流程中。 常見的流程是將 HTML 轉為 PDF,加入浮水印或簽名,然後在傳送前進行壓縮:

```javascript {.line-numbers} //:path=/static-assets/pdf/content-code-examples/how-to/nodejs-compress-pdf/compress-after-render.js import { PdfDocument, ChromePdfRenderer } from "@ironsoftware/IronPDF";

// 將 HTML 渲染為 PDF const renderer = new ChromePdfRenderer(); const pdf = await renderer.renderHtmlAsPdf("

Amount due: $540.00

");

// 儲存前壓縮 -- 減少 Chrome 渲染內容中的圖片大小 await pdf.compressSize(85);

// 儲存最終文件 await pdf.saveAs("invoice-1042.pdf");



`ChromePdfRenderer` 通常會以全解析度嵌入背景圖片及 CSS 引用的資源。 在渲染後呼叫 `compressSize`,可有效減少源自 HTML 的 PDF 檔案大小。 IronPDF 的 [HTML 轉 PDF 教學](https://ironpdf.com/nodejs/tutorials/html-to-pdf/)詳盡介紹了渲染器的設定。

若文件同時需要[數位簽章](https://ironpdf.com/nodejs/examples/digitally-sign-a-pdf/),請在壓縮後再進行簽署。 簽署會鎖定文件的位元組流,若進行進一步修改將導致簽名失效。

處理多頁文件時,請在壓縮前使用 [`PdfDocument.merge()`](https://ironpdf.com/nodejs/examples/merge-pdfs/) 將其合併。 將合併後的結果進行壓縮,比分別壓縮各檔案再重新合併更為高效。

提示壓縮前請先合併多頁文件。 (將合併後的結果進行壓縮,比分別壓縮各檔案再重新合併更為高效。
## Node.js 中的 PDF 壓縮技術下一步發展為何? `compressSize` 方法涵蓋最常見的壓縮應用情境:減輕嵌入式圖片的檔案大小。 針對特殊情境,IronPDF 的 [PDF 壓縮範例](https://ironpdf.com/nodejs/examples/pdf-compression/)提供了額外的實作程式碼範例,而 [API 參考](https://ironpdf.com/nodejs/object-reference/api/)文件則完整記載了所有可用方法的簽名。 IronPDF 亦支援將[圖片](https://ironpdf.com/nodejs/examples/image-to-pdf/)轉換[為 PDF](https://ironpdf.com/nodejs/examples/image-to-pdf/)、[讀取 PDF 文字](https://ironpdf.com/nodejs/examples/reading-pdf-text/),以及[從 PDF 中刪除頁面](https://ironpdf.com/nodejs/examples/remove-page-from-pdf/)——所有這些操作皆可透過相同的 `PdfDocument` API 進行整合。 如需了解 Node.js PDF 功能的完整概述,請參閱 [IronPDF Node.js 文件](https://ironpdf.com/nodejs/docs/)。 準備好在您的專案中測試壓縮功能了嗎? [立即開始免費試用](#trial-license),無水印執行上述範例,或[查看](#licensing)生產環境部署的[授權選項](#licensing)。 `PdfDocument`

常見問題

如何在 Node.js 中使用 IronPDF 壓縮 PDF 檔案?

使用 PdfDocument.fromFile(path) 載入 PDF,呼叫 await pdf.compressSize(quality) 並設定品質值介於 1 至 100 之間,最後透過 await pdf.saveAs(outputPath) 儲存結果。請先執行 npm install @ironsoftware/IronPdf 安裝此套件。

compressSize 中的 quality 參數控制什麼?

品質參數(1 至 100 之間的整數)用於控制嵌入式點陣圖像的 JPEG 重新編碼等級。80 至 89 之間的數值可產生高品質輸出,同時顯著減小檔案大小,是大多數商務文件的建議起始設定。低於 60 的數值適用於檔案大小為主要限制的歸檔或預覽情境。

compressSize 中的 scaleImages 參數是什麼?

可選的第二個參數 scaleImages(布林值,預設為 false)會將嵌入的圖片進行降採樣,使其尺寸與 PDF 版面中的可見尺寸相符。若將此參數設為 true,對於由高 DPI 掃描檔或 HTML 範本生成的 PDF 特別有效,因為這些檔案會將圖片以全解析度嵌入,而不受顯示尺寸的影響。

使用 compressSize 能將 PDF 檔案大小縮小多少?

壓縮效果取決於原始 PDF 的內容。若文件包含大量高解析度點陣圖,壓縮率可達 50% 或更高。而主要由文字和向量圖形組成的 PDF 文件,壓縮效果將微乎其微,因為 compressSize 功能專門針對 JPEG 圖像的重新編碼進行優化。

如何在 Node.js 中測量壓縮結果?

請使用 fs.statSync(path).size 讀取壓縮前後的檔案大小(單位為位元組)。計算比率為 ((before - after) / before) * 100,即可得出壓縮率(百分比)。

Curtis Chau
技術撰稿人

Curtis Chau 擁有卡爾頓大學(Carleton University)的電腦科學學士學位,專精於前端開發,並精通 Node.js、TypeScript、JavaScript 及 React。他熱衷於打造直觀且美觀的用戶介面,喜歡運用現代框架,並創建結構完善、視覺上吸引人的手冊。

除了開發工作之外,Curtis 對物聯網(IoT)抱有濃厚興趣,致力於探索整合硬體與軟體的創新方法。閒暇時,他喜歡玩遊戲和開發 Discord 機器人,將對科技的熱愛與創意相結合。

準備開始了嗎?
版本: 2026.5 just released
Still Scrolling Icon

還在捲動嗎?

想要快速證明?
執行範例 觀看您的 HTML 變成 PDF。