
如何使用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 包,可使用以下任一命令:
安装包后,请在任何处理 PDF 文档的文件顶部添加 IronPDF 命名空间:
using IronPdf;Imports IronPdf对于大多数项目而言,上述配置已足够。 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);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)ExtractAllText返回完整的文本内容作为一个字符串,保留换行符。 ExtractTextFromPage使用基于零的索引定位单独的页面,这在您只需要多页文档中特定部分的内容时很有用。
若需深入了解文本和图像提取选项,请参阅《从 PDF 中提取文本》指南,其中涵盖了基于区域提取等高级场景。
如何将文本提取功能集成到 .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 });
}
}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此端点将上传的文件转换为字节数组,并直接传递给PdfDocument。 不会将临时文件写入磁盘,这既保持了代码的简洁性,又避免了不必要的存储开销。 IFormFile接口自然地与多部分表单提交和像Postman这样的API客户端配合使用。
如何在 ASP.NET Core 中读取 PDF 表单数据?
PDF 表单(也称为 AcroForms)包含供用户填写的交互式字段。 IronPDF通过Form属性暴露表单字段,提供文档中每个字段的名称和值。
以下端点读取上传的表单 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 });
}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 FunctionValue属性(用户输入的文本或选择)。 本系列中包含文本框、复选框、单选按钮和下拉菜单等控件。
JSON 响应使表单提交数据能够轻松转发至数据库、第三方 API 或消息队列,无需进行额外解析。 对于涉及以编程方式创建或编辑PDF表单的工作流程,PDF表单指南显示了如何添加字段和预填充值。
典型的表单提取响应是什么样子的?

上述响应显示了一个 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 });
}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对于表格采用统一制表符分隔列的 PDF 文件,此方法效果良好。 对于列间间距不固定的文档,您可能需要应用最小间距启发式算法或检查字符位置。 当您需要在提取前将包含表格的特定页面分离出来时,PDF 合并或拆分指南将非常有用。
何时应手动解析表格?

当 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
});
}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 FunctionPdfDocument构造函数是同步的,但上传步骤——通常是管道中最慢的部分——是异步执行的。 该模式在并发负载下具有良好的扩展性,并兼容最小化 API 端点、Razor Pages 处理程序和 gRPC 服务。
如何限制上传文件大小?
ASP.NET Core 默认强制执行 30 MB 的请求正文大小限制。 对于较大的PDF,请在Program.cs中增加限制:
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)Kestrel 自身存在限制,您可能还需要提高该限制:
builder.WebHost.ConfigureKestrel(options =>
{
options.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
});builder.WebHost.ConfigureKestrel(Sub(options)
options.Limits.MaxRequestBodySize = 100 * 1024 * 1024
End Sub)请根据您的应用程序将要处理的 PDF 文件的实际最大大小来设置这些值。 在将文件传递给 IronPDF 之前,请务必验证上传文件的 MIME 类型和扩展名,以防范意外输入。
如何将提取的 PDF 内容转换为其他格式?
获取文本或表单数据后,您可以将其传递给应用程序所需的任何下游流程——例如数据库写入、搜索索引、报表生成或 API 调用。 IronPDF 还支持反向转换:将 HTML 渲染为 PDF。
若需直观展示提取的内容,可参考 PDF 转图像指南,将原始 PDF 渲染为图像。 这对于文档预览功能非常有用,当您希望在浏览器中显示页面缩略图而无需加载完整的 PDF 文件时。
如果您需要在将文档交付给用户前对其进行保护,IronPDF 支持在后处理步骤中添加数字签名和水印。 添加页眉和页脚(详见页眉和页脚指南)同样简单直观。
| 场景 | IronPDF 方法 / 属性 | 注意事项 |
|---|---|---|
| 提取页面所有文本 | PDF.ExtractAllText() | 按阅读顺序返回完整的文档文本 |
| 从单页中提取文本 | PDF.ExtractTextFromPage(n) | 基于零的页码索引 |
| 读取 AcroForm 字段 | pdf.Form | 枚举 field.Name 和 field.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,从上传文件到提取内容的路径只有几行代码,可以自然地融入任何控制器或服务层。

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


