푸터 콘텐츠로 바로가기
IRONPDF 사용하기

데이터베이스에서 ASP.NET으로 PDF 표시 (개발자 가이드)

ASP.NET에서 데이터베이스에서 PDF를 표시하려면 저장된 바이너리 데이터를 검색하여 IronPDF의 PdfDocument 클래스를 사용하여 렌더링하십시오, 이 클래스는 바이트 배열을 효율적으로 처리하고 사용자 지정 옵션이 있는 브라우저 호환 출력을 제공합니다.

ASP.NET에서의 PDF 데이터베이스 표시란 무엇인가요?

ASP.NET 애플리케이션에서 PDF 문서를 관리할 때 PDF 파일을 파일 시스템이 아닌 데이터베이스에 직접 저장하는 경우가 많습니다. 이 방법은 보안성이 높고, 중앙 집중화된 백업을 제공하며, 배포를 간소화합니다. 그러나 적절한 도구 없이 데이터베이스에서 PDF 문서를 검색하고 표시하는 것은 어려울 수 있습니다.

데이터베이스 테이블에 PDF 파일을 바이너리 데이터로 저장하면 문서 접근과 버전 제어를 더 잘 관리할 수 있습니다. 사용자에게 PDF 문서를 표시해야 할 때 데이터베이스에서 바이트 배열을 효율적으로 검색하고 브라우저에 렌더링해야 합니다. IronPDF는 ASP.NET 애플리케이션에서 PDF 문서를 처리하기 위한 효과적인 API로 이 전체 과정을 간소화합니다.

이 튜토리얼은 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
SHELL

프로젝트의 찾아보기 탭에서 IronPdf를 검색하여 NuGet 패키지 관리자 UI를 통해 IronPDF를 설치할 수도 있습니다. 설치 후 응용 프로그램 시작 시 라이선스 키를 설정하세요:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
$vbLabelText   $csharpLabel

무료 체험 라이선스는 평가 동안 모든 기능에 대한 전체 액세스를 제공합니다. 운영 배포를 위해, 사용 가능한 라이선스 계층을 검토하여 프로젝트 규모에 맞는 옵션을 찾으십시오.

어떤 데이터베이스 구조가 요구되나요?

데이터베이스 테이블 구조에 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
$vbLabelText   $csharpLabel

데이터베이스 연결을 설정하려면 web.config 파일에서 연결 문자열을 구성하세요. PDF 뷰어 구현은 이 연결을 사용하여 데이터베이스에서 업로드된 파일을 검색하고 PDF 콘텐츠를 원활하게 표시합니다.

해결책에는 어떤 네임스페이스가 필요합니까?

해결책은 IronPDF 네임스페이스와 함께 표준 ADO.NET 네임스페이스를 사용합니다. 서드파티 ORM이 필요 없습니다 -- 직접 ADO.NET 접근은 종속성을 최소화하고 쿼리 실행에 대한 완전한 제어를 제공합니다. 연결 문자열이 PDF 저장 테이블이 있는 SQL 서버 인스턴스를 가리키고 있는지 확인하세요.

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) 데이터 유형은 최대 2GB까지 파일을 저장할 수 있으며, 대부분의 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 파일의 경우, 데이터베이스 저장이 아키텍처에 적합한지, 아니면 파일을 디스크나 객체 저장소에 저장하고 메타데이터만 데이터베이스에 저장하는 하이브리드 접근 방식을 사용하는 것이 더 효율적인지 고려하십시오.

PDF 저장 전략 비교
전략 최적의 용도 장점 고려 사항
데이터베이스 (VARBINARY) 작은 파일에서 중간 크기 파일까지, 높은 보안성 거래 일관성, 중앙 집중식 백업 데이터베이스 크기가 빠르게 증가할 수 있음
파일 시스템 큰 파일, 높은 처리량 빠른 파일 IO, 낮은 데이터베이스 오버헤드 별도의 백업 전략이 필요함
객체 저장소 (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>
HTML

예제 UI 출력

'파일 선택' 버튼과 'PDF 업로드' 버튼이 있는 PDF 업로드 양식과 문서 관리를 위한 아래의 빈 PDF 문서 목록 섹션이 표시된 ASP.NET 웹 애플리케이션 인터페이스

파일 업로드 이벤트를 처리하는 방법은?

업로드 버튼이 서버 측 이벤트 핸들러를 트리거합니다. 여기서는 업로드된 파일을 바이트 배열로 변환하고 적절한 오류 처리를 통해 저장하는 업로드 기능의 전체 구현입니다:

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
$vbLabelText   $csharpLabel

이 코드는 파일 유형을 업로드 전에 검증하여, 데이터베이스에 유효한 PDF 파일만 저장되도록 보장합니다. 바이트 배열 변환은 FileBytes 속성을 통해 자동으로 이루어집니다. 추가 검증에는 PDF 무결성 및 파일 크기 제한 확인이 포함됩니다. IronPDF를 사용하여 저장하기 전에 바이트 배열을 열어 파일이 실제로 파싱 가능한 PDF 문서인지 확인하여 단지 확장자만 변경된 파일이 아님을 확인합니다.

업로드된 파일이 있는 UI

파일 업로드 양식과 전체 문서 관리를 위한 보기 및 다운로드 작업 버튼과 함께 업로드된 PDF 문서 목록 표를 보여주는 PDF 업로드 기능을 갖춘 ASP.NET 웹 애플리케이션 인터페이스

데이터베이스에서 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
$vbLabelText   $csharpLabel

ViewPdfDocument 방식은 적절한 보안 설정이 적용된 상태로 문서를 클라이언트로 다시 스트리밍합니다. inline 콘텐츠 처리는 브라우저에 다운로드를 요청하는 대신 PDF를 표시하도록 지시합니다. 보안 설정을 조정하여 인쇄 권한 및 복사-붙여넣기 제한이 문서 정책 요구 사항에 맞도록 할 수 있습니다.

PDF 렌더링 매개변수를 처리하는 방법은?

SQL 명령의 매개변수는 주 키로 특정 PDF를 안전하게 검색하기 위해 매우 중요합니다. 매개변수화된 쿼리는 SQL 삽입 공격을 방지하고 올바른 데이터 바인딩을 보장합니다. 바이너리 데이터를 검색한 후 IronPDF는 MemoryStream에서 데이터를 로드하여 브라우저로 보내기 전에 추가 조작을 위해 문서 개체에 대한 전체 액세스 권한을 부여합니다.

업로드된 PDF 파일 보기

'PDF란 무엇인가요?"라는 제목의 문서와 휴대용 문서 형식에 대한 설명 텍스트가 탐색 컨트롤 및 다중 페이지 지원 표시기와 함께 100% 줌으로 표시되는 PDF 뷰어 인터페이스

표시 전에 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
$vbLabelText   $csharpLabel

워터마크가 있는 PDF 보기

'PDF란 무엇인가요'에 대한 문서를 자세한 텍스트 내용과 함께 표시하는 PDF 뷰어와 문서 보안을 위한 IronPDF의 워터마킹 기능을 보여주는 대각선 'CONFIDENTIAL' 워터마크

워터마크는 사용자가 확인해야 하지만 문자 그대로 재생산해서는 안 되는 문서를 표시할 때 특히 유용합니다. PDF를 표시하기 전에 텍스트를 추출하여 검색 인덱스를 구축하거나 특정 페이지를 썸네일 생성 목적으로 이미지로 변환할 수도 있습니다.

이 접근 방식이 생산 애플리케이션에 잘 맞는 이유는 무엇입니까?

ADO.NET과 IronPDF를 결합하면 작은 내부 도구에서 대규모 기업 문서 관리 시스템까지 확장할 수 있는 간단한 패턴을 제공합니다. 이 접근 방식은 완전히 서버 측이며, 클라이언트 측 PDF 렌더링 라이브러리가 필요하지 않습니다. 올바른 MIME 유형이 반환되면 브라우저의 내장된 PDF 뷰어가 디스플레이를 처리합니다.

이 패턴의 주요 강점은 다음과 같습니다:

  • 업로드 시 유효성 검사: IronPDF는 파일이 데이터베이스에 도달하기 전에 열어서 손상되었거나 PDF가 아닌 파일을 즉시 거부합니다.
  • 보기 시 보안 제어: IronPDF는 바이트가 브라우저에 도달하기 전에 인쇄 및 복사 붙여넣기와 같은 권한을 시행합니다.
  • 최소한의 클라이언트 측 코드: 브라우저는 네이티브로 렌더링을 처리하므로 JavaScript 복잡성을 줄입니다.
  • 유연한 전처리: 서버 측 메서드 내에서 HTML 문자열을 PDF로 변환 하거나 병합 및 분할 작업으로 문서를 병합하거나 맞춤 워터마크 추가를 적용할 수 있습니다.

브라우저 통합 및 다운로드 옵션은 어떻게 처리합니까?

더 나은 웹 통합을 위해 현재 페이지를 대체하는 대신 새 탭에서 문서를 열도록 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';
}
JAVASCRIPT

다운로드 경로는 동일한 데이터베이스 검색 로직을 따르지만 콘텐츠 처분으로 attachment 대신 inline를 사용합니다. 이렇게 하면 브라우저가 파일을 표시하는 대신 저장하도록 강제합니다. 두 경로 모두 동일한 GetPdfFromDatabase 헬퍼를 공유하며 데이터 액세스 코드를 DRY로 유지합니다.

양식 기반 문서 워크플로를 위해 IronPDF의 PDF 양식 채우기 기능을 탐색해 보세요. 문서를 표시하거나 다운로드하기 전에 양식 필드를 미리 채우는 것은 청구서 생성 및 계약 관리 시나리오에서 유용합니다.

PDF 제공을 위한 보안 고려 사항은 무엇입니까?

항상 요청 사용자가 요청된 문서 ID에 액세스할 권한이 있는지 확인한 후 바이트를 제공하세요. 쿼리 문자열의 간단한 정수 ID는 열거하기 쉽습니다. 인증 검사 없이 인증된 사용자는 ID를 추측하여 모든 문서를 볼 수 있습니다.

모범 사례는 다음과 같습니다:

  • 코드 1879--@@ 또는 @@--코드 1880--@@ 열을 저장하고 @@--코드 1881--@@을 쿼리하기 전에 현재 사용자 ID와 대조하여 확인합니다.
  • 문서 식별자로 순차적인 정수 대신 GUID를 사용하여 열거를 어렵게 만듭니다.
  • 매우 민감한 문서의 경우 파일 자체가 애플리케이션 외부에서 액세스되더라도 보호되도록 업로드 시 PDF 비밀번호 보호를 적용하세요.
  • 감사 기록을 위해 모든 보기 및 다운로드 이벤트를 기록하세요.

ASP.NET 보안 패턴에 대한 외부 참조의 경우 OWASP ASP.NET 보안 치트 시트Microsoft의 ASP.NET 보안을 위한 안전한 코딩 지침이 권위 있는 지침을 제공합니다. IronPdf의 NuGet 갤러리 항목에는 버전 기록과 종속성도 문서화되어 있습니다.

PDF 데이터베이스 디스플레이를 어떻게 시작합니까?

이 솔루션을 자신만의 프로젝트에 구현하기 위해:

  1. NuGet(Install-Package IronPdf 또는 dotnet add package IronPdf)을 통해 IronPDF를 설치하세요.
  2. 위의 SQL 스키마를 사용하여 PdfDocuments 테이블을 만듭니다.
  3. .aspx 코드 비하인드에 업로드 핸들러를 추가합니다.
  4. IronPDF를 통해 바이트를 스트리밍하는 보기 및 다운로드 핸들러를 추가합니다.
  5. 핸들러를 가리키는 행 명령으로 GridView를 연결합니다.

전체 IronPDF 기능 세트를 탐색하여 HTML에서 PDF로 변환PDF 병합 및 분할과 같은 문서 관리 워크플로에 자연스럽게 들어맞는 추가 기능을 발견할 수 있습니다. 무료 체험판을 시작하여 라이선스를 구입하기 전에 전체 API를 테스트하세요.

자주 묻는 질문

ASP.NET에서 데이터베이스의 PDF를 표시하는 주요 초점은 무엇입니까?

주요 초점은 개발자에게 데이터베이스에서 직접 PDF를 ASP.NET 웹 애플리케이션 내에서 표시할 수 있는 효과적인 방법을 제공하여 프로젝트의 기능성과 사용자 경험을 향상시키는 것입니다.

IronPDF는 ASP.NET에서 데이터베이스의 PDF를 표시하는 데 어떻게 도움이 될 수 있습니까?

IronPDF는 강력한 라이브러리를 제공하여 데이터베이스 저장소에서 PDF를 매끄럽게 렌더링할 수 있게 함으로써 ASP.NET 애플리케이션과의 원활한 통합을 보장하여 과정을 간소화할 수 있습니다.

ASP.NET에서 PDF 표시를 위해 IronPDF를 사용하는 장점은 무엇입니까?

IronPDF 사용은 쉬운 통합, 고품질 렌더링 및 다양한 PDF 기능 지원과 같은 장점을 제공하며, 이는 ASP.NET 애플리케이션의 사용성 및 성능을 크게 향상시킬 수 있습니다.

IronPDF는 데이터베이스에서 큰 PDF 파일을 효율적으로 처리할 수 있습니까?

예, IronPDF는 큰 PDF 파일을 효율적으로 처리하도록 설계되어, 애플리케이션 성능을 유지하기 위해 중요한 빠른 로딩 및 렌더링 시간을 보장합니다.

ASP.NET에서 IronPDF를 사용하여 PDF 표시를 사용자 지정할 수 있습니까?

물론입니다, IronPDF는 다양한 사용자 지정 옵션을 제공하여 개발자가 특정 요구 사항에 따라 ASP.NET 환경 내에서 PDF 표시를 맞춤화할 수 있도록 합니다.

ASP.NET 애플리케이션에서 IronPDF는 어떤 파일 형식을 PDF로 변환할 수 있습니까?

IronPDF는 HTML, 이미지 등 다양한 파일 형식을 지원하며, 이는 ASP.NET 애플리케이션에서 동적 콘텐츠 생성에 특히 유용할 수 있습니다.

IronPDF는 ASP.NET 애플리케이션을 위한 안전한 PDF 처리를 지원합니까?

예, IronPDF는 암호화 및 비밀번호 보호를 포함한 안전한 PDF 처리를 지원하여, ASP.NET 애플리케이션 내에서 민감한 정보를 보호하는 데 도움을 줍니다.

IronPDF는 기능 강화를 위해 다른 Iron Software 제품과 통합될 수 있습니까?

예, IronPDF는 IronOCR 및 IronBarcode와 같은 Iron Software의 다른 제품과 통합되어 ASP.NET 애플리케이션에서 문서 관리 및 처리를 위한 포괄적인 솔루션을 제공할 수 있습니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해