PDF 頁面尺寸 .NET - 使用 C# 提取寬度與高度
介紹
有沒有遇過在 .NET 應用程式中與 PDF 文件糾纏,必須為每一頁 get pdf page size?你並不孤單。無論是打造文件檢視器、建立列印版面,或是處理表單,精確的頁面尺寸都是打造完善使用者體驗的基礎。
在本完整指南中,我們將一步步說明如何使用 GroupDocs.Annotation for .NET 取得 PDF 頁面尺寸——這是此任務最可靠的函式庫之一。完成後,你將擁有可取得寬度、高度以及其他關鍵中繼資料的範例程式碼,適用於任何 PDF 文件。
快速解答
- 如何在 .NET 中取得 pdf page size? 使用
Annotator.GetDocumentInfo()並讀取PageInfo.Width/PageInfo.Height。 - 哪個函式庫支援 pdf page width height 抽取? GroupDocs.Annotation for .NET (v25.4.0+)。
- 基本尺寸抽取是否需要授權? 免費試用版可使用;正式上線需購買商業授權。
- 回傳的單位是什麼? 點 (Points) (1/72 英吋);可依需求轉換為英吋或毫米。
- 能有效處理大型 PDF 嗎? 可以——GroupDocs.Annotation 只讀取中繼資料,無需將整個檔案載入記憶體。
什麼是 get pdf page size?
Get pdf page size 指的是以程式方式取得 PDF 頁面的寬度與高度。此操作對於 .NET 應用程式中的版面計算、列印準備以及表單欄位定位皆相當重要。
為何 PDF 頁面尺寸在 .NET 開發中重要
在進入程式碼之前,先來探討為何了解 pdf page width height 很重要。這些數值不只是冷知識——它們驅動實際功能:
- Layout Management – 響應式檢視器可根據精確的頁面尺寸自動縮放,避免尷尬的捲軸。
- Print Optimization – 精確的尺寸可防止紙張浪費與商業工作流程中的列印錯位。
- Form Processing – 抽取座標依賴精確的頁面尺寸;2 mm 的誤差就可能導致資料擷取失敗。
- Resource Planning – 大型、尺寸混合的 PDF 需要不同的記憶體策略;提前了解尺寸可讓批次處理更聰明。
前置條件
必要的函式庫與版本
- GroupDocs.Annotation for .NET(版本 25.4.0 或更新)。此版本支援 50+ 種輸入與輸出格式,且可在不將整個檔案載入記憶體的情況下處理上百頁的 PDF。
- .NET Framework 4.6.1 以上 或 .NET Core 2.0 以上
環境設定需求
- Visual Studio 2019 或更新(Community 版亦可完美運作)
- 測試用 PDF 檔案(我們會示範如何處理不同類型)
- 具備基本的
using陳述式與 C# 物件釋放概念
知識前置條件
只需要具備以下基礎:- C# 基礎知識 - NuGet 套件管理基礎 - .NET 中的簡易檔案 I/O
全部準備好了嗎?太好了——讓我們設定函式庫。
設定 GroupDocs.Annotation for .NET
安裝 GroupDocs.Annotation 相當簡單,但依照工作流程的不同,有幾種安裝方式。
方法 1:使用 NuGet 套件管理員主控台
在 Visual Studio 開啟套件管理員主控台,執行以下指令:
Install-Package GroupDocs.Annotation -Version 25.4.0
方法 2:使用 .NET CLI
如果你偏好使用指令列工具:
dotnet add package GroupDocs.Annotation --version 25.4.0
方法 3:視覺化套件管理員
- 在 Solution Explorer 中右鍵點擊你的專案
- 選取 Manage NuGet Packages
- 搜尋 GroupDocs.Annotation
- 點擊 Install
授權選項(依需求選擇)
- Free Trial – 包含尺寸抽取在內的核心功能可在小幅使用限制下使用,適合概念驗證。
- Temporary License – 可申請 30 天的臨時金鑰,以在評估期間取得完整功能。
- Commercial License – 生產環境部署必須購買商業授權;價格會依開發人員數量與部署模式而變動。
快速設定驗證
以下是一個簡單測試,用以確認所有設定正確:
using GroupDocs.Annotation;
// This should compile without errors if installation succeeded
using (Annotator annotator = new Annotator(@"path\to\your\test.pdf"))
{
Console.WriteLine("GroupDocs.Annotation is ready to use!");
}
如果此程式能編譯且執行時未拋出例外,即表示你已可以開始抽取頁面尺寸。
什麼是 Annotator 類別?
Annotator 類別是 GroupDocs.Annotation 的核心物件,代表記憶體中的 PDF 文件,並提供讀取中繼資料、加入註解與抽取頁面資訊的方法。它封裝檔案處理、支援從串流載入,並確保所有後續操作皆透過 Annotator 實例執行,簡化工作流程管理。
如何使用 GroupDocs.Annotation get pdf page size?
GetDocumentInfo() 會回傳一個 DocumentInfo 物件,內含整體 PDF 中繼資料,包括頁數與頁面細節集合。使用 new Annotator("file.pdf") 載入 PDF 後呼叫此方法;Pages 集合中的每個 PageInfo 都包含 Width 與 Height。此兩步驟方式可立即取得點 (points) 為單位的尺寸,且不需解析整個檔案。
步驟式實作指南
步驟 1:以你的 PDF 初始化 Annotator
建立指向 PDF 檔案的 Annotator 實例。務必將其包在 using 區塊中,以便即時釋放檔案句柄。
using (Annotator annotator = new Annotator(@"YOUR_DOCUMENT_DIRECTORY\INPUT_PDF"))
{
// All our dimension extraction magic happens here
}
小技巧: 正確釋放可防止記憶體洩漏,特別是在批次處理大量大型 PDF 時。
步驟 2:取得文件資訊
DocumentInfo 是一個物件,保存整體 PDF 中繼資料,如總頁數以及每頁的 PageInfo 物件集合。
GroupDocs.Annotation 讓中繼資料抽取只需一行程式碼:
IDocumentInfo info = annotator.Document.GetDocumentInfo();
回傳的 DocumentInfo 物件提供:
- 總頁數
- 檔案格式資訊
Pages清單,其中每個項目包含寬度、高度、旋轉角度等資訊
步驟 3:驗證取得的資料
在開始遍歷頁面之前,先確認 DocumentInfo 不為 null,且頁面集合中有項目。
if (info.PagesInfo != null && info.PagesInfo.Count > 0)
{
Console.WriteLine($"\t Document info: Type {info.FileType}, size = {info.Size}, pages = {info.PageCount}");
}
else
{
Console.WriteLine("No page information available - check your PDF file");
return;
}
此防禦性檢查可避免 null 參考例外,並在 PDF 損毀時提供早期回饋。
步驟 4:為每頁抽取寬度與高度
PageInfo 代表單一頁面的屬性,包括寬度、高度與旋轉角度。
遍歷 Pages 集合並讀取 Width 與 Height。請記得這些值以 點 為單位(1 點 = 1/72 英吋)。
foreach (var page in info.PagesInfo)
{
Console.WriteLine($"\t\t page #{page.PageNumber}: {page.Width}x{page.Height}");
}
重點
- 先是寬度,後是高度。
- 頁碼採用 1 為起點,與檢視器顯示的頁碼相同。
- 若需調整座標,亦可取得旋轉資訊。
完整可執行範例(方法)
你可以將上述步驟封裝成可重複使用的方法:
using GroupDocs.Annotation;
using System;
public void ExtractPdfPageDimensions(string pdfPath)
{
try
{
using (Annotator annotator = new Annotator(pdfPath))
{
IDocumentInfo info = annotator.Document.GetDocumentInfo();
if (info.PagesInfo != null && info.PagesInfo.Count > 0)
{
Console.WriteLine($"Document: {info.FileType}, {info.Size} bytes, {info.PageCount} pages");
foreach (var page in info.PagesInfo)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Width} x {page.Height} points");
}
}
else
{
Console.WriteLine("Could not retrieve page information");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error processing PDF: {ex.Message}");
}
}
常見陷阱與避免方法
即使程式碼相當簡潔,開發者仍會遇到可預期的問題。以下列出最常見的陷阱與有效解決方案。
檔案路徑問題
問題: 開發期間出現 “File not found” 錯誤。
解決方案: 測試時使用絕對路徑,並在建立 Annotator 前確認檔案是否存在。
if (!File.Exists(pdfPath))
{
throw new FileNotFoundException($"PDF file not found: {pdfPath}");
}
權限問題
問題: 應用程式缺乏對 PDF 檔案的讀取權限,特別是在 Web 伺服器上。
解決方案: 為應用程式池身分授予適當的讀取權限,或在受限資料夾使用 impersonation。
損毀 PDF 處理
問題: 某些 PDF 部分損毀或使用非標準功能。
解決方案: 將抽取邏輯包在 try‑catch 區塊中,並提供清晰的錯誤訊息。GroupDocs.Annotation 會對不支援的結構拋出 DocumentException。
大檔案記憶體洩漏
問題: 大量處理大型 PDF 而未釋放 Annotator 實例,會導致記憶體不足當機。
解決方案: 必須使用 using 陳述式,並考慮將檔案分批或以串流模式處理。
版本相容性
問題: 混用不同版本的 GroupDocs 函式庫會導致型別不匹配。
解決方案: 在整個解決方案中統一使用單一版本,並同步更新所有相關套件。
真實案例應用
了解 retrieve pdf width height 可開啟多種強大應用情境:
文件檢視應用程式
響應式檢視器可根據頁面尺寸自動設定初始縮放比例,提供「適合螢幕」的體驗,無需手動調整。
// Example: Calculate optimal zoom for viewport
double optimalZoom = Math.Min(viewportWidth / pageWidth, viewportHeight / pageHeight);
自動化報告產生
在將多個 PDF 合併為單一報告時,了解每頁尺寸可確保一致的縮放,避免意外的分頁斷行。
列印管理系統
精確的尺寸讓你計算最佳紙張使用量,偵測直式或橫式方向,並在送至商業印刷前先行檢查文件。
表單處理解決方案
以頁面尺寸為基礎的精確座標,使得在不同版面的 PDF 中可靠抽取核取方塊、簽名與文字欄位成為可能。
數位資產管理
為 PDF 加上尺寸中繼資料標籤,可快速搜尋(例如「顯示所有 A4 大小的文件」),提升目錄編排效率。
效能優化技巧
從原型轉至正式環境時,效能變得至關重要。
批次處理策略
將相似操作分組以減少開銷。例如,先為一批檔案讀取中繼資料並儲存結果,然後在第二輪處理註解。
var results = new List<PageDimensionResult>();
foreach (var pdfFile in pdfFiles.Take(10)) // Process in batches of 10
{
// Extract dimensions and add to results
}
快取常用尺寸
若同一 PDF 被頻繁查詢,可將其 DocumentInfo 物件快取於執行緒安全的字典中。檔案變更時請記得使快取失效。
private static readonly Dictionary<string, IDocumentInfo> _dimensionCache =
new Dictionary<string, IDocumentInfo>();
大檔案非同步處理
利用 async/await 模式,使 UI 執行緒保持回應,同時在背景執行 GroupDocs.Annotation 讀取中繼資料。
public async Task<List<PageInfo>> ExtractDimensionsAsync(string pdfPath)
{
return await Task.Run(() => {
// Your dimension extraction code here
});
}
記憶體管理最佳實踐
- 及時釋放每個
Annotator實例。 - 將大量集合分批(每批 20–50 個檔案)處理,以降低記憶體佔用。
- 使用效能計數器或分析工具監控記憶體使用情況。
- 若快取物件的存活期較短,請使用弱參考 (weak reference)。
進階使用案例
熟悉基本抽取後,可探索以下進階情境。
處理混合尺寸文件
某些 PDF 內的頁面尺寸不一(例如封面為 A4,內頁為 A5)。可透過比較連續的 PageInfo.Width/Height 值來偵測尺寸變化,並套用條件邏輯。
var pageSizes = info.PagesInfo.Select(p => new { p.PageNumber, p.Width, p.Height }).ToList();
var uniqueSizes = pageSizes.Select(p => new { p.Width, p.Height }).Distinct().Count();
if (uniqueSizes > 1)
{
Console.WriteLine("Document contains multiple page sizes");
}
方向偵測
透過比較寬度與高度判斷直式或橫式。此功能可用於檢視器自動旋轉頁面或產生考慮方向的縮圖。
foreach (var page in info.PagesInfo)
{
string orientation = page.Width > page.Height ? "Landscape" : "Portrait";
Console.WriteLine($"Page {page.PageNumber}: {orientation}");
}
與其他 GroupDocs 功能整合
將尺寸抽取與註解 API 結合,可精確放置印章;或與轉換 API 結合,產生符合原始頁面尺寸的影像。
常見問答
Q: 能在未取得授權的情況下抽取 PDF 頁面尺寸嗎?
A: 可以。免費試用版支援基本尺寸抽取,但每次作業處理的頁數可能有限制。
Q: 寬度與高度的單位是什麼?
A: GroupDocs.Annotation 以 points(1 點 = 1/72 英吋)回傳尺寸。除以 72 可轉換為英吋,乘以 0.352778 可轉換為毫米。
Q: 如何處理受密碼保護的 PDF?
A: 在建立 Annotator 時透過 LoadOptions 傳入密碼,例如:new Annotator(path, new LoadOptions { Password = "your‑password" })。
Q: 能處理儲存在 Azure 或 AWS 等雲端儲存的 PDF 嗎?
A: 可以。先將檔案下載至本機 Stream,再使用支援串流的 Annotator 建構子,避免產生中介檔案。
Q: 從大型 PDF 抽取尺寸的效能影響如何?
A: GroupDocs.Annotation 僅讀取 PDF 的交叉參照表與頁面字典,大多數低於 100 MB 的 PDF 在一般伺服器硬體上可於 1 秒內完成處理。
Q: 如何處理有旋轉頁面的 PDF?
A: PageInfo.Rotation 屬性會顯示旋轉角度。若頁面旋轉 90° 或 270°,請交換寬度與高度的值,以取得實際顯示的尺寸。
Q: 能只抽取特定頁面的尺寸嗎?
A: 可以。呼叫 GetDocumentInfo() 後,依 PageNumber 篩選 Pages 集合,即可針對單一頁面。
Q: 這能支援 PDF/A 格式的文件嗎?
A: 完全支援。GroupDocs.Annotation 完整支援 PDF/A‑1、PDF/A‑2 與 PDF/A‑3 標準。
Q: 如何排除 “Unable to load document” 錯誤?
A: 檢查檔案權限,確定檔案未損毀(可用 PDF 閱讀器開啟),並確認使用的 PDF 版本在支援範圍內(1.4–2.0)。
Q: 能以像素而非點取得尺寸嗎?
A: 可自行轉換:pixels = points * DPI / 72。以常見螢幕 DPI 96 為例,點數乘以 1.3333 即可得到像素。
必備資源
- Documentation: GroupDocs Annotation 文件說明
- API Reference: GroupDocs Annotation API 參考文件
- Download: GroupDocs 下載
- Purchase: 購買 GroupDocs
- Free Trial: 免費試用版
- Temporary License: 申請臨時授權
- Support: GroupDocs 論壇
最後更新: 2026-06-16
測試環境: GroupDocs.Annotation 25.4.0 for .NET
作者: GroupDocs