在 ASP.NET 中顯示資料庫中的 PDF(開發者指南)
要在 ASP.NET 中顯示資料庫中的 PDF,請檢索儲存的二進位數據,並使用IronPDF 的 PdfDocument 類別進行渲染,該類別可以有效地處理位元組數組,並提供具有自訂選項的瀏覽器相容輸出。
什麼是 ASP.NET 中的 PDF 資料庫顯示?
在 ASP.NET 應用程式中管理PDF 文件通常涉及將 PDF 文件直接儲存在資料庫中,而不是檔案系統中。 這種方法提供了更好的安全性、集中式備份和簡化的部署。 然而,如果沒有合適的工具,從資料庫中檢索和顯示 PDF 文件可能會很困難。
將 PDF 檔案作為二進位資料儲存在資料庫表中,可以更好地控製文件的存取和版本控制。 當您需要向使用者顯示 PDF 文件時,必須有效率地從資料庫中檢索位元組數組並將其呈現在瀏覽器中。 IronPDF 透過一個高效的 API 簡化了在 ASP.NET 應用程式中處理 PDF 文件的整個過程。
本教學課程示範如何使用 IronPDF 的成熟功能,在 ASP.NET 中從資料庫顯示 PDF。 您將學習如何建立完整的解決方案,以最佳的效能和安全性上傳、儲存和顯示 PDF 檔案。 該庫支援各種渲染選項和高級 PDF 處理功能,可輕鬆建立生產級文件管理系統。
如何在 ASP.NET 專案中安裝 PDF 程式庫?
在實現 PDF 顯示功能之前,請確保您的 ASP.NET 專案已安裝 IronPDF。 在 Visual Studio 中開啟程式包管理器控制台,然後根據您的工具偏好執行下列命令之一:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
您也可以透過NuGet 套件管理器UI 安裝 IronPDF,只需在專案的"瀏覽"標籤中搜尋 IronPdf 即可。 安裝完成後,請在應用程式啟動時設定您的許可證密鑰:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
免費試用許可證讓您在評估期間可以完全存取所有功能。 對於生產環境部署,請查看可用的許可級別,找到適合您專案規模的選項。
需要什麼樣的資料庫結構?
您的資料庫表結構需要一個 varbinary(max) 列來儲存 PDF 檔案作為二進位資料。 為了更好地管理文檔,表格應包含文件名稱、上傳日期和文件大小等元資料欄位。 以下 SQL 語句建立了一個適用於此場景的表:
using IronPdf;
using System.Data.SqlClient;
using System.IO;
using System.Configuration;
using IronPdf;
using System.Data.SqlClient;
using System.IO;
using System.Configuration;
Imports IronPdf
Imports System.Data.SqlClient
Imports System.IO
Imports System.Configuration
在 web.config 檔案中配置連接字串以建立資料庫連線。 PDF 檢視器實作將使用此連接從資料庫中檢索上傳的文件,並流暢地顯示 PDF 內容。
該解決方案需要哪些命名空間?
此解決方案使用了標準的 ADO.NET 命名空間以及 IronPDF 命名空間。 您不需要任何第三方 ORM——直接使用 ADO.NET 的方法可以最大限度地減少依賴項,並讓您完全控制查詢執行。 請確保連線字串指向包含 PDF 儲存表的 SQL Server 執行個體。
如何建立用於儲存 PDF 文件的資料庫表?
首先建立一個專門用於儲存PDF文件的資料庫表。 表格結構應同時容納二進位資料和管理 PDF 文件所需的基本元資料:
CREATE TABLE PdfDocuments (
Id INT PRIMARY KEY IDENTITY(1,1),
FileName NVARCHAR(255) NOT NULL,
FileData VARBINARY(MAX) NOT NULL,
ContentType NVARCHAR(100) DEFAULT 'application/pdf',
FileSize INT,
UploadDate DATETIME DEFAULT GETDATE(),
CreatedBy NVARCHAR(100),
LastModified DATETIME,
DocumentVersion INT DEFAULT 1
);
表格將每個 PDF 檔案儲存為 FileData 列中的位元組陣列。 varbinary(max) 資料類型可儲存最大 2 GB 的文件,足以滿足大多數 PDF 文件的需求。 FileName 欄位保留原始檔名,以便顯示和下載。
如何提升資料庫在PDF檢索方面的效能?
檢索 PDF 文件時,可以考慮在經常查詢的列上新增索引,以提高效能。 以下 SQL 語句會在最有可能出現在 WHERE 和 ORDER BY 子句中的欄位上建立索引:
CREATE INDEX IX_PdfDocuments_UploadDate
ON PdfDocuments(UploadDate DESC);
CREATE INDEX IX_PdfDocuments_FileName
ON PdfDocuments(FileName);
這種結構確保了上傳文件的高效儲存和檢索,同時保持了根據需要添加其他元資料欄位的靈活性。 對於非常大的 PDF 文件,請考慮資料庫儲存是否適合您的架構,或者混合方法(將文件儲存在磁碟或物件儲存中,而僅在資料庫中保留元資料)在規模化方面是否表現更好。
| 策略 | 最適合 | 優勢 | 考慮因素 |
|---|---|---|---|
| 資料庫(VARBINARY) | 中小文件,高安全性 | 交易一致性,集中式備份 | 可以快速增加資料庫大小 |
| 檔案系統 | 大文件,高吞吐量 | 檔案 I/O 速度快,資料庫開銷低 | 需要單獨的備份策略 |
| 物件儲存(Azure Blob/S3) | 雲端部署,無限擴展 | 經濟實惠,供應充足 | 附加 SDK 依賴項 |
如何將PDF檔案上傳到資料庫?
使用 ASP.NET 的 FileUpload 控制項實作上傳功能。 將以下 HTML 標記新增至 .aspx 頁面的表單元素中,並進行適當的驗證:
<div class="pdf-upload-container">
<asp:FileUpload ID="FileUpload1" runat="server" accept=".pdf" />
<asp:Button ID="btnUpload" Text="Upload PDF"
OnClick="btnUpload_Click" runat="server" CssClass="btn-primary" />
<asp:Label ID="lblMessage" runat="server" CssClass="status-message" />
<div class="file-info">
<asp:Label ID="lblFileInfo" runat="server" />
</div>
</div>
<div class="pdf-upload-container">
<asp:FileUpload ID="FileUpload1" runat="server" accept=".pdf" />
<asp:Button ID="btnUpload" Text="Upload PDF"
OnClick="btnUpload_Click" runat="server" CssClass="btn-primary" />
<asp:Label ID="lblMessage" runat="server" CssClass="status-message" />
<div class="file-info">
<asp:Label ID="lblFileInfo" runat="server" />
</div>
</div>
範例 UI 輸出
! ASP.NET Web 應用程式介面,顯示一個 PDF 上傳表單,其中包含"選擇檔案"按鈕和"上傳 PDF"按鈕,下方還有一個用於文件管理的空白 PDF 文件清單部分。
如何處理文件上傳事件?
上傳按鈕會觸發伺服器端事件處理程序。 以下是上傳函數的完整實現,該函數將上傳的檔案轉換為位元組數組並存儲,同時進行適當的錯誤處理:
protected void btnUpload_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile && FileUpload1.PostedFile.ContentType == "application/pdf")
{
try
{
string fileName = FileUpload1.FileName;
byte[] fileBytes = FileUpload1.FileBytes;
int maxFileSize = 10 * 1024 * 1024; // 10MB limit
if (fileBytes.Length > maxFileSize)
{
lblMessage.Text = "File size exceeds 10MB limit.";
return;
}
// Validate PDF using IronPDF
using (var stream = new MemoryStream(fileBytes))
{
var testPdf = new IronPdf.PdfDocument(stream);
if (testPdf.PageCount == 0)
{
lblMessage.Text = "Invalid PDF file.";
return;
}
}
string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
string query = "INSERT INTO PdfDocuments (FileName, FileData, FileSize, CreatedBy) " +
"VALUES (@FileName, @FileData, @FileSize, @CreatedBy)";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@FileName", fileName);
cmd.Parameters.AddWithValue("@FileData", fileBytes);
cmd.Parameters.AddWithValue("@FileSize", fileBytes.Length);
cmd.Parameters.AddWithValue("@CreatedBy", User.Identity.Name ?? "Anonymous");
conn.Open();
cmd.ExecuteNonQuery();
}
}
lblMessage.Text = "PDF document uploaded successfully!";
lblFileInfo.Text = $"File: {fileName} ({fileBytes.Length / 1024}KB)";
LoadPdfList();
}
catch (Exception ex)
{
lblMessage.Text = "Error uploading file: " + ex.Message;
}
}
else
{
lblMessage.Text = "Please select a valid PDF file.";
}
}
protected void btnUpload_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile && FileUpload1.PostedFile.ContentType == "application/pdf")
{
try
{
string fileName = FileUpload1.FileName;
byte[] fileBytes = FileUpload1.FileBytes;
int maxFileSize = 10 * 1024 * 1024; // 10MB limit
if (fileBytes.Length > maxFileSize)
{
lblMessage.Text = "File size exceeds 10MB limit.";
return;
}
// Validate PDF using IronPDF
using (var stream = new MemoryStream(fileBytes))
{
var testPdf = new IronPdf.PdfDocument(stream);
if (testPdf.PageCount == 0)
{
lblMessage.Text = "Invalid PDF file.";
return;
}
}
string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
string query = "INSERT INTO PdfDocuments (FileName, FileData, FileSize, CreatedBy) " +
"VALUES (@FileName, @FileData, @FileSize, @CreatedBy)";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@FileName", fileName);
cmd.Parameters.AddWithValue("@FileData", fileBytes);
cmd.Parameters.AddWithValue("@FileSize", fileBytes.Length);
cmd.Parameters.AddWithValue("@CreatedBy", User.Identity.Name ?? "Anonymous");
conn.Open();
cmd.ExecuteNonQuery();
}
}
lblMessage.Text = "PDF document uploaded successfully!";
lblFileInfo.Text = $"File: {fileName} ({fileBytes.Length / 1024}KB)";
LoadPdfList();
}
catch (Exception ex)
{
lblMessage.Text = "Error uploading file: " + ex.Message;
}
}
else
{
lblMessage.Text = "Please select a valid PDF file.";
}
}
Imports System
Imports System.IO
Imports System.Data.SqlClient
Imports System.Configuration
Imports IronPdf
Protected Sub btnUpload_Click(sender As Object, e As EventArgs)
If FileUpload1.HasFile AndAlso FileUpload1.PostedFile.ContentType = "application/pdf" Then
Try
Dim fileName As String = FileUpload1.FileName
Dim fileBytes As Byte() = FileUpload1.FileBytes
Dim maxFileSize As Integer = 10 * 1024 * 1024 ' 10MB limit
If fileBytes.Length > maxFileSize Then
lblMessage.Text = "File size exceeds 10MB limit."
Return
End If
' Validate PDF using IronPDF
Using stream As New MemoryStream(fileBytes)
Dim testPdf As New IronPdf.PdfDocument(stream)
If testPdf.PageCount = 0 Then
lblMessage.Text = "Invalid PDF file."
Return
End If
End Using
Dim constr As String = ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString
Using conn As New SqlConnection(constr)
Dim query As String = "INSERT INTO PdfDocuments (FileName, FileData, FileSize, CreatedBy) " &
"VALUES (@FileName, @FileData, @FileSize, @CreatedBy)"
Using cmd As New SqlCommand(query, conn)
cmd.Parameters.AddWithValue("@FileName", fileName)
cmd.Parameters.AddWithValue("@FileData", fileBytes)
cmd.Parameters.AddWithValue("@FileSize", fileBytes.Length)
cmd.Parameters.AddWithValue("@CreatedBy", If(User.Identity.Name, "Anonymous"))
conn.Open()
cmd.ExecuteNonQuery()
End Using
End Using
lblMessage.Text = "PDF document uploaded successfully!"
lblFileInfo.Text = $"File: {fileName} ({fileBytes.Length \ 1024}KB)"
LoadPdfList()
Catch ex As Exception
lblMessage.Text = "Error uploading file: " & ex.Message
End Try
Else
lblMessage.Text = "Please select a valid PDF file."
End If
End Sub
這段程式碼會在上傳文件前驗證文件類型,確保資料庫中只儲存有效的 PDF 文件。 位元組數組轉換透過 FileBytes 屬性自動進行。 其他驗證措施包括檢查PDF文件的完整性和文件大小限制。 使用 IronPDF 開啟位元組數組後再儲存,可以確認該文件是真正的、可解析的 PDF 文檔,而不僅僅是一個重命名了擴展名的文件。
帶有上傳檔案的使用者介面
! ASP.NET Web 應用程式介面,展示了 PDF 上傳功能,包括文件上傳表單和列出已上傳 PDF 文件的表格,以及用於完整文件管理的檢視和下載操作按鈕。
如何從資料庫中檢索和顯示 PDF 文件?
IronPDF 擅長渲染從資料庫擷取的 PDF 文件。 該庫提供了多種選項,可在具有高級渲染功能的瀏覽器中顯示 PDF 內容。 首先,從資料庫表中檢索二進位數據,然後將其傳遞給 IronPDF 進行處理,最後再將其串流回客戶端:
private void LoadPdfList()
{
string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
string query = @"SELECT Id, FileName, FileSize, UploadDate, CreatedBy
FROM PdfDocuments
ORDER BY UploadDate DESC";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
foreach (DataRow row in dt.Rows)
{
int fileSize = Convert.ToInt32(row["FileSize"]);
row["FileSize"] = FormatFileSize(fileSize);
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
}
private string FormatFileSize(int bytes)
{
if (bytes < 1024) return bytes + " B";
if (bytes < 1048576) return (bytes / 1024) + " KB";
return (bytes / 1048576) + " MB";
}
private PdfData GetPdfFromDatabase(int id)
{
byte[] pdfBytes = null;
string filename = "";
string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
string query = "SELECT FileData, FileName FROM PdfDocuments WHERE Id = @Id";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@Id", id);
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
pdfBytes = (byte[])reader["FileData"];
filename = reader["FileName"].ToString();
}
}
}
}
if (pdfBytes != null)
{
return new PdfData { Bytes = pdfBytes, FileName = filename };
}
return null;
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "ViewPdf")
{
int documentId = Convert.ToInt32(e.CommandArgument);
ViewPdfDocument(documentId);
}
else if (e.CommandName == "DownloadPdf")
{
int documentId = Convert.ToInt32(e.CommandArgument);
DownloadPdfDocument(documentId);
}
}
private void ViewPdfDocument(int id)
{
var pdfData = GetPdfFromDatabase(id);
if (pdfData != null)
{
IronPdf.PdfDocument pdf;
using (var stream = new System.IO.MemoryStream(pdfData.Bytes))
{
pdf = new IronPdf.PdfDocument(stream);
}
// Apply security settings
pdf.SecuritySettings.AllowUserPrinting = true;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", $"inline; filename={pdfData.FileName}");
Response.AddHeader("content-length", pdf.BinaryData.Length.ToString());
Response.BinaryWrite(pdf.BinaryData);
Response.End();
}
}
private void LoadPdfList()
{
string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
string query = @"SELECT Id, FileName, FileSize, UploadDate, CreatedBy
FROM PdfDocuments
ORDER BY UploadDate DESC";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
foreach (DataRow row in dt.Rows)
{
int fileSize = Convert.ToInt32(row["FileSize"]);
row["FileSize"] = FormatFileSize(fileSize);
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
}
private string FormatFileSize(int bytes)
{
if (bytes < 1024) return bytes + " B";
if (bytes < 1048576) return (bytes / 1024) + " KB";
return (bytes / 1048576) + " MB";
}
private PdfData GetPdfFromDatabase(int id)
{
byte[] pdfBytes = null;
string filename = "";
string constr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
string query = "SELECT FileData, FileName FROM PdfDocuments WHERE Id = @Id";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@Id", id);
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
pdfBytes = (byte[])reader["FileData"];
filename = reader["FileName"].ToString();
}
}
}
}
if (pdfBytes != null)
{
return new PdfData { Bytes = pdfBytes, FileName = filename };
}
return null;
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "ViewPdf")
{
int documentId = Convert.ToInt32(e.CommandArgument);
ViewPdfDocument(documentId);
}
else if (e.CommandName == "DownloadPdf")
{
int documentId = Convert.ToInt32(e.CommandArgument);
DownloadPdfDocument(documentId);
}
}
private void ViewPdfDocument(int id)
{
var pdfData = GetPdfFromDatabase(id);
if (pdfData != null)
{
IronPdf.PdfDocument pdf;
using (var stream = new System.IO.MemoryStream(pdfData.Bytes))
{
pdf = new IronPdf.PdfDocument(stream);
}
// Apply security settings
pdf.SecuritySettings.AllowUserPrinting = true;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", $"inline; filename={pdfData.FileName}");
Response.AddHeader("content-length", pdf.BinaryData.Length.ToString());
Response.BinaryWrite(pdf.BinaryData);
Response.End();
}
}
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports IronPdf
Private Sub LoadPdfList()
Dim constr As String = ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString
Using conn As New SqlConnection(constr)
Dim query As String = "SELECT Id, FileName, FileSize, UploadDate, CreatedBy FROM PdfDocuments ORDER BY UploadDate DESC"
Using cmd As New SqlCommand(query, conn)
conn.Open()
Dim adapter As New SqlDataAdapter(cmd)
Dim dt As New DataTable()
adapter.Fill(dt)
For Each row As DataRow In dt.Rows
Dim fileSize As Integer = Convert.ToInt32(row("FileSize"))
row("FileSize") = FormatFileSize(fileSize)
Next
GridView1.DataSource = dt
GridView1.DataBind()
End Using
End Using
End Sub
Private Function FormatFileSize(bytes As Integer) As String
If bytes < 1024 Then Return bytes & " B"
If bytes < 1048576 Then Return (bytes \ 1024) & " KB"
Return (bytes \ 1048576) & " MB"
End Function
Private Function GetPdfFromDatabase(id As Integer) As PdfData
Dim pdfBytes As Byte() = Nothing
Dim filename As String = ""
Dim constr As String = ConfigurationManager.ConnectionStrings("DefaultConnection").ConnectionString
Using conn As New SqlConnection(constr)
Dim query As String = "SELECT FileData, FileName FROM PdfDocuments WHERE Id = @Id"
Using cmd As New SqlCommand(query, conn)
cmd.Parameters.AddWithValue("@Id", id)
conn.Open()
Using reader As SqlDataReader = cmd.ExecuteReader()
If reader.Read() Then
pdfBytes = CType(reader("FileData"), Byte())
filename = reader("FileName").ToString()
End If
End Using
End Using
End Using
If pdfBytes IsNot Nothing Then
Return New PdfData With {.Bytes = pdfBytes, .FileName = filename}
End If
Return Nothing
End Function
Protected Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs)
If e.CommandName = "ViewPdf" Then
Dim documentId As Integer = Convert.ToInt32(e.CommandArgument)
ViewPdfDocument(documentId)
ElseIf e.CommandName = "DownloadPdf" Then
Dim documentId As Integer = Convert.ToInt32(e.CommandArgument)
DownloadPdfDocument(documentId)
End If
End Sub
Private Sub ViewPdfDocument(id As Integer)
Dim pdfData = GetPdfFromDatabase(id)
If pdfData IsNot Nothing Then
Dim pdf As PdfDocument
Using stream As New MemoryStream(pdfData.Bytes)
pdf = New PdfDocument(stream)
End Using
' Apply security settings
pdf.SecuritySettings.AllowUserPrinting = True
pdf.SecuritySettings.AllowUserCopyPasteContent = False
Response.Clear()
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", $"inline; filename={pdfData.FileName}")
Response.AddHeader("content-length", pdf.BinaryData.Length.ToString())
Response.BinaryWrite(pdf.BinaryData)
Response.End()
End If
End Sub
ViewPdfDocument 方法將文件串流回客戶端,並套用適當的安全設定。 inline 內容處置方式告訴瀏覽器顯示 PDF 而非提示下載。 您可以調整列印權限和複製貼上限制等安全性設置,以符合您的文件策略要求。
如何處理PDF渲染參數?
SQL 命令的參數對於透過主鍵安全地檢索特定 PDF 檔案至關重要。 參數化查詢可防止 SQL 注入攻擊,並確保正確的資料綁定。 在檢索二進位資料後,IronPDF 會從 MemoryStream 載入它,讓您可以完全存取文件物件以進行進一步操作,然後再將其傳送到瀏覽器。
查看已上傳的PDF文件
PDF 檢視器介面顯示一份名為"什麼是 PDF?"的文檔,其中包含關於便攜式文檔格式的解釋性文字,以 100% 縮放比例顯示,並帶有導航控制項和多頁支援指示器。
在顯示 PDF 文件之前,可以添加哪些高級功能?
IronPDF 的 PDF 處理功能不僅限於簡單的顯示。 您可以在渲染 PDF 文件之前對其進行操作,例如添加浮水印、頁首和頁尾以及數位簽名:
// Add a confidentiality watermark before displaying
pdf.ApplyWatermark("<h2 style='color:red; font-family:Arial'>CONFIDENTIAL</h2>",
rotation: 30,
opacity: 50);
// Add page numbers in the footer
pdf.AddTextHeaders("{page} of {total-pages}",
IronPdf.Editing.TextHeaderFooter.DisplayLocation.BottomCenter);
// Add document metadata
pdf.MetaData.Author = "Your Application";
pdf.MetaData.ModifiedDate = DateTime.Now;
// Add a confidentiality watermark before displaying
pdf.ApplyWatermark("<h2 style='color:red; font-family:Arial'>CONFIDENTIAL</h2>",
rotation: 30,
opacity: 50);
// Add page numbers in the footer
pdf.AddTextHeaders("{page} of {total-pages}",
IronPdf.Editing.TextHeaderFooter.DisplayLocation.BottomCenter);
// Add document metadata
pdf.MetaData.Author = "Your Application";
pdf.MetaData.ModifiedDate = DateTime.Now;
' Add a confidentiality watermark before displaying
pdf.ApplyWatermark("<h2 style='color:red; font-family:Arial'>CONFIDENTIAL</h2>",
rotation:=30,
opacity:=50)
' Add page numbers in the footer
pdf.AddTextHeaders("{page} of {total-pages}",
IronPdf.Editing.TextHeaderFooter.DisplayLocation.BottomCenter)
' Add document metadata
pdf.MetaData.Author = "Your Application"
pdf.MetaData.ModifiedDate = DateTime.Now
查看帶有浮水印的 PDF 文件
! PDF 檢視器正在顯示一份關於"什麼是 PDF?"的文檔,其中包含詳細的文字內容和一個斜角"機密"浮水印,以展示 IronPDF 的文件安全浮水印功能。
水印在顯示使用者應該查看但不應該逐字複製的文件時特別有用。 您也可以在顯示 PDF 之前提取文字以建立搜尋索引,或將特定頁面轉換為圖像以產生縮圖。
為什麼這種方法在生產應用上效果很好?
將 ADO.NET 與 IronPDF 結合使用,可以提供一個簡單易用的模式,從小型內部工具擴展到企業文件管理系統。 該方法完全在伺服器端進行——不需要客戶端 PDF 渲染庫,一旦返回正確的 MIME 類型,瀏覽器的內建 PDF 檢視器就會處理顯示。
這種模式的主要優勢在於:
-上傳時進行驗證:IronPDF 在文件到達資料庫之前開啟文件,立即拒絕損壞或非 PDF 文件。 -檢視時的安全控制:IronPDF 會在位元組到達瀏覽器之前強制執行列印和複製貼上等權限。 -最少的客戶端程式碼:瀏覽器原生處理渲染,降低了 JavaScript 的複雜度。 -靈活的預處理:您可以將HTML 字串套用至 PDF 轉換,使用合併和分割作業合併文檔,或在串流之前新增自訂浮水印——所有這些都可以在同一個伺服器端方法中完成。
你們如何處理瀏覽器整合和下載選項?
為了更好地與 Web 集成,請使用 JavaScript 在新標籤頁中開啟文檔,而不是取代當前頁面。 這樣可以為使用者提供更好的瀏覽文件清單的體驗:
function openPdfInNewTab(documentId) {
window.open('/PdfHandler.ashx?id=' + documentId, '_blank');
}
function openPdfInModal(documentId) {
var modal = document.getElementById('pdfModal');
var iframe = document.getElementById('pdfFrame');
iframe.src = '/PdfHandler.ashx?id=' + documentId;
modal.style.display = 'block';
}
function openPdfInNewTab(documentId) {
window.open('/PdfHandler.ashx?id=' + documentId, '_blank');
}
function openPdfInModal(documentId) {
var modal = document.getElementById('pdfModal');
var iframe = document.getElementById('pdfFrame');
iframe.src = '/PdfHandler.ashx?id=' + documentId;
modal.style.display = 'block';
}
下載路徑遵循相同的資料庫檢索邏輯,但使用 attachment 而不是 inline 作為內容處置方式。 這樣會強制瀏覽器儲存檔案而不是顯示檔案。 兩條路徑共享同一個 GetPdfFromDatabase 輔助函數,維持資料存取碼的 DRY 特性。
對於基於表單的文件工作流程,請探索 IronPDF 的PDF 表單填寫功能——您可以在顯示或下載文件之前預先填入表單字段,這對於發票產生和合約管理場景非常有用。
PDF 服務的安全注意事項有哪些?
在提供位元組之前,請務必驗證請求使用者是否有權存取所請求的文件 ID。 查詢字串中的簡單整數 ID 很容易枚舉——如果沒有授權檢查,任何經過驗證的使用者都可以透過猜測 ID 查看任何文件。
最佳實踐包括:
- 儲存
CreatedBy或OwnerId列,並在查詢FileData之前,根據目前使用者身分對其進行驗證。 - 使用 GUID 而不是順序整數作為文檔標識符,使枚舉變得不切實際。
- 在上傳時對高度敏感的文件套用PDF 密碼保護,這樣即使在您的應用程式之外存取文件,文件本身也會受到保護。
- 記錄所有檢視和下載事件,以便進行稽核追蹤。
有關 ASP.NET 安全模式的外部參考資料, OWASP ASP.NET 安全速查表和Microsoft 的 ASP.NET 安全編碼指南提供了權威指導。 IronPdf 的 NuGet 庫條目也記錄了版本歷史記錄和依賴項。
如何開始使用 PDF 資料庫顯示?
要將此解決方案應用到您自己的專案中:
- 透過 NuGet 安裝 IronPDF(
Install-Package IronPdf或dotnet add package IronPdf)。 - 使用上面的 SQL 架構建立
PdfDocuments表。 - 將上傳處理程序新增至您的 .aspx 程式碼隱藏檔案中。
- 新增透過 IronPDF 傳輸位元組的檢視和下載處理程序。
- 將 GridView 與指向處理程序的行命令連接起來。
您可以探索IronPDF 的全部功能集,發現更多功能,例如HTML 到 PDF 轉換以及PDF 合併和拆分,這些功能自然地融入文件管理工作流程中。 在購買許可證之前,先開始免費試用,測試完整的 API 功能。
常見問題解答
在 ASP.NET 中顯示資料庫中的 PDF 檔案的主要目的是什麼?
主要目標是為開發人員提供有效的方法,以便在 ASP.NET Web 應用程式中直接從資料庫顯示 PDF,從而增強專案的功能和使用者體驗。
IronPDF 如何協助在 ASP.NET 中顯示資料庫中的 PDF 檔案?
IronPDF 提供強大的程式庫,使開發人員能夠從資料庫儲存無縫渲染 PDF,從而簡化流程,確保與 ASP.NET 應用程式的順利整合。
在 ASP.NET 中使用 IronPDF 顯示 PDF 檔案有哪些優勢?
使用 IronPDF 具有易於整合、高品質渲染和支援各種 PDF 功能等優勢,可顯著提高 ASP.NET 應用程式的可用性和效能。
IronPDF能否有效率地處理資料庫中的大型PDF檔案?
是的,IronPDF 旨在有效處理大型 PDF 文件,確保快速載入和渲染時間,這對於保持應用程式效能至關重要。
是否可以使用 ASP.NET 中的 IronPDF 自訂 PDF 顯示?
當然,IronPDF 提供了各種自訂選項,可讓開發人員在 ASP.NET 環境中根據其特定要求自訂 PDF 顯示。
IronPDF 可以將哪些文件格式轉換為 ASP.NET 應用程式中的 PDF 檔案?
IronPDF 支援將各種文件格式(例如 HTML、圖像等)轉換為 PDF,這對於 ASP.NET 應用程式中的動態內容產生尤其有用。
IronPDF 是否支援 ASP.NET 應用程式的安全 PDF 處理?
是的,IronPDF 支援安全的 PDF 處理,包括加密和密碼保護,這有助於保護 ASP.NET 應用程式中的敏感資訊。
IronPDF 能否與其他 Iron Software 產品整合以增強功能?
是的,IronPDF 可以與其他 Iron Software 產品(如 IronOCR 和 IronBarcode)集成,為 ASP.NET 應用程式中的文件管理和處理提供全面的解決方案。



