跳至页脚内容
使用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 客户端配合使用。

如何在 ASP.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 或结构化数据源生成时(例如扫描的发票或使用桌面出版工具创建的文档),手动解析是最佳选择。 制表符分隔法能够可靠地处理许多标准 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 和云环境的部署说明。

在 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 应用程序中上传的发票文本。

使用 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 中用于读取流式 PDF 内容的最新 API?

是的。在 .NET 10 中,IronPDF 可以使用 Stream 和 MemoryStream 等 API 从字节数组或内存流处理 PDF 数据,从而无需保存临时文件即可读取 PDF。这使其适用于高性能服务器场景,以及在 Web API 中上传或处理 PDF 数据。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我