跳過到頁腳內容
使用IRONPDF

如何在ASP.NET Core中從PDF文件中讀取資料

IronPDF 透過提供方法,讓開發者能使用簡潔的 C# 程式碼從 PDF 檔案中讀取文字、表單資料及表格,無需複雜的依賴項或手動解析,從而簡化了在 ASP.NET Core 中的 PDF 資料擷取作業。

在 .NET 應用程式中處理 PDF 檔案,其難度可能比表面看起來更高。 您可能需要從上傳的發票中提取文字、從問卷中擷取表單資料,或是為資料庫解析表格。 許多專案進度受阻,原因在於開發人員選用過於複雜的函式庫,導致必須編寫大量自訂解析程式碼。 IronPDF 提供了一個簡便的替代方案,讓您只需最少的設定即可讀取和處理 PDF 文件。

無論您處理的是簡單文字、互動式表單欄位,還是結構化的表格資料,IronPDF 的 API 都能讓您直接存取 PDF 內容,無需進行低階解析。 本指南將逐步說明如何在 .NET Core 中讀取 PDF 檔案中的資料,內容涵蓋文字擷取、表單資料檢索、表格解析以及非同步檔案上傳處理——所有範例均附有可直接套用至您專案中的 C# 程式碼。

如何在 ASP.NET Core 專案中設定 IronPDF?

入門步驟非常簡單。 請透過 NuGet 套件管理主控台.NET CLI,使用以下任一指令安裝 IronPDF NuGet 套件:

Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
SHELL

安裝套件後,請在任何處理 PDF 文件的檔案頂端加入 IronPDF 命名空間:

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

這便是大多數專案所需的全部設定。 IronPDF 不依賴外部渲染程序,亦無需額外的 Windows 原生依賴項。 若在 Linux 或 Docker 環境中使用,請參閱 IronPDF 文件以獲取特定平台的指引。

免費試用授權讓您在正式投入生產環境前,先測試完整的功能集。 您可以直接從 IronPDF 網站取得試用授權,並在執行首次 PDF 操作前,透過單行程式碼將其套用。

如何從 PDF 檔案中擷取文字?

文字擷取是最常見的 PDF 閱讀任務。 IronPDF 提供 ExtractAllText 來提取文件中的所有可讀文本,並提供 ExtractTextFromPage 來進行頁級存取。 兩種方法均能保持閱讀順序,並支援標準文字編碼。

// Load a PDF document from disk
var pdf = PdfDocument.FromFile("document.pdf");

// Extract all text from every page
string allText = pdf.ExtractAllText();

// Extract text from a specific page (zero-based index)
string pageOneText = pdf.ExtractTextFromPage(0);

Console.WriteLine(allText);
// Load a PDF document from disk
var pdf = PdfDocument.FromFile("document.pdf");

// Extract all text from every page
string allText = pdf.ExtractAllText();

// Extract text from a specific page (zero-based index)
string pageOneText = pdf.ExtractTextFromPage(0);

Console.WriteLine(allText);
Imports System

' Load a PDF document from disk
Dim pdf = PdfDocument.FromFile("document.pdf")

' Extract all text from every page
Dim allText As String = pdf.ExtractAllText()

' Extract text from a specific page (zero-based index)
Dim pageOneText As String = pdf.ExtractTextFromPage(0)

Console.WriteLine(allText)
$vbLabelText   $csharpLabel

ExtractAllText 將完整的文字內容作為單一字串傳回,保留換行符。 ExtractTextFromPage 使用從零開始的索引定位單一頁面,這在您只需要多頁文件的特定部分的內容時非常有用。

若需深入了解文字與圖片擷取選項,請參閱《從 PDF 擷取文字》指南,其中涵蓋了基於區域的擷取等進階情境。

如何將文字擷取功能整合至 .NET Core 控制器中?

以下控制器操作接受透過 IFormFile 上傳的 PDF 文件,將其讀取到 MemoryStream 中,並將提取的文字作為 JSON 傳回:

using IronPdf;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    [HttpPost("extract-text")]
    public IActionResult ExtractText(IFormFile pdfFile)
    {
        if (pdfFile == null || pdfFile.Length == 0)
            return BadRequest("No PDF file uploaded.");

        using var stream = new MemoryStream();
        pdfFile.CopyTo(stream);

        var pdf = new PdfDocument(stream.ToArray());
        string extractedText = pdf.ExtractAllText();

        return Ok(new { text = extractedText });
    }
}
using IronPdf;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    [HttpPost("extract-text")]
    public IActionResult ExtractText(IFormFile pdfFile)
    {
        if (pdfFile == null || pdfFile.Length == 0)
            return BadRequest("No PDF file uploaded.");

        using var stream = new MemoryStream();
        pdfFile.CopyTo(stream);

        var pdf = new PdfDocument(stream.ToArray());
        string extractedText = pdf.ExtractAllText();

        return Ok(new { text = extractedText });
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Http
Imports Microsoft.AspNetCore.Mvc
Imports System.IO

<ApiController>
<Route("api/[controller]")>
Public Class PdfController
    Inherits ControllerBase

    <HttpPost("extract-text")>
    Public Function ExtractText(pdfFile As IFormFile) As IActionResult
        If pdfFile Is Nothing OrElse pdfFile.Length = 0 Then
            Return BadRequest("No PDF file uploaded.")
        End If

        Using stream As New MemoryStream()
            pdfFile.CopyTo(stream)

            Dim pdf As New PdfDocument(stream.ToArray())
            Dim extractedText As String = pdf.ExtractAllText()

            Return Ok(New With {.text = extractedText})
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

此端點將上傳的檔案轉換為位元組數組,並將其直接傳遞給 PdfDocument。 程式碼不會將任何暫存檔寫入磁碟,這不僅能保持程式碼簡潔,還能避免不必要的儲存空間負擔。 IFormFile介面可以自然地與 multipart 表單提交和 Postman 等 API 用戶端配合使用。

如何在 .NET Core 中讀取 PDF 表單資料?

PDF 表單(亦稱為 AcroForms)包含供使用者填寫的互動式欄位。 IronPDF 透過 Form 屬性公開表單字段,該屬性位於 PdfDocument 中,為您提供文件中每個字段的名稱和值。

以下端點會讀取上傳的表單 PDF,並將所有欄位值以 JSON 字典的形式傳回:

[HttpPost("extract-form")]
public IActionResult ExtractForm([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var stream = new MemoryStream();
    pdfFile.CopyTo(stream);

    var pdf = new PdfDocument(stream.ToArray());
    var formData = new Dictionary<string, string>();

    if (pdf.Form != null)
    {
        foreach (var field in pdf.Form)
        {
            formData[field.Name] = field.Value;
        }
    }

    return Ok(new { formFields = formData });
}
[HttpPost("extract-form")]
public IActionResult ExtractForm([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var stream = new MemoryStream();
    pdfFile.CopyTo(stream);

    var pdf = new PdfDocument(stream.ToArray());
    var formData = new Dictionary<string, string>();

    if (pdf.Form != null)
    {
        foreach (var field in pdf.Form)
        {
            formData[field.Name] = field.Value;
        }
    }

    return Ok(new { formFields = formData });
}
Imports Microsoft.AspNetCore.Mvc
Imports System.IO

<HttpPost("extract-form")>
Public Function ExtractForm(<FromForm> pdfFile As IFormFile) As IActionResult
    If pdfFile Is Nothing OrElse pdfFile.Length = 0 Then
        Return BadRequest("No PDF file uploaded.")
    End If

    Using stream As New MemoryStream()
        pdfFile.CopyTo(stream)

        Dim pdf = New PdfDocument(stream.ToArray())
        Dim formData As New Dictionary(Of String, String)()

        If pdf.Form IsNot Nothing Then
            For Each field In pdf.Form
                formData(field.Name) = field.Value
            Next
        End If

        Return Ok(New With {.formFields = formData})
    End Using
End Function
$vbLabelText   $csharpLabel

pdf.Form 中的每個欄位都有一個 Name 屬性(在 PDF 創作工具中設定的欄位識別碼)和一個 Value 屬性(使用者輸入的文字或選擇)。 本系列包含文字方塊、核取方塊、單選鈕及下拉式選單等元件。

JSON 回應格式讓您能輕鬆將表單提交資料轉發至資料庫、第三方 API 或訊息佇列,無需進行任何額外的解析。 對於涉及程式化建立或編輯 PDF 表單的工作流程,PDF 表單指南說明了如何新增欄位及預先填入值。

典型的表單擷取回應會是什麼樣子?

API 回應顯示從 PDF 表單中提取的 JSON 數據,其中包含姓名、電子郵件和地址字段,並在 Postman 測試介面中顯示,狀態碼為 200 OK。

上述回應顯示 200 OK 狀態碼,內容包含來自範例聯絡表單 PDF 的欄位名稱與值。 其結構為扁平化的鍵值對映表,可與大多數資料庫結構或 REST 資料包完美對應。

如何從 PDF 中擷取表格資料?

PDF 檔案中的表格是以定位文字的形式儲存的——PDF 格式本身並未內建表格資料結構。 因此,提取表格資料意味著先提取原始文字,然後應用解析邏輯來重建行與列。

IronPDF 的 ExtractAllText 保留空格和製表符,因此可以透過程式將行拆分為列。 以下控制器動作範例展示了此方法:

[HttpPost("extract-table")]
public IActionResult ExtractTable([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var memoryStream = new MemoryStream();
    pdfFile.CopyTo(memoryStream);

    var pdf = new PdfDocument(memoryStream.ToArray());
    string text = pdf.ExtractAllText();

    // Split into lines, then split each line into columns
    string[] lines = text.Split(
        new[] { '\r', '\n' },
        StringSplitOptions.RemoveEmptyEntries
    );

    var tableData = new List<string[]>();
    foreach (string line in lines)
    {
        string[] columns = line
            .Split('\t')
            .Where(c => !string.IsNullOrWhiteSpace(c))
            .ToArray();

        if (columns.Length > 0)
            tableData.Add(columns);
    }

    var table = tableData.Select(r => string.Join(" | ", r)).ToList();
    return Ok(new { Table = table });
}
[HttpPost("extract-table")]
public IActionResult ExtractTable([FromForm] IFormFile pdfFile)
{
    if (pdfFile == null || pdfFile.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var memoryStream = new MemoryStream();
    pdfFile.CopyTo(memoryStream);

    var pdf = new PdfDocument(memoryStream.ToArray());
    string text = pdf.ExtractAllText();

    // Split into lines, then split each line into columns
    string[] lines = text.Split(
        new[] { '\r', '\n' },
        StringSplitOptions.RemoveEmptyEntries
    );

    var tableData = new List<string[]>();
    foreach (string line in lines)
    {
        string[] columns = line
            .Split('\t')
            .Where(c => !string.IsNullOrWhiteSpace(c))
            .ToArray();

        if (columns.Length > 0)
            tableData.Add(columns);
    }

    var table = tableData.Select(r => string.Join(" | ", r)).ToList();
    return Ok(new { Table = table });
}
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Imports System.Linq

<HttpPost("extract-table")>
Public Function ExtractTable(<FromForm> pdfFile As IFormFile) As IActionResult
    If pdfFile Is Nothing OrElse pdfFile.Length = 0 Then
        Return BadRequest("No PDF file uploaded.")
    End If

    Using memoryStream As New MemoryStream()
        pdfFile.CopyTo(memoryStream)

        Dim pdf As New PdfDocument(memoryStream.ToArray())
        Dim text As String = pdf.ExtractAllText()

        ' Split into lines, then split each line into columns
        Dim lines As String() = text.Split(New Char() {ControlChars.Cr, ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries)

        Dim tableData As New List(Of String())()
        For Each line As String In lines
            Dim columns As String() = line.Split(ControlChars.Tab).Where(Function(c) Not String.IsNullOrWhiteSpace(c)).ToArray()

            If columns.Length > 0 Then
                tableData.Add(columns)
            End If
        Next

        Dim table = tableData.Select(Function(r) String.Join(" | ", r)).ToList()
        Return Ok(New With {.Table = table})
    End Using
End Function
$vbLabelText   $csharpLabel

此方法適用於表格採用一致的制表符分隔欄位的 PDF 檔案。 對於欄位間以可變空格分隔的文件,您可能需要套用最小間距啟發式演算法,或檢查字元位置。 當您需要在擷取前將包含表格的特定頁面隔離時,PDF 合併或分割指南將非常實用。

何時應手動解析表格?

API 回應顯示從 PDF 提取的結構化發票數據,包括客戶詳細資料、發票元資料和包含價格的明細產品(JSON 格式)

當 PDF 並非由 HTML 或結構化資料來源產生時(例如掃描的發票或使用桌面排版工具建立的文件),手動解析是正確的選擇。 分頁標籤(tab-split)方法能可靠地處理許多標準 PDF 檔案。 當欄位邊界不規則時,您可以透過 IronPDF 的 DOM 存取 API 檢視原始字元座標,藉此優化邏輯。

對於由 HTML 生成的文件,請考慮透過 HTML 中介進行雙向轉換。 透過資料驅動的 HTML 範本生成 PDF(詳見"HTML 字串轉 PDF"指南),意味著文字位置可預測,且資料擷取過程將十分簡便。

您如何處理非同步 PDF 檔案上傳?

正式運作的 ASP.NET Core 應用程式應以非同步方式處理檔案上傳,以避免阻塞執行緒池。 IFormFile.CopyToAsync 方法與 async/await 方法結合使用,可使控制器保持非阻塞狀態:

[HttpPost("process-upload")]
public async Task<IActionResult> ProcessPdf([FromForm] IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    var pdf = new PdfDocument(ms.ToArray());
    string text = pdf.ExtractAllText();
    int pageCount = pdf.PageCount;

    return Ok(new
    {
        text,
        pages = pageCount
    });
}
[HttpPost("process-upload")]
public async Task<IActionResult> ProcessPdf([FromForm] IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No PDF file uploaded.");

    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    var pdf = new PdfDocument(ms.ToArray());
    string text = pdf.ExtractAllText();
    int pageCount = pdf.PageCount;

    return Ok(new
    {
        text,
        pages = pageCount
    });
}
Imports System.IO
Imports Microsoft.AspNetCore.Mvc

<HttpPost("process-upload")>
Public Async Function ProcessPdf(<FromForm> file As IFormFile) As Task(Of IActionResult)
    If file Is Nothing OrElse file.Length = 0 Then
        Return BadRequest("No PDF file uploaded.")
    End If

    Using ms As New MemoryStream()
        Await file.CopyToAsync(ms)

        Dim pdf As New PdfDocument(ms.ToArray())
        Dim text As String = pdf.ExtractAllText()
        Dim pageCount As Integer = pdf.PageCount

        Return Ok(New With {
            .text = text,
            .pages = pageCount
        })
    End Using
End Function
$vbLabelText   $csharpLabel

PdfDocument 建構子是同步的,但上傳步驟(通常是管道中最慢的部分)是非同步運行的。 此架構在並發負載下具有良好的擴展性,並相容於最小化 API 端點、Razor Pages 處理程序及 gRPC 服務。

如何限制上傳檔案大小?

ASP.NET Core 強制執行 30 MB 的預設請求正文大小限制。 對於較大的 PDF 文件,請增加 Program.cs 中的限制:

builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 100 * 1024 * 1024; // 100 MB
});
builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 100 * 1024 * 1024; // 100 MB
});
Imports Microsoft.Extensions.DependencyInjection
Imports Microsoft.AspNetCore.Http

builder.Services.Configure(Of FormOptions)(Sub(options)
    options.MultipartBodyLengthLimit = 100 * 1024 * 1024 ' 100 MB
End Sub)
$vbLabelText   $csharpLabel

Kestrel 本身設有字元限制,您可能也需要提高此限制:

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
});
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
});
builder.WebHost.ConfigureKestrel(Sub(options)
    options.Limits.MaxRequestBodySize = 100 * 1024 * 1024
End Sub)
$vbLabelText   $csharpLabel

請根據您的應用程式將處理的 PDF 檔案實際最大大小來設定這些數值。 在將檔案傳遞給 IronPDF 之前,請務必驗證上傳檔案的 MIME 類型與副檔名,以防範意外的輸入。

如何將提取的 PDF 內容轉換為其他格式?

一旦取得文字或表單資料,即可將其傳送至應用程式所需的任何後續處理流程——例如資料庫寫入、搜尋索引、報表生成或 API 呼叫。 IronPDF 亦支援反向轉換:將 HTML 渲染為 PDF。

若需以視覺化方式呈現擷取的內容,可參考 PDF 轉圖像轉換指南,將原始 PDF 渲染為圖像。 這對於文件預覽功能非常有用,當您希望在瀏覽器中顯示頁面縮圖,而無需載入完整的 PDF 檔案時。

若您需要在將文件交付給使用者前進行保護,IronPDF 支援將數位簽章浮水印作為後製處理步驟。 添加頁首與頁尾(詳見頁首頁尾指南)的步驟同樣簡單明瞭。

常見的 PDF 資料擷取情境與建議的 IronPDF 方法
情境 IronPDF 方法 / 屬性 注意事項
擷取所有頁面文字 PDF.ExtractAllText() 以閱讀順序返回完整文件內容
從單一頁面擷取文字 PDF.ExtractTextFromPage(n) 從零開始的頁面索引
讀取 AcroForm 欄位 pdf.Form 列舉 field.Namefield.Value
解析表格列 ExtractAllText() + 分割邏輯 按制表符或空白間距分段
計算頁數 PDF.PageCount 適用於分頁與驗證
從位元組陣列載入 new PdfDocument(bytes) 無需建立臨時檔案
從檔案路徑載入 PdfDocument.FromFile(path) 關於伺服器端的檔案存取

設定 PDF 資料擷取功能後,下一步該做什麼?

您現在已具備文字擷取、表單資料讀取、表格解析及非同步上傳的功能模組。 以下是根據您的應用程式需求,可供進一步探索的幾項方向。

若您需要在資料擷取工作流程中同步產生 PDF 報告,IronPDF 功能概覽涵蓋 HTML 轉 PDF 渲染、水印疊加以及頁面操作等功能。 針對需合併來自多個來源的報表之應用程式,PDF 合併或分割指南將逐步說明如何組合與分割文件。

為了確保文件傳送的安全性,數位簽章可讓您在將 PDF 傳送給客戶前對其進行驗證。 自訂浮水印可在生成的文件中添加視覺品牌標識或草稿標籤。

如果您的專案從掃描的 PDF(圖像而不是可搜尋的文字)中提取數據,則在呼叫 ExtractAllText 之前,您需要一個 OCR 步驟。 Iron Software 旗下的 IronOCR 可與 IronPDF 整合,以處理掃描文件的作業流程。

IronPDF 提供多種彈性的授權方案,適用於個人開發者及團隊。 立即開始免費試用,無限制地測試所有功能。 完整文件包含 API 參考、入門指南,以及適用於 Windows、Linux、Docker 和雲端環境的部署說明。

在 .NET Core 中讀取 PDF 檔案的資料,不再需要低階解析程式碼或笨重的依賴項。 透過 IronPDF,從上傳檔案到提取內容的流程僅需幾行程式碼,可自然地整合至任何控制器或服務層中。

常見問題解答

在.NET Core應用程式中處理PDF文件時可能出現哪些挑戰?

由於需要提取文字、獲取表單資料或解析表格,而不用過於複雜的庫,在.NET Core中處理PDF文件可能會很棘手。

IronPDF如何幫助簡化在ASP.NET中從PDF文件中讀取資料?

IronPDF通過消除混亂的依賴關係或大量自定義解析代碼,簡化了PDF文檔的閱讀和處理。

為什麼在處理PDF時要避免過於複雜的庫?

使用過於複雜的庫可能會拖慢項目進度並增加開發時間,而簡單的解決方案如IronPDF則能簡化過程。

IronPDF可以從PDF文件中提取哪些類型的資料?

IronPDF可以從PDF文件中提取文字、表單資料和表格,讓其適應各種資料處理需求。

IronPDF 可以用於處理 ASP.NET 應用程式中上傳的發票嗎?

是的,IronPDF可以高效地讀取和處理ASP.NET應用程式中上傳的發票文字。

使用IronPDF時是否需要編寫自定義解析代碼?

不,IronPDF允許您在無需大量自定義解析代碼的情況下處理PDF文檔。

在.NET Core應用程式中使用IronPDF的好處是什麼?

IronPDF提供了一種簡單的方法來閱讀和處理PDF文件,增強資料處理能力,無需複雜的依賴性。

.NET 10 — IronPDF是否完全兼容?

是的。IronPDF被設計為完全兼容.NET 10(以及.NET 9、8、7、6、5、Core、Standard和Framework 4.6.2+),確保您能在最新的.NET平台上運行所有的PDF讀寫功能,而無需特殊手段。

IronPDF是否支援.NET 10中最新的API來讀取流式PDF內容?

是的。在.NET 10中,IronPDF可以通過字節數組或記憶體流處理PDF資料,使用像Stream和MemoryStream這樣的API,允許您在不保存臨時文件的情況下讀取PDF。這使其適合高效能伺服器場景以及在網路API中上傳或處理PDF資料。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我