
ASP.NET C#でIronPDFを使用してPDFを作成する方法
ASP.NET Coreで PDF ファイルをアップロードおよびダウンロードするには、バイナリ データの処理、コントローラー アクションの管理、およびオプションで保存または配信前にサーバー側でドキュメントを処理することが必要です。 IronPDFを使えば、透かしの適用、HTML からの PDF 生成、処理済みのドキュメントのユーザーへの返却など、単なるファイル保存にとどまらない機能をすべて既存の MVC パイプライン内で実現できます。このガイドでは、 .NET 10 を使用して C# で完全なアップロード・ダウンロードワークフローを構築する手順を、各ステップごとに解説します。
ASP.NET CoreプロジェクトにIronPDFをインストールするにはどうすればよいでしょうか?
アップロードまたはダウンロード ロジックを記述する前に、 NuGetパッケージ マネージャーまたは.NET CLI を使用してIronPDF をプロジェクトに追加します。 パッケージマネージャーコンソールでInstall-Package IronPdfを使用するか、以下のCLIコマンドを実行して新しいMVCプロジェクトをスキャフォールドし、すべての必要なパッケージを一度に追加します。
dotnet new mvc -n PdfManager --framework net10.0
cd PdfManager
dotnet add package IronPdf
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
インストールが完了すると、IronPDFはPdfDocumentを使って既存のファイルを読み込み、操作する機能を提供し、ウォーターマーク、スタンプ、デジタル署名を含む編集ツールの範囲を提供します。 バージョン履歴や互換性に関する注意事項については、IronPDF NuGet パッケージのページをご覧ください。
プロジェクトのセットアップ
ApplicationDbContextを登録してください。 プロジェクト構造には、PDF特有のロジックを書く前に、Data/ApplicationDbContext.csが含まれます。
PDF ストレージ用のデータベース モデルを作成するにはどうすればよいですか?
あらゆる PDF アップロード システムの基盤は、データベース テーブルにマップされるモデル クラスです。 次の C# レコードは、ファイル名、コンテンツ タイプ、生のバイナリ データ、アップロードのタイムスタンプなどの重要なフィールドをキャプチャします。
public class PdfFileModel
{
public int Id { get; set; }
public string FileName { get; set; } = string.Empty;
public string ContentType { get; set; } = "application/pdf";
public byte[] FileData { get; set; } = Array.Empty<byte>();
public DateTime UploadedDate { get; set; } = DateTime.UtcNow;
}Public Class PdfFileModel
Public Property Id As Integer
Public Property FileName As String = String.Empty
Public Property ContentType As String = "application/pdf"
Public Property FileData As Byte() = Array.Empty(Of Byte)()
Public Property UploadedDate As DateTime = DateTime.UtcNow
End ClassFileDataはPDFをバイナリ大規模オブジェクト(BLOB)として保存します。 このアプローチにより、ドキュメントがデータベース内に自己完結的になるため、バックアップが簡単になり、クエリが簡単になります。 大量のシナリオや大きなファイルの場合は、ファイル パスのみをデータベースに保存し、バイナリをAzure Blob StorageやAmazon S3などのクラウド ストレージ バケットに書き込むことを検討してください。
Entity Framework Core の構成
EF Coreにモデルを登録するために、DbSet<PdfFileModel>プロパティを追加します。
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) { }
public DbSet<PdfFileModel> PdfFiles { get; set; }
}Imports Microsoft.EntityFrameworkCore
Public Class ApplicationDbContext
Inherits DbContext
Public Sub New(options As DbContextOptions(Of ApplicationDbContext))
MyBase.New(options)
End Sub
Public Property PdfFiles As DbSet(Of PdfFileModel)
End Classスキーマを作成するために、dotnet ef database updateを実行します。 Entity Framework Coreはbyte[]をSQL ServerのBLOB列に自動でマッピングします - 手動でのSQLは不要です。
ASP.NET Coreコントローラーで PDF ファイルをアップロードするにはどうすればよいですか?
アップロードを処理するコントローラーアクションは、IFormFileパラメーターを受け取ります。 アクションはストリームをMemoryStreamに読み込み、バイト配列に変換し、Entity Framework Coreを通じて結果を保存します。
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
public class PdfController : Controller
{
private readonly ApplicationDbContext _context;
public PdfController(ApplicationDbContext context)
{
_context = context;
}
[HttpPost]
public async Task<IActionResult> Upload(IFormFile file)
{
if (file is null || file.Length == 0)
return BadRequest("No file selected.");
if (!file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
return BadRequest("Only PDF files are accepted.");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
var pdfFile = new PdfFileModel
{
FileName = Path.GetFileName(file.FileName),
ContentType = file.ContentType,
FileData = stream.ToArray(),
UploadedDate = DateTime.UtcNow
};
_context.PdfFiles.Add(pdfFile);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
public async Task<IActionResult> Index()
{
var files = await _context.PdfFiles
.Select(f => new { f.Id, f.FileName, f.UploadedDate })
.ToListAsync();
return View(files);
}
}Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.EntityFrameworkCore
Imports System.IO
Imports System.Threading.Tasks
Public Class PdfController
Inherits Controller
Private ReadOnly _context As ApplicationDbContext
Public Sub New(context As ApplicationDbContext)
_context = context
End Sub
<HttpPost>
Public Async Function Upload(file As IFormFile) As Task(Of IActionResult)
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file selected.")
End If
If Not file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase) Then
Return BadRequest("Only PDF files are accepted.")
End If
Using stream As New MemoryStream()
Await file.CopyToAsync(stream)
Dim pdfFile As New PdfFileModel With {
.FileName = Path.GetFileName(file.FileName),
.ContentType = file.ContentType,
.FileData = stream.ToArray(),
.UploadedDate = DateTime.UtcNow
}
_context.PdfFiles.Add(pdfFile)
Await _context.SaveChangesAsync()
End Using
Return RedirectToAction(NameOf(Index))
End Function
Public Async Function Index() As Task(Of IActionResult)
Dim files = Await _context.PdfFiles _
.Select(Function(f) New With {f.Id, f.FileName, f.UploadedDate}) _
.ToListAsync()
Return View(files)
End Function
End Classアップロードされたファイルの検証
処理する前に必ずコンテンツ タイプを検証してください。 file.ContentTypeを確認することで、ユーザーが誤って非PDFコンテンツをアップロードすることを防ぎます。 より強力なバリデーションのために、ストリームの最初の4バイトを読み取り、PDFマジックナンバー(%PDF)を確認します。 ストリームをコピーする前にfile.Lengthをチェックすることで、最大ファイルサイズを制限します - 一般的なドキュメントワークフローでは通常10 MBです。
このアクションをトリガーするHTMLフォームには、enctype="multipart/form-data"という2つの属性が必要です。 エンコード タイプがない場合、ブラウザはファイル名をバイナリ コンテンツではなくプレーン テキストとして送信します。 フォームタグ内に/Pdf/Uploadに向けたサブミットボタンを追加します。

アップロードした PDF を保存する前に透かしを追加するにはどうすればよいですか?
保存前にサーバー側でファイルを処理することは、 IronPDF の透かし機能の最も実用的な使用法の 1 つです。 バイトがデータベースに到達する前に、すべての受信ドキュメントに"機密"ラベル、会社ロゴ、または"ドラフト"通知をスタンプすることができます。
[HttpPost]
public async Task<IActionResult> UploadWithWatermark(IFormFile file)
{
if (file is null || file.Length == 0)
return BadRequest("No file selected.");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
byte[] originalBytes = stream.ToArray();
// Load the uploaded file into IronPDF
var pdf = new IronPdf.PdfDocument(originalBytes);
// Apply an HTML watermark centered on every page
pdf.ApplyWatermark(
"<h2 style='color:red;opacity:0.4'>CONFIDENTIAL</h2>",
rotation: 45,
opacity: 60,
verticalAlignment: IronPdf.Editing.VerticalAlignment.Middle,
horizontalAlignment: IronPdf.Editing.HorizontalAlignment.Center
);
var pdfFile = new PdfFileModel
{
FileName = Path.GetFileName(file.FileName),
ContentType = "application/pdf",
FileData = pdf.BinaryData,
UploadedDate = DateTime.UtcNow
};
_context.PdfFiles.Add(pdfFile);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
<HttpPost>
Public Async Function UploadWithWatermark(file As IFormFile) As Task(Of IActionResult)
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file selected.")
End If
Using stream As New MemoryStream()
Await file.CopyToAsync(stream)
Dim originalBytes As Byte() = stream.ToArray()
' Load the uploaded file into IronPDF
Dim pdf = New IronPdf.PdfDocument(originalBytes)
' Apply an HTML watermark centered on every page
pdf.ApplyWatermark(
"<h2 style='color:red;opacity:0.4'>CONFIDENTIAL</h2>",
rotation:=45,
opacity:=60,
verticalAlignment:=IronPdf.Editing.VerticalAlignment.Middle,
horizontalAlignment:=IronPdf.Editing.HorizontalAlignment.Center
)
Dim pdfFile As New PdfFileModel With {
.FileName = Path.GetFileName(file.FileName),
.ContentType = "application/pdf",
.FileData = pdf.BinaryData,
.UploadedDate = DateTime.UtcNow
}
_context.PdfFiles.Add(pdfFile)
Await _context.SaveChangesAsync()
Return RedirectToAction(NameOf(Index))
End Using
End Function透かしの設定オプション
IronPDFのApplyWatermarkメソッドはHTML文字列を受け入れます。つまり、ウォーターマークは有効なHTMLとインラインCSSを含むことができ、グラデーション、カスタムフォント、回転したテキスト、または埋め込まれたSVGアイコンも含めることができます。 opacityは透明度を0(見えない)から100(完全に不透明)まで制御します。
ウォーターマークに加えて、同じPdfDocumentオブジェクトはヘッダーとフッターの追加、画像のスタンプ、および既存のフォームフィールドの編集のためのメソッドを公開しています。 複数の処理手順をチェーンして、最終的なバイト配列を取得するためにpdf.BinaryDataを呼び出します。

データベースに保存されている PDF ファイルをダウンロードするにはどうすればよいでしょうか?
保存されたPDFをブラウザに戻すには、IDでレコードを取得し、FileResultを返します。 ASP.NET CoreのContent-Typeヘッダーを設定し、元のファイル名でブラウザのダウンロードダイアログをトリガーします。
public async Task<IActionResult> Download(int id)
{
var pdfFile = await _context.PdfFiles.FindAsync(id);
if (pdfFile is null)
return NotFound();
return File(pdfFile.FileData, pdfFile.ContentType, pdfFile.FileName);
}Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Async Function Download(id As Integer) As Task(Of IActionResult)
Dim pdfFile = Await _context.PdfFiles.FindAsync(id)
If pdfFile Is Nothing Then
Return NotFound()
End If
Return File(pdfFile.FileData, pdfFile.ContentType, pdfFile.FileName)
End Functionビューにダウンロードリストを表示する
Indexアクションは、保存されているすべてのファイルレコードを取得し、それらをRazorビューに渡します。 シンプルな HTML テーブルに、各レコードのファイル名、アップロード日、ダウンロード アンカーが表示されます。
<table class="content__data-table" data-content-table>
<caption>Uploaded PDF Files</caption>
<thead>
<tr>
<th>File Name</th>
<th>Uploaded</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.FileName</td>
<td>@item.UploadedDate.ToString("yyyy-MM-dd HH:mm")</td>
<td><a href="/Pdf/Download/@item.Id">Download</a></td>
</tr>
}
</tbody>
</table>netContent-Type: application/pdfとContent-Disposition: attachment; filename="..." ヘッダー。 ブラウザがダウンロードを促す代わりにPDFをインラインで開くようにする場合は、return File(bytes, contentType)を第3引数なしで使用します - この場合はContent-Disposition: attachment命令が省略されます。

代替手段としてのファイルシステムストレージ
大規模な展開の場合、生のバイナリ データをデータベースに保存すると行のサイズが大きくなり、クエリの速度が遅くなる可能性があります。 別の方法としては、ファイルをディスク上のディレクトリ (またはクラウド プロバイダー) に書き込み、相対パスのみをデータベースに保存する方法があります。 アップロード時にSystem.IO.File.WriteAllBytesAsync(path, bytes)で書き込みます。 両方のパスはコントローラの同じreturn File(...)呼び出しに収束します。
オンデマンドで PDF ドキュメントを生成し、ダウンロード用に提供するにはどうすればよいですか?
事前に保存されたファイルの提供に限定されません。 IronPDF の HTML から PDF への変換を使用すると、リクエスト時にデータから動的にドキュメントを生成できます。これは、請求書、レポート、証明書、データのエクスポートに役立ちます。
public IActionResult GenerateInvoice(int orderId)
{
// Build HTML content from your data model
string html = $@"
<html>
<body style='font-family: Arial, sans-serif; padding: 40px;'>
<h1>Invoice #{orderId}</h1>
<p>Generated: {DateTime.UtcNow:yyyy-MM-dd HH:mm} UTC</p>
<table border='1' cellpadding='8'>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>IronPDF License</td><td>1</td><td>$999</td></tr>
</table>
</body>
</html>";
var renderer = new IronPdf.ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(html);
return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
オンデマンド PDF のレンダリング オプション
ChromePdfRendererは、Google Chromeを駆動するのと同じChromiumレンダリングエンジンを使用してピクセル精度の出力を生成します。 つまり、ブラウザで表示できるすべての CSS (フレックスボックス レイアウト、グリッド、カスタム フォント、SVG チャート) が、生成された PDF で正しくレンダリングされます。 紙サイズ、マージン、方向をRenderingOptionsプロパティを介して設定できます。
より複雑なドキュメントの場合、HTML文字列の代わりに完全なURLをRenderUrlAsPdfに渡します。 IronPDF は、ヘッドレス ブラウザでページを読み込み、 JavaScriptを実行し、スタイルを適用し、完全にレンダリングされた DOM を PDF に変換します。 カスタム ヘッダー、フッター、ページ番号トークンなどのレンダリング オプションの完全なセットについては、 HTML から PDF への変換ガイドを確認してください。

ASP.NET Coreで複数の PDF ファイルを結合するにはどうすればよいですか?
単一ファイルの操作だけでなく、アップロードされた複数のドキュメントを 1 つに結合する必要がある場合もあります。 IronPDFのPDFマージ機能は、PdfDocumentオブジェクトのリストを受け取り、単一のマージされたファイルを返します。
public async Task<IActionResult> MergeAll()
{
var allFiles = await _context.PdfFiles.ToListAsync();
if (allFiles.Count < 2)
return BadRequest("At least two files are required for merging.");
var documents = allFiles
.Select(f => new IronPdf.PdfDocument(f.FileData))
.ToList();
using var merged = IronPdf.PdfDocument.Merge(documents);
return File(merged.BinaryData, "application/pdf", "merged.pdf");
}Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Async Function MergeAll() As Task(Of IActionResult)
Dim allFiles = Await _context.PdfFiles.ToListAsync()
If allFiles.Count < 2 Then
Return BadRequest("At least two files are required for merging.")
End If
Dim documents = allFiles _
.Select(Function(f) New IronPdf.PdfDocument(f.FileData)) _
.ToList()
Using merged = IronPdf.PdfDocument.Merge(documents)
Return File(merged.BinaryData, "application/pdf", "merged.pdf")
End Using
End FunctionPDFからページを分割する
逆操作 - ページの一部を抽出 - ではCopyPagesを使用します。 FileResultとして返します。 このパターンは、ページ区切りのプレビュー、複数セクションのレポートの分割、サムネイル生成のための表紙の抽出に役立ちます。 結合または分割された出力をユーザーに提供する前に、デジタル署名を適用することもできます。
大容量ファイルのアップロードを安全に処理するにはどうすればよいでしょうか?
大きな PDF ファイルの場合は、ASP.NET Coreミドルウェア レベルで追加の構成が必要です。 デフォルトでは、リクエスト本体のサイズ制限は約 28 MB に設定されています。 引き上げるには、Limits.MaxRequestBodySizeを設定します - 両方を希望のバイト数、例えば50 MBの場合は50 * 1024 * 1024に設定します - builder.Build()の前に行います。
サイズ制限を超えて、すべてのアップロードエンドポイントに以下のセキュリティプラクティスを適用してください:コンテンツタイプヘッダーの検証、ストリームの最初のバイトを%PDFマジックナンバーで確認、IronPDFのドキュメント検査APIを使用して埋め込みスクリプトをスキャン、処理されたファイルをウェブルートの外に保存して、静的コンテンツとして直接提供されないようにします。 ASP.NET Core のセキュリティ ドキュメントでは、偽造防止トークンの検証やウイルス スキャンの統合などの追加の強化手法について説明しています。
メモリ不足を回避するための大容量ファイルのストリーミング
ファイルが10MBを超える場合、処理する前にストリーム全体をMemoryStreamに読み込むと、メモリ使用量が大幅に増加する可能性があります。 可能であれば、リクエストストリームから直接ロードするためにIronPdf.PdfDocument.FromStreamを使用するか、一時的なファイルパスに書き込んでディスクからロードしてください。
string tempPath = Path.GetTempFileName();
await using (var fs = System.IO.File.Create(tempPath))
{
await file.CopyToAsync(fs);
}
using var pdf = new IronPdf.PdfDocument(tempPath);
// process...
System.IO.File.Delete(tempPath);Imports System.IO
Imports IronPdf
Dim tempPath As String = Path.GetTempFileName()
Using fs As FileStream = System.IO.File.Create(tempPath)
Await file.CopyToAsync(fs)
End Using
Using pdf As PdfDocument = New IronPdf.PdfDocument(tempPath)
' process...
End Using
System.IO.File.Delete(tempPath)このパターンはヒープ割り当てを低く抑え、HTTP 応答が送信された後にファイルが非同期的に処理されるバックグラウンド処理キューに適しています。 追加の非同期処理パターンについては、 IronPDF のドキュメントを参照してください。
次のステップは何ですか?
これで、 IronPDFを利用したASP.NET Core MVC アプリケーションで PDF ファイルをアップロード、処理、保存、ダウンロードするための完全な基盤が完成しました。 ここから、ワークフローを拡張するための次の方向性を検討してください。
処理機能を拡張します。IronPDFは、 PDF フォームフィールドの入力と読み取り、 PDF テキスト抽出 APIを使用したテキストと画像の抽出、 PDF ページをサムネイルプレビュー用の画像に変換する機能をサポートしています。 これらの各機能は、上記に示した同じコントローラー パターンに統合されます。
**デジタル署名を追加します。**生成またはアップロードされたすべてのドキュメントは、保存する前に X.509 証明書を使用してデジタル署名で署名します。 署名された PDF には、多くのコンプライアンス要件を満たす改ざん防止メタデータが含まれます。
ストレージをクラウドにスケールします。 Azure Blob StorageまたはAmazon S3参照でローカルbyte[]データベース列を置き換えます。 処理済みのバイトを透かし入れ後にクラウド ストレージにアップロードし、URI のみをデータベースに保存します。これにより、データベースの行サイズが大幅に削減され、CDN 配信が可能になります。
無料トライアルを始めましょう。IronPDFのトライアルライセンスページにアクセスして、全機能にアクセスできる 30 日間の評価キーを入手してください。 また、完全なIronPDF機能の概要を参照して、 .NETアプリケーションで利用できる PDF 機能の全範囲を理解したり、実稼働展開の準備ができたら価格とライセンスのページを参照したりすることもできます。

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。
関連する記事


