푸터 콘텐츠로 바로가기
마이그레이션 가이드

Adobe PDF Library SDK에서 IronPDF로 마이그레이션하는 방법

Adobe PDF Library SDK (APDFL)는 Adobe로부터 라이선스를 받아 Datalogics에서 배포하며, Acrobat 엔진과 코어 소스 코드를 공유합니다. 이는 강력하지만 판매 주도 가격 모델, 본국 런타임 크기, 내장 HTML-to-PDF 렌더러 부족, 낮은 수준의 API 설계로 인해 여러 .NET 팀들이 대안을 찾고자 합니다. 이 가이드는 Adobe PDF Library SDK에서 IronPDF로의 단계적 마이그레이션 경로를 제공합니다 — .NET Framework 4.6.2에서 .NET 9까지를 지원하는 현대적인 .NET PDF 라이브러리입니다.

Adobe PDF Library SDK에서 벗어나는 것을 고려해야 하는 이유는 무엇입니까?

APDFL은 Acrobat에 뿌리를 둔 PDF 엔진을 제공하지만, HTML-to-PDF, 문서 조작 및 보고서 생성에 대한 대안을 탐색하는 개발 팀은 여러 요인을 고려합니다.

판매 주도 맞춤형 가격 책정

Datalogics는 APDFL에 대한 목록 가격을 공개하지 않습니다. Datalogics의 가격 페이지에 따르면, 내부 사용 계획은 연간 약 $5,999부터 시작하며, OEM, ISV, SaaS 배포는 플랫폼별 비용 및 로열티 또는 수익 공유로 협상합니다. 총 비용은 주로 중소 규모 팀에게는 도달할 수 없는 수준이며, 거의 항상 판매 대화가 필요합니다.

복잡한 네이티브 SDK 통합

APDFL은 Acrobat과 계통을 공유하는 네이티브 C/C++ 엔진을 래핑합니다. .NET 바인딩 (Datalogics.PDFL)은 플랫폼별 런타임 바이너리를 필요로 합니다 — Adobe.PDF.Library.LM.NET NuGet 패키지는 x64 Windows, Linux, macOS ARM 페이로드를 제공합니다 — 주의 깊은 메모리 관리와 명확한 Library 라이프사이클이 각 진입점에서 필요합니다. 이것은 개발 오버헤드를 추가하고 CI/CD 파이프라인을 복잡하게 만듭니다.

내장 HTML 렌더러 없음

APDFL의 문서화된 변환 목록은 PDF/A, PDF/X, ZUGFeRD, EPS, PS, XPS 및 Office 형식을 다루지만, HTML은 다루지 않습니다. APDFL만으로 HTML 문자열에서 PDF를 생성하는 것은 페이지, 글꼴 및 콘텐츠 실행을 수작업으로 구성하거나 APDFL과 별도의 HTML 렌더링 엔진을 결합하는 것을 의미합니다.

저수준 API 설계

APDFL로 PDF를 생성하는 것은 페이지, 콘텐츠 스트림, 텍스트 실행 및 글꼴을 프로그래밍적으로 구성하는 것을 포함합니다. HTML 문자열을 렌더링하는 것과 같은 단순 작업도 다단계 작업이 되어 좌표 계산, 글꼴 포함 및 수동 콘텐츠 요소 관리가 필요합니다.

라이브러리 수명주기 관리 오버헤드

모든 진입점은 using (var lib = new Library()) (또는 Library.Initialize() / Library.Terminate() 호출)를 포함하는 코드를 래핑하고 내부에서 생성된 모든 PDF 객체의 주의 깊은 처리를 요구합니다. 정리 작업을 놓치면 리소스 누수가 발생할 수 있습니다.

많은 프로젝트에 과도한 대응

주로 HTML-to-PDF 변환, 기본 문서 조작 또는 보고서 생성을 필요로 하는 애플리케이션의 경우, 전체 Acrobat 파생 엔진은 종종 작업량 이상의 것을 제공합니다.

Adobe PDF Library SDK와 IronPDF: 주요 차이점

이러한 라이브러리 간의 근본적인 아키텍처 차이를 이해하면 효과적인 마이그레이션 전략을 계획하는 데 도움이 됩니다.

측면 Adobe PDF Library SDK IronPDF
가격 영업 주도; 내부 사용은 연간 ~$5,999부터 시작하며, 상위에 OEM/SaaS 로열티 추가 개발자당 / 배포당 투명
설치 Adobe.PDF.Library.LM.NET는 플랫폼별 네이티브 런타임을 제공합니다 간단한 NuGet 패키지
문서 생성 저수준 페이지/콘텐츠 구성 HTML/CSS 렌더링
HTML to PDF 내장되어 있지 않음 ChromePdfRenderer.RenderHtmlAsPdf
초기화 using (Library lib = new Library()) 필요 자동
좌표계 포스트스크립트 포인트, 좌하단 원점 CSS 기반 레이아웃
폰트 처리 수동 임베딩 필요 자동
메모리 관리 모든 PDF 객체의 수동 폐기 필수 표준 IDisposable 패턴
비동기 지원 사용 불가 완전한 async/await 지원

이전 준비

필수 조건

마이그레이션을 시작하기 전에 환경이 이러한 요구 사항을 충족하는지 확인하십시오:

  • .NET Framework 4.6.2+ 또는 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 또는 JetBrains Rider
  • NuGet 패키지 관리자 접근 -IronPDF라이선스 키 (ironpdf.com에서 무료 체험판 제공)

Adobe PDF Library SDK사용 감사

해당 솔루션 디렉토리에서 이러한 명령어를 실행하여 모든Adobe PDF Library SDK참조를 식별하십시오:

grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
SHELL

예상해야 할 주요 변경사항

카테고리 Adobe PDF Library SDK IronPDF 마이그레이션 조치
초기화 Library.Initialize() / Terminate() 자동 수명주기 코드를 제거하십시오
문서 생성 페이지 구성과 함께 new Document() ChromePdfRenderer HTML 렌더링 사용
좌표 시스템 포스트스크립트 포인트, 좌하단 원점 CSS 기반 레이아웃 HTML/CSS 사용
폰트 처리 수동 Font 생성 및 내장 자동 폰트 코드를 제거하십시오
메모리 관리 COM 객체의 수동 디스포설 표준 IDisposable using 구문 사용
페이지 구성 CreatePage(), AddContent() HTML에서 자동 상당히 간소화

단계별 마이그레이션 프로세스

1단계: NuGet 패키지 업데이트

Adobe PDF Library SDK 패키지를 제거하고 IronPDF를 설치하십시오:

# Remove Adobe PDF Library (.NET 6/7/8 projects)
dotnet remove package Adobe.PDF.Library.LM.NET
# .NET Framework projects use the LM.NETFramework variant
dotnet remove package Adobe.PDF.Library.LM.NETFramework

# Install IronPDF
dotnet add package IronPdf
# Remove Adobe PDF Library (.NET 6/7/8 projects)
dotnet remove package Adobe.PDF.Library.LM.NET
# .NET Framework projects use the LM.NETFramework variant
dotnet remove package Adobe.PDF.Library.LM.NETFramework

# Install IronPDF
dotnet add package IronPdf
SHELL

2단계: 라이선스 키 구성

Adobe의 라이선스를 IronPDF의 코드 기반 라이선스 키로 교체하십시오:

// Replace Adobe's Library.LicenseKey withIronPDF license
// Add at application startup, before anyIronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
// Replace Adobe's Library.LicenseKey withIronPDF license
// Add at application startup, before anyIronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
' Replace Adobe's Library.LicenseKey with IronPDF license
' Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"

' Verify license status
Dim isLicensed As Boolean = IronPdf.License.IsLicensed
$vbLabelText   $csharpLabel

3단계: 네임스페이스 참조 업데이트

솔루션 전체에서 전역 찾기 및 대체를 수행하세요:

찾기 바꾸기
using Datalogics.PDFL; using IronPdf;

APDFL은 단일 루트 네임스페이스, Datalogics.PDFL,을 제공합니다. Document, Page, Content, Font, 및 Color, 모두 그 네임스페이스 내부의 클래스입니다, 그래서 교체할 using 지시어가 한 개만 있습니다.

4단계: 라이브러리 라이프사이클 코드 제거

가장 중요한 간소화 중 하나는 초기화 및 종료 패턴을 제거하는 것입니다:

//Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize();
try
{
    // PDF operations
}
finally
{
    Library.Terminate(); // Must always terminate
}

//IronPDF- Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
//Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize();
try
{
    // PDF operations
}
finally
{
    Library.Terminate(); // Must always terminate
}

//IronPDF- Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
'Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize()
Try
    ' PDF operations
Finally
    Library.Terminate() ' Must always terminate
End Try

'IronPDF- Just use directly
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

완전한 API 마이그레이션 참조

라이브러리 라이프사이클 메서드

Adobe 방법 IronPDF 동등
Library.Initialize() 필요 없음
Library.Terminate() 필요 없음
Library.LicenseKey = "KEY" IronPdf.License.LicenseKey = "KEY"
using (Library lib = new Library()) 필요 없음

문서 생성 방법

Adobe 방법 IronPDF 메소드
new Document() new ChromePdfRenderer()
new Document(path) PdfDocument.FromFile(path)
doc.CreatePage(index, rect) HTML에서 자동
doc.Save(SaveFlags.Full, path) pdf.SaveAs(path)
doc.NumPages pdf.PageCount
doc.GetPage(index) pdf.Pages[index]
doc.InsertPages(insertAfter, src, start, count, flags) PdfDocument.Merge(pdfs)

콘텐츠 생성 (주요 패러다임 변화)

Adobe PDF Library SDK는 저수준 콘텐츠 구성을 요구합니다. IronPDF는 HTML/CSS를 사용합니다:

Adobe 방법 IronPDF 메소드
new Text() HTML <p>, <h1> 등 사용
text.AddRun(textRun) HTML을 사용합니다.
new TextRun(text, font, size, point) CSS 스타일링
new Font(name, flags) CSS font-family
new Image(path) HTML <img> 태그
content.AddElement(...) HTML 콘텐츠
page.UpdateContent() 필요 없음

워터마크 및 보안 메서드

Adobe 방법 IronPDF 메소드
doc.Watermark(textParams, wmParams) pdf.ApplyWatermark(html)
WatermarkParams.Opacity (0.0-1.0) opacity 매개변수 (0-100) 또는 CSS opacity
new EncryptionHandler(user, owner, perms) pdf.SecuritySettings
PermissionFlags.PrintDoc AllowUserPrinting

텍스트 추출

Adobe 방법 IronPDF 메소드
new WordFinder(doc, config) pdf.ExtractAllText()
wordFinder.GetWordList() pdf.Pages[i].Text
복잡한 단어/문자 반복 단일 메서드 호출

코드 마이그레이션 예제

HTML을 PDF로 변환

APDFL은 내장된 HTML 렌더러가 없습니다. HTML 문서가 생성할 레이아웃을 모방하기 위해 핸들로 페이지와 콘텐츠 실행을 구성하거나 APDFL을 별도의 HTML-to-PDF 엔진과 결합하는 것이 가장 비슷한 대안입니다.

Adobe PDF Library SDK 구현:

//Adobe PDF Library SDK(Datalogics APDFL)
// NuGet: Adobe.PDF.Library.LM.NET — namespace Datalogics.PDFL
using Datalogics.PDFL;
using System;

class AdobeHtmlToPdf
{
    static void Main()
    {
        using (Library lib = new Library())
        using (Document doc = new Document())
        {
            // US Letter in points (8.5 x 11 inches @ 72 DPI)
            Rect pageRect = new Rect(0, 0, 612, 792);
            using (Page page = doc.CreatePage(Document.BeforeFirstPage, pageRect))
            {
                Content content = page.Content;
                Font font = new Font("Helvetica", FontCreateFlags.Embedded);

                Text text = new Text();
                text.AddRun(new TextRun("Hello World", font, 24, new Point(72, 720)));
                content.AddElement(text);

                page.UpdateContent();
            }

            doc.Save(SaveFlags.Full, "output.pdf");
        }
    }
}
//Adobe PDF Library SDK(Datalogics APDFL)
// NuGet: Adobe.PDF.Library.LM.NET — namespace Datalogics.PDFL
using Datalogics.PDFL;
using System;

class AdobeHtmlToPdf
{
    static void Main()
    {
        using (Library lib = new Library())
        using (Document doc = new Document())
        {
            // US Letter in points (8.5 x 11 inches @ 72 DPI)
            Rect pageRect = new Rect(0, 0, 612, 792);
            using (Page page = doc.CreatePage(Document.BeforeFirstPage, pageRect))
            {
                Content content = page.Content;
                Font font = new Font("Helvetica", FontCreateFlags.Embedded);

                Text text = new Text();
                text.AddRun(new TextRun("Hello World", font, 24, new Point(72, 720)));
                content.AddElement(text);

                page.UpdateContent();
            }

            doc.Save(SaveFlags.Full, "output.pdf");
        }
    }
}
Imports Datalogics.PDFL
Imports System

Class AdobeHtmlToPdf
    Shared Sub Main()
        Using lib As New Library()
            Using doc As New Document()
                ' US Letter in points (8.5 x 11 inches @ 72 DPI)
                Dim pageRect As New Rect(0, 0, 612, 792)
                Using page As Page = doc.CreatePage(Document.BeforeFirstPage, pageRect)
                    Dim content As Content = page.Content
                    Dim font As New Font("Helvetica", FontCreateFlags.Embedded)

                    Dim text As New Text()
                    text.AddRun(New TextRun("Hello World", font, 24, New Point(72, 720)))
                    content.AddElement(text)

                    page.UpdateContent()
                End Using

                doc.Save(SaveFlags.Full, "output.pdf")
            End Using
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 구현:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfHtmlToPdf
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        // Convert HTML to PDF with simple API
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfHtmlToPdf
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        // Convert HTML to PDF with simple API
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class IronPdfHtmlToPdf
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"

        ' Convert HTML to PDF with simple API
        Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF는 라이브러리 라이프사이클 래퍼, 변환 매개 변수 객체 및 명시적 폐기를 제거합니다. ChromePdfRenderer는 픽셀 기반의 완벽한 CSS 및 JavaScript 지원을 위한 Chromium 기반 엔진을 사용합니다. 고급 시나리오에 대해서는 HTML to PDF 문서를 참조하세요.

여러 PDF 병합

PDF 병합은 API 복잡도 차이를 명확하게 보여줍니다.

Adobe PDF Library SDK 구현:

//Adobe PDF Library SDK(Datalogics APDFL)
using Datalogics.PDFL;
using System;

class AdobeMergePdfs
{
    static void Main()
    {
        using (Library lib = new Library())
        using (Document doc1 = new Document("document1.pdf"))
        using (Document doc2 = new Document("document2.pdf"))
        {
            // InsertPages(insertAfter, sourceDoc, sourceStartPage, pageCount, flags)
            doc1.InsertPages(
                Document.LastPage,
                doc2,
                0,
                Document.AllPages,
                PageInsertFlags.Bookmarks | PageInsertFlags.Threads);

            doc1.Save(SaveFlags.Full, "merged.pdf");
        }
    }
}
//Adobe PDF Library SDK(Datalogics APDFL)
using Datalogics.PDFL;
using System;

class AdobeMergePdfs
{
    static void Main()
    {
        using (Library lib = new Library())
        using (Document doc1 = new Document("document1.pdf"))
        using (Document doc2 = new Document("document2.pdf"))
        {
            // InsertPages(insertAfter, sourceDoc, sourceStartPage, pageCount, flags)
            doc1.InsertPages(
                Document.LastPage,
                doc2,
                0,
                Document.AllPages,
                PageInsertFlags.Bookmarks | PageInsertFlags.Threads);

            doc1.Save(SaveFlags.Full, "merged.pdf");
        }
    }
}
Imports Datalogics.PDFL
Imports System

Class AdobeMergePdfs
    Shared Sub Main()
        Using lib As New Library()
            Using doc1 As New Document("document1.pdf")
                Using doc2 As New Document("document2.pdf")
                    ' InsertPages(insertAfter, sourceDoc, sourceStartPage, pageCount, flags)
                    doc1.InsertPages(Document.LastPage, doc2, 0, Document.AllPages, PageInsertFlags.Bookmarks Or PageInsertFlags.Threads)

                    doc1.Save(SaveFlags.Full, "merged.pdf")
                End Using
            End Using
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 구현:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfMergePdfs
{
    static void Main()
    {
        // Load PDF documents
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        // Merge PDFs with simple method
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfMergePdfs
{
    static void Main()
    {
        // Load PDF documents
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        // Merge PDFs with simple method
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
Imports IronPdf
Imports System

Class IronPdfMergePdfs
    Shared Sub Main()
        ' Load PDF documents
        Dim pdf1 = PdfDocument.FromFile("document1.pdf")
        Dim pdf2 = PdfDocument.FromFile("document2.pdf")

        ' Merge PDFs with simple method
        Dim merged = PdfDocument.Merge(pdf1, pdf2)
        merged.SaveAs("merged.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Adobe의 접근법은 삽입 매개 변수와 함께 페이지별 반복을 요구합니다. IronPDF는 여러 문서를 수락하는 단일 Merge 메서드를 제공합니다.

워터마크 추가

워터마크는 IronPDF가 스타일링 유연성을 위해 HTML/CSS를 활용하는 방법을 보여줍니다.

Adobe PDF Library SDK 구현:

//Adobe PDF Library SDK(Datalogics APDFL)
using Datalogics.PDFL;
using System;

class AdobeAddWatermark
{
    static void Main()
    {
        using (Library lib = new Library())
        using (Document doc = new Document("input.pdf"))
        {
            WatermarkParams watermarkParams = new WatermarkParams();
            watermarkParams.Opacity = 0.5; // 0.0 - 1.0
            watermarkParams.Rotation = 45.0;
            watermarkParams.Scale = -1; // auto-fit

            WatermarkTextParams textParams = new WatermarkTextParams();
            textParams.Text = "CONFIDENTIAL";
            textParams.Color = new Color(0.8, 0.8, 0.8);
            textParams.TextAlign = HorizontalAlignment.Center;

            // Apply via Document.Watermark(textParams, wmParams)
            doc.Watermark(textParams, watermarkParams);

            doc.Save(SaveFlags.Full, "watermarked.pdf");
        }
    }
}
//Adobe PDF Library SDK(Datalogics APDFL)
using Datalogics.PDFL;
using System;

class AdobeAddWatermark
{
    static void Main()
    {
        using (Library lib = new Library())
        using (Document doc = new Document("input.pdf"))
        {
            WatermarkParams watermarkParams = new WatermarkParams();
            watermarkParams.Opacity = 0.5; // 0.0 - 1.0
            watermarkParams.Rotation = 45.0;
            watermarkParams.Scale = -1; // auto-fit

            WatermarkTextParams textParams = new WatermarkTextParams();
            textParams.Text = "CONFIDENTIAL";
            textParams.Color = new Color(0.8, 0.8, 0.8);
            textParams.TextAlign = HorizontalAlignment.Center;

            // Apply via Document.Watermark(textParams, wmParams)
            doc.Watermark(textParams, watermarkParams);

            doc.Save(SaveFlags.Full, "watermarked.pdf");
        }
    }
}
Imports Datalogics.PDFL
Imports System

Class AdobeAddWatermark
    Shared Sub Main()
        Using lib As New Library()
            Using doc As New Document("input.pdf")
                Dim watermarkParams As New WatermarkParams()
                watermarkParams.Opacity = 0.5 ' 0.0 - 1.0
                watermarkParams.Rotation = 45.0
                watermarkParams.Scale = -1 ' auto-fit

                Dim textParams As New WatermarkTextParams()
                textParams.Text = "CONFIDENTIAL"
                textParams.Color = New Color(0.8, 0.8, 0.8)
                textParams.TextAlign = HorizontalAlignment.Center

                ' Apply via Document.Watermark(textParams, wmParams)
                doc.Watermark(textParams, watermarkParams)

                doc.Save(SaveFlags.Full, "watermarked.pdf")
            End Using
        End Using
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 구현:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class IronPdfAddWatermark
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        // Apply text watermark with simple API
        pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class IronPdfAddWatermark
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        // Apply text watermark with simple API
        pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Editing
Imports System

Class IronPdfAddWatermark
    Shared Sub Main()
        Dim pdf = PdfDocument.FromFile("input.pdf")

        ' Apply text watermark with simple API
        pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
                           rotation:=45,
                           verticalAlignment:=VerticalAlignment.Middle,
                           horizontalAlignment:=HorizontalAlignment.Center)

        pdf.SaveAs("watermarked.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF의 HTML 기반 워터마킹은 CSS 스타일링을 통해 완전한 디자인 제어를 제공하여 별도의 매개 변수 객체가 필요하지 않습니다.

암호 보호 및 암호화

Adobe PDF Library SDK 구현:

using Datalogics.PDFL;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            PermissionFlags permissions =
                PermissionFlags.PrintDoc |
                PermissionFlags.PrintFidelity;

            EncryptionHandler encHandler = new EncryptionHandler(
                password,      // User password
                password,      // Owner password
                permissions,
                EncryptionMethod.AES256);

            doc.SetEncryptionHandler(encHandler);
            doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
using Datalogics.PDFL;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            PermissionFlags permissions =
                PermissionFlags.PrintDoc |
                PermissionFlags.PrintFidelity;

            EncryptionHandler encHandler = new EncryptionHandler(
                password,      // User password
                password,      // Owner password
                permissions,
                EncryptionMethod.AES256);

            doc.SetEncryptionHandler(encHandler);
            doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
Imports Datalogics.PDFL

Public Sub ProtectPdf(inputPath As String, outputPath As String, password As String)
    Library.Initialize()
    Try
        Using doc As New Document(inputPath)
            Dim permissions As PermissionFlags = PermissionFlags.PrintDoc Or PermissionFlags.PrintFidelity

            Dim encHandler As New EncryptionHandler(
                password,      ' User password
                password,      ' Owner password
                permissions,
                EncryptionMethod.AES256)

            doc.SetEncryptionHandler(encHandler)
            doc.Save(SaveFlags.Full Or SaveFlags.Encrypted, outputPath)
        End Using
    Finally
        Library.Terminate()
    End Try
End Sub
$vbLabelText   $csharpLabel

IronPDF 구현:

using IronPdf;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.SecuritySettings.UserPassword = password;
    pdf.SecuritySettings.OwnerPassword = password;
    pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
    pdf.SecuritySettings.AllowUserCopyPasteContent = false;
    pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

    pdf.SaveAs(outputPath);
}
using IronPdf;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.SecuritySettings.UserPassword = password;
    pdf.SecuritySettings.OwnerPassword = password;
    pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
    pdf.SecuritySettings.AllowUserCopyPasteContent = false;
    pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

    pdf.SaveAs(outputPath);
}
Imports IronPdf

Public Sub ProtectPdf(inputPath As String, outputPath As String, password As String)
    Using pdf = PdfDocument.FromFile(inputPath)
        pdf.SecuritySettings.UserPassword = password
        pdf.SecuritySettings.OwnerPassword = password
        pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
        pdf.SecuritySettings.AllowUserCopyPasteContent = False
        pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit

        pdf.SaveAs(outputPath)
    End Using
End Sub
$vbLabelText   $csharpLabel

IronPDF는 비트 연산 권한 플래그 및 암호화 핸들러 객체 대신 강력히 형식화된 속성을 사용합니다.

텍스트 추출

Adobe PDF Library SDK 구현:

using Datalogics.PDFL;

public string ExtractText(string pdfPath)
{
    string extractedText = "";

    Library.Initialize();
    try
    {
        using (Document doc = new Document(pdfPath))
        {
            WordFinderConfig config = new WordFinderConfig();
            config.IgnoreCharGaps = true;

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (WordFinder wordFinder = new WordFinder(doc, i, config))
                {
                    IList<Word> words = wordFinder.GetWordList();
                    foreach (Word word in words)
                    {
                        extractedText += word.Text + " ";
                    }
                    extractedText += "\n";
                }
            }
        }
    }
    finally
    {
        Library.Terminate();
    }

    return extractedText;
}
using Datalogics.PDFL;

public string ExtractText(string pdfPath)
{
    string extractedText = "";

    Library.Initialize();
    try
    {
        using (Document doc = new Document(pdfPath))
        {
            WordFinderConfig config = new WordFinderConfig();
            config.IgnoreCharGaps = true;

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (WordFinder wordFinder = new WordFinder(doc, i, config))
                {
                    IList<Word> words = wordFinder.GetWordList();
                    foreach (Word word in words)
                    {
                        extractedText += word.Text + " ";
                    }
                    extractedText += "\n";
                }
            }
        }
    }
    finally
    {
        Library.Terminate();
    }

    return extractedText;
}
Imports Datalogics.PDFL

Public Function ExtractText(ByVal pdfPath As String) As String
    Dim extractedText As String = ""

    Library.Initialize()
    Try
        Using doc As New Document(pdfPath)
            Dim config As New WordFinderConfig()
            config.IgnoreCharGaps = True

            For i As Integer = 0 To doc.NumPages - 1
                Using wordFinder As New WordFinder(doc, i, config)
                    Dim words As IList(Of Word) = wordFinder.GetWordList()
                    For Each word As Word In words
                        extractedText &= word.Text & " "
                    Next
                    extractedText &= vbLf
                End Using
            Next
        End Using
    Finally
        Library.Terminate()
    End Try

    Return extractedText
End Function
$vbLabelText   $csharpLabel

IronPDF 구현:

using IronPdf;

public string ExtractText(string pdfPath)
{
    using var pdf = PdfDocument.FromFile(pdfPath);
    return pdf.ExtractAllText();
}
using IronPdf;

public string ExtractText(string pdfPath)
{
    using var pdf = PdfDocument.FromFile(pdfPath);
    return pdf.ExtractAllText();
}
Imports IronPdf

Public Function ExtractText(pdfPath As String) As String
    Using pdf = PdfDocument.FromFile(pdfPath)
        Return pdf.ExtractAllText()
    End Using
End Function
$vbLabelText   $csharpLabel

Adobe의 단어별 반복이 IronPDF로 단일 메서드 호출이 됩니다.

머리말과 바닥글

Adobe PDF Library SDK 구현:

using Datalogics.PDFL;

public void AddHeaderFooter(string inputPath, string outputPath)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            Font font = new Font("Helvetica", FontCreateFlags.None);

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (Page page = doc.GetPage(i))
                {
                    Content content = page.Content;

                    // Add header
                    Text header = new Text();
                    header.AddRun(new TextRun("Document Header",
                        font, 10, new Point(72, page.MediaBox.Top - 36)));
                    content.AddElement(header);

                    // Add footer with page number
                    Text footer = new Text();
                    footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
                        font, 10, new Point(72, 36)));
                    content.AddElement(footer);

                    page.UpdateContent();
                }
            }
            doc.Save(SaveFlags.Full, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
using Datalogics.PDFL;

public void AddHeaderFooter(string inputPath, string outputPath)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            Font font = new Font("Helvetica", FontCreateFlags.None);

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (Page page = doc.GetPage(i))
                {
                    Content content = page.Content;

                    // Add header
                    Text header = new Text();
                    header.AddRun(new TextRun("Document Header",
                        font, 10, new Point(72, page.MediaBox.Top - 36)));
                    content.AddElement(header);

                    // Add footer with page number
                    Text footer = new Text();
                    footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
                        font, 10, new Point(72, 36)));
                    content.AddElement(footer);

                    page.UpdateContent();
                }
            }
            doc.Save(SaveFlags.Full, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
Imports Datalogics.PDFL

Public Sub AddHeaderFooter(inputPath As String, outputPath As String)
    Library.Initialize()
    Try
        Using doc As New Document(inputPath)
            Dim font As New Font("Helvetica", FontCreateFlags.None)

            For i As Integer = 0 To doc.NumPages - 1
                Using page As Page = doc.GetPage(i)
                    Dim content As Content = page.Content

                    ' Add header
                    Dim header As New Text()
                    header.AddRun(New TextRun("Document Header", font, 10, New Point(72, page.MediaBox.Top - 36)))
                    content.AddElement(header)

                    ' Add footer with page number
                    Dim footer As New Text()
                    footer.AddRun(New TextRun($"Page {i + 1} of {doc.NumPages}", font, 10, New Point(72, 36)))
                    content.AddElement(footer)

                    page.UpdateContent()
                End Using
            Next
            doc.Save(SaveFlags.Full, outputPath)
        End Using
    Finally
        Library.Terminate()
    End Try
End Sub
$vbLabelText   $csharpLabel

IronPDF 구현:

using IronPdf;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Document Header",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(outputPath);
}
using IronPdf;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Document Header",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(outputPath);
}
Imports IronPdf

Public Sub CreatePdfWithHeaderFooter(html As String, outputPath As String)
    Dim renderer = New ChromePdfRenderer()

    renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
        .CenterText = "Document Header",
        .FontSize = 10,
        .FontFamily = "Helvetica"
    }

    renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
        .CenterText = "Page {page} of {total-pages}",
        .FontSize = 10,
        .FontFamily = "Helvetica"
    }

    Using pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs(outputPath)
    End Using
End Sub
$vbLabelText   $csharpLabel

IronPDF는 페이지 반복을 자동으로 처리하며 {page}{total-pages} 같은 플레이스홀더 토큰을 지원합니다. 보다 고급 레이아웃에 대해서는 머리말과 바닥글 문서를 참조하세요.

URL을 PDF로 변환

Adobe PDF Library SDK는 내장된 URL 렌더링 기능이 부족합니다. IronPDF는 기본 지원을 제공합니다:

using IronPdf;

public void ConvertUrlToPdf(string url, string outputPath)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderUrlAsPdf(url);
    pdf.SaveAs(outputPath);
}
using IronPdf;

public void ConvertUrlToPdf(string url, string outputPath)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderUrlAsPdf(url);
    pdf.SaveAs(outputPath);
}
Imports IronPdf

Public Sub ConvertUrlToPdf(url As String, outputPath As String)
    Dim renderer As New ChromePdfRenderer()
    Using pdf = renderer.RenderUrlAsPdf(url)
        pdf.SaveAs(outputPath)
    End Using
End Sub
$vbLabelText   $csharpLabel

완전한 URL 변환 옵션에 대해서는 URL to PDF 문서를 참조하세요.

ASP.NET Core 통합

Adobe PDF Library SDK의 정적 초기화 패턴은 종속성 주입과의 마찰을 만듭니다. IronPDF는 현대의 .NET 아키텍처와 자연스럽게 통합됩니다.

Adobe 패턴 (DI에 문제 있음):

public class AdobePdfService
{
    public byte[] Generate(string content)
    {
        Library.Initialize();
        try
        {
            //복잡한 문서construction...
            return bytes;
        }
        finally
        {
            Library.Terminate();
        }
    }
}
public class AdobePdfService
{
    public byte[] Generate(string content)
    {
        Library.Initialize();
        try
        {
            //복잡한 문서construction...
            return bytes;
        }
        finally
        {
            Library.Terminate();
        }
    }
}
Public Class AdobePdfService
    Public Function Generate(content As String) As Byte()
        Library.Initialize()
        Try
            '복잡한 문서construction...
            Return bytes
        Finally
            Library.Terminate()
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

IronPDF 패턴 (DI 친화적):

public interface IPdfService
{
    Task<byte[]> GeneratePdfAsync(string html);
}

public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public async Task<byte[]> GeneratePdfAsync(string html)
    {
        using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}

// Register in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
public interface IPdfService
{
    Task<byte[]> GeneratePdfAsync(string html);
}

public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public async Task<byte[]> GeneratePdfAsync(string html)
    {
        using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}

// Register in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
Imports System.Threading.Tasks

Public Interface IPdfService
    Function GeneratePdfAsync(html As String) As Task(Of Byte())
End Interface

Public Class IronPdfService
    Implements IPdfService

    Private ReadOnly _renderer As ChromePdfRenderer

    Public Sub New()
        _renderer = New ChromePdfRenderer()
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
    End Sub

    Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte()) Implements IPdfService.GeneratePdfAsync
        Using pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
            Return pdf.BinaryData
        End Using
    End Function
End Class

' Register in Program.vb (.NET 6+):
builder.Services.AddSingleton(Of IPdfService, IronPdfService)()
$vbLabelText   $csharpLabel

비동기 지원

Adobe PDF Library SDK는 비동기 작업을 지원하지 않습니다. IronPDF는 확장 가능한 웹 응용 프로그램에 필수적인 완전한 async/await 기능을 제공합니다:

public async Task<IActionResult> GenerateReport()
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return File(pdf.BinaryData, "application/pdf");
}
public async Task<IActionResult> GenerateReport()
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc

Public Class ReportController
    Inherits Controller

    Public Async Function GenerateReport() As Task(Of IActionResult)
        Dim renderer As New ChromePdfRenderer()
        Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
            Return File(pdf.BinaryData, "application/pdf")
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

성능 최적화

메모리 사용량 비교

시나리오 Adobe PDF Library SDK IronPDF
간단한 PDF ~100 MB ~50 MB
복잡한 문서 ~200 MB ~80 MB
배치 (100 PDFs) 높음 (기본 메모리) ~100 MB

최적화 팁

렌더러 인스턴스를 재사용하세요:

// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs($"output_{i}.pdf");
}
// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs($"output_{i}.pdf");
}
' Good: Reuse renderer for batch operations
Dim renderer = New ChromePdfRenderer()
For Each html In htmlList
    Using pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs($"output_{i}.pdf")
    End Using
Next
$vbLabelText   $csharpLabel

웹 애플리케이션에서 비동기를 사용하세요:

public async Task<IActionResult> GenerateReport()
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return File(pdf.BinaryData, "application/pdf");
}
public async Task<IActionResult> GenerateReport()
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc

Public Class ReportController
    Inherits Controller

    Public Async Function GenerateReport() As Task(Of IActionResult)
        Dim renderer As New ChromePdfRenderer()
        Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
            Return File(pdf.BinaryData, "application/pdf")
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

일반적인 마이그레이션 문제 해결

문제: 좌표 기반 위치 지정이 작동하지 않음

Adobe는 PostScript 포인트 좌표를 사용합니다. IronPDF는 CSS 포지셔닝을 사용합니다:

// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));

// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));

// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
' Adobe: Point-based
New TextRun("Hello", font, 12, New Point(100, 700))

' IronPDF: CSS-based
Dim html As String = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>"
$vbLabelText   $csharpLabel

문제: 페이지 크기 차이

Adobe는 PostScript 포인트를 사용합니다. IronPDF는 열거형(enum) 또는 사용자 지정 치수를 사용합니다:

// Adobe: Points
Rect(0, 0, 612, 792) // Letter

// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
// Adobe: Points
Rect(0, 0, 612, 792) // Letter

// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
' Adobe: Points
Rect(0, 0, 612, 792) ' Letter

' IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
' Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11)
$vbLabelText   $csharpLabel

문제: 글꼴을 찾을 수 없음

Adobe는 수동 글꼴 임베딩이 필요합니다. IronPDF는 글꼴을 자동으로 처리합니다:

// IronPDF: Use web fonts if needed
string html = @"
<style>
    @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
    body { font-family: 'Roboto', sans-serif; }
</style>";
// IronPDF: Use web fonts if needed
string html = @"
<style>
    @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
    body { font-family: 'Roboto', sans-serif; }
</style>";
' IronPDF: Use web fonts if needed
Dim html As String = "
<style>
    @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
    body { font-family: 'Roboto', sans-serif; }
</style>"
$vbLabelText   $csharpLabel

문제: SaveFlags 사용 불가

Adobe는 저장 플래그 조합을 사용합니다. IronPDF는 직접 저장을 사용합니다:

// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);

//IronPDF- full save is default
pdf.SaveAs(path);
// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);

//IronPDF- full save is default
pdf.SaveAs(path);
$vbLabelText   $csharpLabel

마이그레이션 후 점검 목록

코드 마이그레이션을 완료한 후, 다음을 확인하십시오:

  • 모든 기존 단위 및 통합 테스트 실행
  • 이전 버전과 PDF 출력을 시각적으로 비교
  • 스테이징 환경에서 모든 PDF 워크플로 테스트
  • 라이선싱이 올바르게 작동하는지 확인 (IronPdf.License.IsLicensed)
  • 이전 구현과의 성능 벤치마크
  • Adobe 라이선스 구성 제거
  • CI/CD 파이프라인 종속성 업데이트
  • 프로젝트에서 모든 Adobe PDF 라이브러리 DLL 제거
  • 개발 팀을 위한 새로운 패턴 문서화

추가 리소스


APDFL에서 IronPDF로의 마이그레이션은 일반적인 .NET PDF 생성 코드베이스를 간소화할 수 있으며, 특히 HTML-to-PDF 또는 문서 조작이 주요 요구사항인 팀에게 적합합니다. 저수준 페이지 구성에서 HTML/CSS 렌더링으로의 전환은 대부분의 좌표 계산, 글꼴 관리, Library 라이프사이클 처리 코드를 제거하며, IronPDF의 개발자별 투명 라이선싱은 APDFL의 영업 주도형, OEM/SaaS 로열티 모델보다 예산 편성이 더 용이합니다.

참고해 주세요Adobe, Acrobat, 및 Adobe PDF Library는 Adobe Inc.의 등록 상표입니다. APDFL은 Adobe로부터 라이선스를 받아 Datalogics, Inc.에서 배포합니다. 이 사이트는 Adobe Inc. 또는 Datalogics, Inc.와 관련이 없으며, 승인하거나 후원하지 않습니다. 모든 제품 이름, 로고 및 브랜드는 각각의 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

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