跳至頁尾內容
使用IRONPDF

如何使用IronPDF構建ASP.NET Core PDF檢視器

IronPDF簡化在ASP.NET Core中提取PDF資料,通過提供方法來閱讀文字、表單資料和表格,使用簡單的C#程式碼,無需複雜的依賴或手動解析。

在.NET應用程式中處理PDF檔案可能比最初看起來更具挑戰性。 您可能需要從上傳的發票中提取文字、從調查中檢索表單資料或解析表格以用於您的資料庫。 許多專案因為開發者使用過於複雜的程式庫,這些程式庫需要大量的自訂解析程式碼而變慢。 IronPDF提供了簡單的替代方案,讓您以最少的設置讀取和處理PDF文件。

無論您是在處理簡單的文字、互動式表單欄位,還是結構化的表格資料,IronPDF的API讓您可以直接存取PDF內容,無需低層級解析。 本指南介紹如何在ASP.NET Core中讀取PDF檔案中的資料,涵蓋了文字提取、表單資料檢索、表格解析和非同步檔案上傳處理——所有這些都使用您可以嵌入到專案中的C#程式碼。

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

開始是很簡單的。 從NuGet套件管理控制台.NET CLI安裝IronPDF NuGet套件,使用以下命令之一:

Install-Package IronPdf

安裝套件後,在所有處理PDF文件的檔案頂部新增IronPDF命名空間:

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

這就是大多數專案所需的所有設置。 IronPDF不依賴於外部呈現過程或在Windows上需要的額外本機依賴。 對於Linux或Docker環境,請參閱IronPDF文件以獲得平台特定的指導。

免費試用授權允許您在投入生產使用前測試完整的功能集。 您可以直接從IronPDF網站獲取試用授權並在首次PDF操作之前通過一行程式碼應用它。

您如何從PDF檔案中提取文字?

文字提取是最常見的PDF閱讀任務。 IronPDF提供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提取文字指南涵蓋了包括基於區域的提取在內的高級情境。

您如何將文字提取整合到ASP.NET Core控制器中?

以下控制器動作接受通過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介面自然地與多部分表單提交和API客戶端(例如Postman)搭配使用。

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

PDF表單—也稱為AcroForms—包含使用者填寫的互動式欄位。 IronPDF通過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

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或結構化資料源生成時—例如,掃描的發票或在桌面出版工具中建立的文件,手動解析是正確的選擇。 製表符拆分方法能可靠地處理許多標準PDF。 當列邊界不規則時,您可以通過檢查IronPDF的DOM存取API中的原始字元座標來細化邏輯。

對於從HTML生成的文件,請考慮通過HTML中介回路。 從資料驅動的HTML模板生成您的PDF(HTML字串到PDF指南中涵蓋),意味著文字位置將是可預測的,並且提取將是直接的。

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

生產環境中的ASP.NET Core應用應非同步處理文件上傳,以避免阻塞執行緒池。 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步驟。 IronOCR來自Iron Software,整合了IronPDF以處理掃描的文件工作流程。

IronPDF在靈活的授權選項下可供個別開發者和團隊使用。 從免費試用開始,無限制地測試所有功能。 完整文件包含API參考、入門指南和Windows、Linux、Docker及雲端環境的部署說明。

在ASP.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 應用程式中讀取和處理上傳的發票文字。

using 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 可以使用像 Stream 和 MemoryStream 這樣的 API 處理來自位元組陣列或記憶體流的 PDF 資料,允許您無需儲存暫時檔案就讀取 PDF。這使其適合於高性能伺服器場景及在網頁 API 中上傳或處理 PDF 資料。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

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