IronPDF與PDFNet的比較
1. 引言
正在尋找適用於.NET Framework的完美PDF工具嗎?
在本文中,我們將了解如何使用C#(最受歡迎的程式語言之一)處理PDF檔案。 我們將討論兩種業界領先的用於.NET Framework的C# PDF工具,並通過程式碼範例根據其性能和功能進行比較。 最後,我們將檢查其授權詳細資訊並學習如何獲取授權金鑰。
這兩個PDF程式庫是:
- PDFNet
- IronPDF
2. IronPDF
IronPDF是一個由Iron Software開發的C# .NET程式庫,用於解決C# .NET開發人員的所有PDF問題,僅使用一個程式庫。 IronPDF基於Chromium引擎,具有多種有用且強大的功能,例如將HTML5、JavaScript、CSS和圖像文件轉換為PDF,建立自定義的頁眉和頁腳,並精準顯示PDF,正如在瀏覽器中看到的一樣。 IronPDF允許您從PDF文件中讀取資料,並自動將其插入到.NET應用程式和資料儲存系統中。 您可以將舊PDF文件儲存中的內容導入、移動和索引到您的文件管理和業務應用程式中。
2.1. IronPDF功能
2.1.1. PDF轉換
此功能允許您從多種格式生成PDF文件,例如HTML、MVC視圖、Web表單、HTML字串和URL。
2.1.2. PDF內容提取
在許多情況下,您可以輕易地從PDF中提取嵌入的文字。 但是,如果失敗,您的文字很可能嵌入在圖像中。 要掃描包含視覺文字而非純文字的文件,請使用IronOCR程式庫。
2.1.3 標題和頁腳
可以在建立PDF或對現有的PDF中新增標題和頁腳。 使用列印選項屬性,您可以為每個文件頁面建立標題和頁腳。 這些參數可在ChromePdfRenderer物件中獲取。 此範例在.NET Core控制台應用程式中運行。
2.1.4. PDF圖像處理
這讓使用者可以從PDF生生圖片,也可以從照片生成PDF。它支持圖片提取、各種圖片擴展以及PDF列印。
2.1.5. PDF文件IO
IronPDF還包括128位PDF加密、密碼保護的PDF鎖定,以及PDF的數位簽署。
2.1.6. PDF編輯
IronPDF工具允許您向PDF中新增水印、新增頁面、移除頁面、背景、前景等等。
2.1.7. 相容性
IronPDF支持幾乎所有與C#相容的操作系統和框架,例如:
- Windows
- .NET Core 2.1、3.0、3.1、.NET 6和5
- .NET Standard 2.0的通用相容性
- Azure
- AWS
- Docker
- Linux
3. PDFNet
PDFNet .NET SDK由PDFTron提供,為網頁、移動裝置、桌面或伺服器上的任何框架或應用程式帶來精確的PDF處理、註解、編輯和建立能力。 它管理您基礎設施的整個文件和資訊管理過程,消除了對第三方伺服器依賴的需求。 PDFTron的網路平台提供了支持平台的JS版本,並為所有PDF SDK提供了演示授權金鑰。
PDFNet的一個最大優勢是其真正的跨平台,使我們的使用者能夠輕鬆地將PDF相容性和業務功能有效地新增到他們的生成工作流和應用中,所有的這些幾乎都使用相同的介面。
3.1. PDFNet SDK功能
3.1.1. 相容性
PDFNet SDK相容於多個平台和框架。 為了確保平台的一致性,在JavaScript API中使用與PDFNet API相同的方式。 Node.js和Electron版本的SDK也可用。 此套件需要非管理附加的二進制文件。
3.1.2. 編輯和查看
為各種網路、移動和桌面平台上的使用者帶來安全、可擴展和高保真度的PDF閱讀和編輯能力。
3.1.3. 簽署
建立自定義的簽署流程。 數位簽署的文件可以被認證、驗證和加蓋封印。
3.1.4. 真正的修訂
從文件中移除敏感資料,如個人資訊或個人健康資訊,並保持文件可檢索。
3.1.5. 頁面操作
可以新增、移除或重新排列頁面。 文件可以組裝、合併或拆分成部分。 在同一閱讀器中或並排查看多個文件。
4. 在Visual Studio中建立新項目
在本文中,我們將使用控制台應用程式生成PDF文件。
打開Visual Studio軟體並進入文件選單。 選擇"新專案"然後選擇控制台應用程式。
輸入專案名稱並在相應的文字框中選擇路徑。 然後點擊建立按鈕。 選擇所需的.NET框架,如下圖所示:
Visual Studio專案現在將為控制台應用程式生成結構。 完成後,將打開Program.cs文件,您可以在其中編寫和執行源程式碼。
現在我們可以新增程式庫並測試程式。
5. 安裝IronPDF程式庫
IronPDF 程式庫可以通過四種不同的方法下載和安裝。 這些是:
- 使用Visual Studio NuGet Package Manager
- 使用Visual Studio命令行。
- 從NuGet Gallery IronPDF Package直接下載。
- 從IronPDF下載頁面直接下載。
5.1 使用Visual Studio NuGet套件管理器
Visual Studio軟體提供NuGet Package Manager選項,將封裝直接安裝到解決方案中。 下面的截圖顯示了如何打開NuGet Package Manager。
在套件管理器GUI開啟的情況下,點擊瀏覽標籤並搜尋"IronPDF:"
在上圖中,我們可以看到搜索中的相關封裝列表。 選擇IronPDF選項並將套件安裝到我們的解決方案中。
5.2 使用Visual Studio命令行
- 在Visual Studio選單中,前往工具 > NuGet套件管理器 > 套件管理器控制台
- 在封裝管理器主控台選項卡中輸入以下行:
Install-Package IronPdf
IronPDF套件將安裝到專案中。
5.3 從NuGet網頁直接下載
第三種方法是直接從NuGet Gallery IronPDF Package下載NuGet套件。
- 從右側選單中選擇下載套件選項。
- 雙擊下載的封裝; 它將被自動安裝。
- 然後,重新載入解決方案並開始在專案中使用它。
5.4 從IronPDF網頁直接下載
從IronPDF下載頁面直接下載最新的套件。 下載後,按照以下步驟將套件新增到專案中。
- 在方案窗口中右鍵單擊專案。
- 然後,選擇選項引用並瀏覽下載的引用的位置。
- 接著,點擊確定以新增參考。
6. 安裝PDFNet SDK
可以通過四種不同方式下載和安裝PDFNet SDK。
- 使用Visual Studio NuGet套件管理器。
- 使用Visual Studio命令行。
- 從NuGet Gallery PDFNet Package直接下載。
- 使用PDFNetLoader.dll
6.1. 使用Visual Studio NuGet套件管理器
如上所述,進入Visual Studio中的工具並開啟NuGet套件管理器。 會出現一個列表——點擊管理解決方案的NuGet套件。
會出現一個帶有搜尋欄的視窗。 搜尋PDFNet並將其安裝到專案中。
6.2. 使用Visual Studio命令行
- 在Visual Studio選單中,前往工具 > NuGet套件管理器 > 套件管理器控制台
- 在封裝管理器主控台選項卡中輸入以下行:
Install-Package PDFNet -Version 9.2.0
6.3. 從NuGet網頁直接下載
第三種方式是直接從NuGet Gallery PDFNet Package下載NuGet套件。
- 從右側選單中選擇下載套件選項。
- 雙擊下載的套件以開始安裝過程。
6.4. 使用PDFNetLoader.dll
您還可以使用PDFNetLoader.dll文件安裝PDFNet API。從GitHub Releases for PDFNetLoader.dll下載。
下載套件,將其放置在專案的bin文件中並運行它。 在您的Visual Studio專案中,新增PDFNetLoader.dll作為引用。
Bootstrap and CSS Framework Rendering
現代網頁應用大量倚賴Bootstrap和CSS框架,提供一致的響應式設計。 從網頁內容中生成PDF時,準確呈現這些框架而不修改是保持設計一致性和減少開發工作的關鍵。
IronPDF:完整Bootstrap框架支持
- Bootstrap 5: 完整的flexbox佈局系統,CSS網格,實用類別和所有組件庫
- Bootstrap 4: 完整的卡片組件、導航、flex實用程式和響應式設計
- Tailwind CSS: 所有實用優先類別準確渲染於瀏覽器中
- Foundation:完整的網格系統和元件支持
- 現代CSS3:Flexbox,CSS Grid,自訂屬性,動畫,過渡和變換
真實世界驗證:IronPDF準確地按像素精準度渲染Bootstrap首頁和所有官方範例。
程式碼範例:學習管理系統儀表板
using IronPdf;
// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";
var renderer = new ChromePdfRenderer();
string bootstrapLMS = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<div>
<h1 class='display-6 mb-1'>Student Learning Dashboard</h1>
<p class='text-muted mb-0'>Spring Semester 2025</p>
</div>
<span class='badge bg-success fs-5'>92% Overall Progress</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-primary'>
<div class='card-body'>
<div class='text-primary mb-2' style='font-size: 2rem;'>📚</div>
<h3 class='mb-1'>6/8</h3>
<p class='text-muted mb-0'>Courses Completed</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-success'>
<div class='card-body'>
<div class='text-success mb-2' style='font-size: 2rem;'>🎯</div>
<h3 class='mb-1'>24/28</h3>
<p class='text-muted mb-0'>Assignments Submitted</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-warning'>
<div class='card-body'>
<div class='text-warning mb-2' style='font-size: 2rem;'>⏱</div>
<h3 class='mb-1'>48hrs</h3>
<p class='text-muted mb-0'>Study Time This Week</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-info'>
<div class='card-body'>
<div class='text-info mb-2' style='font-size: 2rem;'>⭐</div>
<h3 class='mb-1'>A- Average</h3>
<p class='text-muted mb-0'>Current GPA: 3.7</p>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-8'>
<div class='card shadow-sm'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Current Courses</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Advanced Web Development</h6>
<small class='text-muted'>Prof. Johnson | Mondays & Wednesdays, 2:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 95%'></div>
</div>
<small class='text-muted'>95% Complete | Final Project Due: May 15</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Database Systems</h6>
<small class='text-muted'>Prof. Chen | Tuesdays & Thursdays, 10:00 AM</small>
</div>
<span class='badge bg-primary'>Grade: A-</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 88%'></div>
</div>
<small class='text-muted'>88% Complete | Midterm: April 28</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Artificial Intelligence Fundamentals</h6>
<small class='text-muted'>Prof. Martinez | Fridays, 1:00 PM</small>
</div>
<span class='badge bg-warning text-dark'>Grade: B+</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 75%'></div>
</div>
<small class='text-muted'>75% Complete | Research Paper Due: May 5</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Computer Networks</h6>
<small class='text-muted'>Prof. Davis | Mondays & Wednesdays, 4:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 92%'></div>
</div>
<small class='text-muted'>92% Complete | Lab Exam: April 30</small>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-4'>
<div class='card shadow-sm mb-3'>
<div class='card-header bg-warning text-dark'>
<h5 class='mb-0'>Upcoming Deadlines</h5>
</div>
<div class='card-body p-0'>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-danger me-2'>Today</span>
<div class='flex-grow-1'>
<small><strong>AI Assignment 4</strong></small>
<br><small class='text-muted'>Neural Networks Lab</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-warning text-dark me-2'>Apr 28</span>
<div class='flex-grow-1'>
<small><strong>Database Midterm</strong></small>
<br><small class='text-muted'>Chapters 1-8</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-info me-2'>Apr 30</span>
<div class='flex-grow-1'>
<small><strong>Networks Lab Exam</strong></small>
<br><small class='text-muted'>Practical Assessment</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-primary me-2'>May 5</span>
<div class='flex-grow-1'>
<small><strong>AI Research Paper</strong></small>
<br><small class='text-muted'>15-20 pages</small>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-header bg-info text-white'>
<h5 class='mb-0'>Study Resources</h5>
</div>
<div class='card-body'>
<div class='d-grid gap-2'>
<button class='btn btn-outline-primary btn-sm'>📖 Course Materials</button>
<button class='btn btn-outline-primary btn-sm'>💬 Discussion Forums</button>
<button class='btn btn-outline-primary btn-sm'>🎥 Recorded Lectures</button>
<button class='btn btn-outline-primary btn-sm'>📝 Practice Quizzes</button>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapLMS);
pdf.SaveAs("lms-dashboard.pdf");
using IronPdf;
// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";
var renderer = new ChromePdfRenderer();
string bootstrapLMS = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<div>
<h1 class='display-6 mb-1'>Student Learning Dashboard</h1>
<p class='text-muted mb-0'>Spring Semester 2025</p>
</div>
<span class='badge bg-success fs-5'>92% Overall Progress</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-primary'>
<div class='card-body'>
<div class='text-primary mb-2' style='font-size: 2rem;'>📚</div>
<h3 class='mb-1'>6/8</h3>
<p class='text-muted mb-0'>Courses Completed</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-success'>
<div class='card-body'>
<div class='text-success mb-2' style='font-size: 2rem;'>🎯</div>
<h3 class='mb-1'>24/28</h3>
<p class='text-muted mb-0'>Assignments Submitted</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-warning'>
<div class='card-body'>
<div class='text-warning mb-2' style='font-size: 2rem;'>⏱</div>
<h3 class='mb-1'>48hrs</h3>
<p class='text-muted mb-0'>Study Time This Week</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-info'>
<div class='card-body'>
<div class='text-info mb-2' style='font-size: 2rem;'>⭐</div>
<h3 class='mb-1'>A- Average</h3>
<p class='text-muted mb-0'>Current GPA: 3.7</p>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-8'>
<div class='card shadow-sm'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Current Courses</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Advanced Web Development</h6>
<small class='text-muted'>Prof. Johnson | Mondays & Wednesdays, 2:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 95%'></div>
</div>
<small class='text-muted'>95% Complete | Final Project Due: May 15</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Database Systems</h6>
<small class='text-muted'>Prof. Chen | Tuesdays & Thursdays, 10:00 AM</small>
</div>
<span class='badge bg-primary'>Grade: A-</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 88%'></div>
</div>
<small class='text-muted'>88% Complete | Midterm: April 28</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Artificial Intelligence Fundamentals</h6>
<small class='text-muted'>Prof. Martinez | Fridays, 1:00 PM</small>
</div>
<span class='badge bg-warning text-dark'>Grade: B+</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 75%'></div>
</div>
<small class='text-muted'>75% Complete | Research Paper Due: May 5</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Computer Networks</h6>
<small class='text-muted'>Prof. Davis | Mondays & Wednesdays, 4:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 92%'></div>
</div>
<small class='text-muted'>92% Complete | Lab Exam: April 30</small>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-4'>
<div class='card shadow-sm mb-3'>
<div class='card-header bg-warning text-dark'>
<h5 class='mb-0'>Upcoming Deadlines</h5>
</div>
<div class='card-body p-0'>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-danger me-2'>Today</span>
<div class='flex-grow-1'>
<small><strong>AI Assignment 4</strong></small>
<br><small class='text-muted'>Neural Networks Lab</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-warning text-dark me-2'>Apr 28</span>
<div class='flex-grow-1'>
<small><strong>Database Midterm</strong></small>
<br><small class='text-muted'>Chapters 1-8</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-info me-2'>Apr 30</span>
<div class='flex-grow-1'>
<small><strong>Networks Lab Exam</strong></small>
<br><small class='text-muted'>Practical Assessment</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-primary me-2'>May 5</span>
<div class='flex-grow-1'>
<small><strong>AI Research Paper</strong></small>
<br><small class='text-muted'>15-20 pages</small>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-header bg-info text-white'>
<h5 class='mb-0'>Study Resources</h5>
</div>
<div class='card-body'>
<div class='d-grid gap-2'>
<button class='btn btn-outline-primary btn-sm'>📖 Course Materials</button>
<button class='btn btn-outline-primary btn-sm'>💬 Discussion Forums</button>
<button class='btn btn-outline-primary btn-sm'>🎥 Recorded Lectures</button>
<button class='btn btn-outline-primary btn-sm'>📝 Practice Quizzes</button>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(bootstrapLMS);
pdf.SaveAs("lms-dashboard.pdf");
Imports IronPdf
' Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here"
Dim renderer As New ChromePdfRenderer()
Dim bootstrapLMS As String = "
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container-fluid py-4'>
<div class='d-flex justify-content-between align-items-center mb-4'>
<div>
<h1 class='display-6 mb-1'>Student Learning Dashboard</h1>
<p class='text-muted mb-0'>Spring Semester 2025</p>
</div>
<span class='badge bg-success fs-5'>92% Overall Progress</span>
</div>
<div class='row g-4 mb-4'>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-primary'>
<div class='card-body'>
<div class='text-primary mb-2' style='font-size: 2rem;'>📚</div>
<h3 class='mb-1'>6/8</h3>
<p class='text-muted mb-0'>Courses Completed</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-success'>
<div class='card-body'>
<div class='text-success mb-2' style='font-size: 2rem;'>🎯</div>
<h3 class='mb-1'>24/28</h3>
<p class='text-muted mb-0'>Assignments Submitted</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-warning'>
<div class='card-body'>
<div class='text-warning mb-2' style='font-size: 2rem;'>⏱</div>
<h3 class='mb-1'>48hrs</h3>
<p class='text-muted mb-0'>Study Time This Week</p>
</div>
</div>
</div>
<div class='col-md-3'>
<div class='card text-center shadow-sm border-info'>
<div class='card-body'>
<div class='text-info mb-2' style='font-size: 2rem;'>⭐</div>
<h3 class='mb-1'>A- Average</h3>
<p class='text-muted mb-0'>Current GPA: 3.7</p>
</div>
</div>
</div>
</div>
<div class='row g-4'>
<div class='col-md-8'>
<div class='card shadow-sm'>
<div class='card-header bg-primary text-white'>
<h5 class='mb-0'>Current Courses</h5>
</div>
<div class='card-body p-0'>
<div class='list-group list-group-flush'>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Advanced Web Development</h6>
<small class='text-muted'>Prof. Johnson | Mondays & Wednesdays, 2:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 95%'></div>
</div>
<small class='text-muted'>95% Complete | Final Project Due: May 15</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Database Systems</h6>
<small class='text-muted'>Prof. Chen | Tuesdays & Thursdays, 10:00 AM</small>
</div>
<span class='badge bg-primary'>Grade: A-</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-primary' style='width: 88%'></div>
</div>
<small class='text-muted'>88% Complete | Midterm: April 28</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Artificial Intelligence Fundamentals</h6>
<small class='text-muted'>Prof. Martinez | Fridays, 1:00 PM</small>
</div>
<span class='badge bg-warning text-dark'>Grade: B+</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-warning' style='width: 75%'></div>
</div>
<small class='text-muted'>75% Complete | Research Paper Due: May 5</small>
</div>
<div class='list-group-item'>
<div class='d-flex justify-content-between align-items-center mb-2'>
<div>
<h6 class='mb-1'>Computer Networks</h6>
<small class='text-muted'>Prof. Davis | Mondays & Wednesdays, 4:00 PM</small>
</div>
<span class='badge bg-success'>Grade: A</span>
</div>
<div class='progress' style='height: 6px;'>
<div class='progress-bar bg-success' style='width: 92%'></div>
</div>
<small class='text-muted'>92% Complete | Lab Exam: April 30</small>
</div>
</div>
</div>
</div>
</div>
<div class='col-md-4'>
<div class='card shadow-sm mb-3'>
<div class='card-header bg-warning text-dark'>
<h5 class='mb-0'>Upcoming Deadlines</h5>
</div>
<div class='card-body p-0'>
<ul class='list-group list-group-flush'>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-danger me-2'>Today</span>
<div class='flex-grow-1'>
<small><strong>AI Assignment 4</strong></small>
<br><small class='text-muted'>Neural Networks Lab</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-warning text-dark me-2'>Apr 28</span>
<div class='flex-grow-1'>
<small><strong>Database Midterm</strong></small>
<br><small class='text-muted'>Chapters 1-8</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-info me-2'>Apr 30</span>
<div class='flex-grow-1'>
<small><strong>Networks Lab Exam</strong></small>
<br><small class='text-muted'>Practical Assessment</small>
</div>
</div>
</li>
<li class='list-group-item'>
<div class='d-flex align-items-start'>
<span class='badge bg-primary me-2'>May 5</span>
<div class='flex-grow-1'>
<small><strong>AI Research Paper</strong></small>
<br><small class='text-muted'>15-20 pages</small>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class='card shadow-sm'>
<div class='card-header bg-info text-white'>
<h5 class='mb-0'>Study Resources</h5>
</div>
<div class='card-body'>
<div class='d-grid gap-2'>
<button class='btn btn-outline-primary btn-sm'>📖 Course Materials</button>
<button class='btn btn-outline-primary btn-sm'>💬 Discussion Forums</button>
<button class='btn btn-outline-primary btn-sm'>🎥 Recorded Lectures</button>
<button class='btn btn-outline-primary btn-sm'>📝 Practice Quizzes</button>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(bootstrapLMS)
pdf.SaveAs("lms-dashboard.pdf")
輸出: 專業學習管理系統PDF,包括Bootstrap 5的網格系統、卡片組件、進度條、徽章、flexbox佈局及列表組——所有這些都以完美的間距、字體和顏色精確度呈現。
PDFNet (Apryse): 部分現代CSS支持
PDFNet使用定制的HTML渲染引擎,支持選擇性的CSS3:
- 有限的Flexbox實現: Bootstrap 4/5的基於Flex的佈局可能會顯示不一致
- 部分CSS Grid支持: 基於網格的設計經常需要回退
- JavaScript約束: 相對於完整瀏覽器環境,執行最少
- 框架測試要求: Bootstrap元件需要在投入使用前進行驗證
開發影響: 團隊必須單獨測試每個Bootstrap元件,並經常為PDFNet建立簡化佈局或替代CSS,這增加了複雜性並降低了設計一致性。
有關全面的Bootstrap框架指導和現代CSS呈現功能,請參見Bootstrap & Flexbox CSS指南。
7. 列印PDF文件(程式碼範例)
列印PDF文件是處理PDF的現代應用程式中必備的功能。 在這裡,我們將討論如何使用這兩個工具列印PDF文件。
7.1. 使用IronPDF列印PDF文件
IronPDF透過將PDF文件發送到電腦的預設列印機來列印。 這將開啟Windows列印介面——只需點擊列印即可完成。
using IronPdf;
class PrintPDF
{
static void Main(string[] args)
{
// Create a new PDF and print it
var Renderer = new IronPdf.ChromePdfRenderer();
PdfDocument Pdf = Renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
// Send the PDF to the default printer to print
Pdf.Print(300, false);
}
}
using IronPdf;
class PrintPDF
{
static void Main(string[] args)
{
// Create a new PDF and print it
var Renderer = new IronPdf.ChromePdfRenderer();
PdfDocument Pdf = Renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf");
// Send the PDF to the default printer to print
Pdf.Print(300, false);
}
}
Imports IronPdf
Friend Class PrintPDF
Shared Sub Main(ByVal args() As String)
' Create a new PDF and print it
Dim Renderer = New IronPdf.ChromePdfRenderer()
Dim Pdf As PdfDocument = Renderer.RenderUrlAsPdf("https://www.nuget.org/packages/IronPdf")
' Send the PDF to the default printer to print
Pdf.Print(300, False)
End Sub
End Class
7.2. 使用PDFNet列印PDF文件
PDFTron's PDFNet SDK也提供列印功能。 以下是PDFNet中列印PDF文件的源程式碼片段。
using System;
using pdftron;
using pdftron.PDF;
using pdftron.Common;
using pdftron.Filters;
namespace PDFPrintTestCS
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Opening the input file...");
using (PDFDoc pdfdoc = new PDFDoc("tiger.pdf"))
{
pdfdoc.InitSecurityHandler();
Console.WriteLine("Printing the input file using PDF.Print.StartPrintJob...");
PrinterMode printerMode = new PrinterMode();
printerMode.SetAutoCenter(true);
printerMode.SetAutoRotate(true);
printerMode.SetCollation(true);
printerMode.SetCopyCount(1);
printerMode.SetDPI(300); // Set print quality to 300 DPI
printerMode.SetDuplexing(PrinterMode.DuplexMode.e_Duplex_Auto);
printerMode.SetNUp(PrinterMode.NUp.e_NUp_1_1, PrinterMode.NUpPageOrder.e_PageOrder_LeftToRightThenTopToBottom);
printerMode.SetOrientation(PrinterMode.Orientation.e_Orientation_Portrait);
printerMode.SetOutputAnnot(PrinterMode.PrintContentTypes.e_PrintContent_DocumentAndAnnotations);
printerMode.SetOutputColor(PrinterMode.OutputColor.e_OutputColor_Grayscale);
printerMode.SetOutputPageBorder(false);
printerMode.SetOutputQuality(PrinterMode.OutputQuality.e_OutputQuality_Medium);
printerMode.SetPaperSize(new Rect(0, 0, 612, 792));
PageSet pagesToPrint = new PageSet(1, pdfdoc.GetPageCount(), PageSet.Filter.e_all);
Print.StartPrintJob(pdfdoc, "", pdfdoc.GetFileName(), "", pagesToPrint, printerMode, null);
}
}
}
}
using System;
using pdftron;
using pdftron.PDF;
using pdftron.Common;
using pdftron.Filters;
namespace PDFPrintTestCS
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Opening the input file...");
using (PDFDoc pdfdoc = new PDFDoc("tiger.pdf"))
{
pdfdoc.InitSecurityHandler();
Console.WriteLine("Printing the input file using PDF.Print.StartPrintJob...");
PrinterMode printerMode = new PrinterMode();
printerMode.SetAutoCenter(true);
printerMode.SetAutoRotate(true);
printerMode.SetCollation(true);
printerMode.SetCopyCount(1);
printerMode.SetDPI(300); // Set print quality to 300 DPI
printerMode.SetDuplexing(PrinterMode.DuplexMode.e_Duplex_Auto);
printerMode.SetNUp(PrinterMode.NUp.e_NUp_1_1, PrinterMode.NUpPageOrder.e_PageOrder_LeftToRightThenTopToBottom);
printerMode.SetOrientation(PrinterMode.Orientation.e_Orientation_Portrait);
printerMode.SetOutputAnnot(PrinterMode.PrintContentTypes.e_PrintContent_DocumentAndAnnotations);
printerMode.SetOutputColor(PrinterMode.OutputColor.e_OutputColor_Grayscale);
printerMode.SetOutputPageBorder(false);
printerMode.SetOutputQuality(PrinterMode.OutputQuality.e_OutputQuality_Medium);
printerMode.SetPaperSize(new Rect(0, 0, 612, 792));
PageSet pagesToPrint = new PageSet(1, pdfdoc.GetPageCount(), PageSet.Filter.e_all);
Print.StartPrintJob(pdfdoc, "", pdfdoc.GetFileName(), "", pagesToPrint, printerMode, null);
}
}
}
}
Imports System
Imports pdftron
Imports pdftron.PDF
Imports pdftron.Common
Imports pdftron.Filters
Namespace PDFPrintTestCS
Friend Class Program
Shared Sub Main(ByVal args() As String)
Console.WriteLine("Opening the input file...")
Using pdfdoc As New PDFDoc("tiger.pdf")
pdfdoc.InitSecurityHandler()
Console.WriteLine("Printing the input file using PDF.Print.StartPrintJob...")
Dim printerMode As New PrinterMode()
printerMode.SetAutoCenter(True)
printerMode.SetAutoRotate(True)
printerMode.SetCollation(True)
printerMode.SetCopyCount(1)
printerMode.SetDPI(300) ' Set print quality to 300 DPI
printerMode.SetDuplexing(PrinterMode.DuplexMode.e_Duplex_Auto)
printerMode.SetNUp(PrinterMode.NUp.e_NUp_1_1, PrinterMode.NUpPageOrder.e_PageOrder_LeftToRightThenTopToBottom)
printerMode.SetOrientation(PrinterMode.Orientation.e_Orientation_Portrait)
printerMode.SetOutputAnnot(PrinterMode.PrintContentTypes.e_PrintContent_DocumentAndAnnotations)
printerMode.SetOutputColor(PrinterMode.OutputColor.e_OutputColor_Grayscale)
printerMode.SetOutputPageBorder(False)
printerMode.SetOutputQuality(PrinterMode.OutputQuality.e_OutputQuality_Medium)
printerMode.SetPaperSize(New Rect(0, 0, 612, 792))
Dim pagesToPrint As New PageSet(1, pdfdoc.GetPageCount(), PageSet.Filter.e_all)
Print.StartPrintJob(pdfdoc, "", pdfdoc.GetFileName(), "", pagesToPrint, printerMode, Nothing)
End Using
End Sub
End Class
End Namespace
8. 從HTML製作PDF
這兩個程式庫都具有HTML到PDF的轉換能力,但方法略有不同。
8.1. 使用IronPDF從HTML製作PDF
IronPDF不需要使用JSON或加密機制。 IronPDF支持多種方法。 例如:
HTML文件到PDF
using IronPdf;
class HtmlToPdf
{
static void Main(string[] args)
{
var Renderer = new IronPdf.ChromePdfRenderer();
Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>").SaveAs("pixel-perfect.pdf");
}
}
using IronPdf;
class HtmlToPdf
{
static void Main(string[] args)
{
var Renderer = new IronPdf.ChromePdfRenderer();
Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>").SaveAs("pixel-perfect.pdf");
}
}
Imports IronPdf
Friend Class HtmlToPdf
Shared Sub Main(ByVal args() As String)
Dim Renderer = New IronPdf.ChromePdfRenderer()
Renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>").SaveAs("pixel-perfect.pdf")
End Sub
End Class
URL到PDF
using IronPdf;
class UrlToPdf
{
static void Main(string[] args)
{
IronPdf.ChromePdfRenderer Renderer = new IronPdf.ChromePdfRenderer();
var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
Pdf.SaveAs("url.pdf");
}
}
using IronPdf;
class UrlToPdf
{
static void Main(string[] args)
{
IronPdf.ChromePdfRenderer Renderer = new IronPdf.ChromePdfRenderer();
var Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/");
Pdf.SaveAs("url.pdf");
}
}
Imports IronPdf
Friend Class UrlToPdf
Shared Sub Main(ByVal args() As String)
Dim Renderer As New IronPdf.ChromePdfRenderer()
Dim Pdf = Renderer.RenderUrlAsPdf("https://ironpdf.com/")
Pdf.SaveAs("url.pdf")
End Sub
End Class
8.2. 使用PDFNet從HTML製作PDF
PDFNet同樣提供HTML到PDF的轉換功能,通過頁面轉換和URL轉換。 由於程式碼較長,我們在這裡只給您一個範例。
class HTML2PDFSample
{
private static pdftron.PDFNetLoader pdfNetLoader = pdftron.PDFNetLoader.Instance();
static HTML2PDFSample() {}
static void Main(string[] args)
{
string output_path = "../../../../TestFiles/Output/html2pdf_example";
string host = "https://www.pdftron.com";
HTML2PDF.SetModulePath("../../../../../Lib");
if (!HTML2PDF.IsModuleAvailable())
{
Console.WriteLine();
Console.WriteLine("Unable to run HTML2PDFTest: PDFTron SDK HTML2PDF module not available.");
return;
}
try
{
using (PDFDoc doc = new PDFDoc())
{
if (HTML2PDF.Convert(doc, host + "/"))
doc.Save(output_path + "_01.pdf", SDFDoc.SaveOptions.e_linearized);
else
Console.WriteLine("Conversion failed.");
}
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
}
}
class HTML2PDFSample
{
private static pdftron.PDFNetLoader pdfNetLoader = pdftron.PDFNetLoader.Instance();
static HTML2PDFSample() {}
static void Main(string[] args)
{
string output_path = "../../../../TestFiles/Output/html2pdf_example";
string host = "https://www.pdftron.com";
HTML2PDF.SetModulePath("../../../../../Lib");
if (!HTML2PDF.IsModuleAvailable())
{
Console.WriteLine();
Console.WriteLine("Unable to run HTML2PDFTest: PDFTron SDK HTML2PDF module not available.");
return;
}
try
{
using (PDFDoc doc = new PDFDoc())
{
if (HTML2PDF.Convert(doc, host + "/"))
doc.Save(output_path + "_01.pdf", SDFDoc.SaveOptions.e_linearized);
else
Console.WriteLine("Conversion failed.");
}
}
catch (PDFNetException e)
{
Console.WriteLine(e.Message);
}
}
}
Friend Class HTML2PDFSample
Private Shared pdfNetLoader As pdftron.PDFNetLoader = pdftron.PDFNetLoader.Instance()
Shared Sub New()
End Sub
Shared Sub Main(ByVal args() As String)
Dim output_path As String = "../../../../TestFiles/Output/html2pdf_example"
Dim host As String = "https://www.pdftron.com"
HTML2PDF.SetModulePath("../../../../../Lib")
If Not HTML2PDF.IsModuleAvailable() Then
Console.WriteLine()
Console.WriteLine("Unable to run HTML2PDFTest: PDFTron SDK HTML2PDF module not available.")
Return
End If
Try
Using doc As New PDFDoc()
If HTML2PDF.Convert(doc, host & "/") Then
doc.Save(output_path & "_01.pdf", SDFDoc.SaveOptions.e_linearized)
Else
Console.WriteLine("Conversion failed.")
End If
End Using
Catch e As PDFNetException
Console.WriteLine(e.Message)
End Try
End Sub
End Class
9. 授權
IronPDF是一個提供免費開發者授權的程式庫。 IronPDF也提供特殊的定價方案:輕量版套餐從$999開始,沒有隱藏費用。 也可以再分發SaaS和OEM產品。 所有授權均包括30天的退款保證、一年的軟體支持和升級、開發/測試/上線/生產的有效性,以及永久授權(一次性購買)。 IronPDF授權為使用者需求提供最大的性能。 前往這個IronPDF授權頁面查看IronPDF的整個定價結構和許可證。
PDFTron PDFNet SDK提供的幾種授權選擇適合您的業務需求。 企業及OEM再分發提供三種型別的授權。 企業授權僅供組織使用,不能在應用分發中使用。 需要文件系統存取的額外API也包含在授權中。 所有授權均附帶授權金鑰。 三種型別的授權是:
- 查看器
- 查看器和註釋
- 核心SDK
如需更多資訊,請存取這個PDFTron授權資訊頁面。
10. 總結
IronPDF提供了許多功能,用於處理PDF文件並將其轉換為不同格式。 從HTML到PDF的轉換是以向量格式生成,適合高質量的商業列印。 因此,您會得到一個清晰、高質量的PDF。 授權和定價資訊可以在網站上找到。
與IronPDF類似,PDFNet幫助過渡、註釋、簽名、填寫、轉換和編輯PDF文件。 它支持多個平台,包括Windows、iOS、Android、WEB和Linux。 使用於生產的PDFNet SDK需要產品金鑰。
IronPDF的授權以開發者為中心,這意味著您必須根據使用產品的開發者數量獲取授權。 另一方面,PDFNet授權的工作方式不同,而是基於功能的授權運行。 這意味著您必須獲取支持所需功能的授權。 IronPDF授權包含所有功能。 使用PDFNet時,某些功能(如文件轉換)需要作為附加功能購買。
IronPDF程式庫提供以有組織的方式提供功能,使其更容易以幾行程式碼來執行大任務。 Iron Software目前提供五合一的工具包,僅需支付兩個的價格。 Iron Suite中的工具包括:
請存取此Iron Suite資訊頁面以探索Iron Suite。
常見問題
文章中比較的關鍵 PDF 程式庫是哪些?
這篇文章比較了 Iron Software 開發的 IronPDF 和 PDFTron 的 PDFNet,著重於它們在 .NET Framework 中對 C# 開發者的能力。
如何在C#中將HTML轉換為PDF?
您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字串轉換為 PDF。此外,您還可以使用 IronPDF 強大的 Chromium 引擎將 HTML 檔案和 URL 轉換為 PDF。
IronPDF 支援哪些作業系統?
IronPDF 支援多個作業系統,包括 Windows、Azure 和 Docker,允許無縫地整合到各種開發環境中。
IronPDF 如何處理 PDF 資料擷取?
IronPDF 允許有效的 PDF 資料擷取,使開發者能夠輕鬆從 PDF 文件中檢索文字和圖像以進行進一步處理。
IronPDF 的安裝選項有哪些?
IronPDF 可以通過 Visual Studio NuGet 套件管理器、Visual Studio 命令列或直接從 NuGet 資料庫中安裝,確保開發者可以輕鬆設定。
IronPDF 和 PDFNet 之間的授權差異是什麼?
IronPDF 提供以開發者為中心的授權,其中包含所有功能,而 PDFNet 授權基於功能,可能需要為特定功能額外購買。
IronPDF 是否適合處理大型 PDF 任務?
是的,IronPDF 因其易用性和最少的程式碼需求而受到讚譽,使其適合有效地處理大型 PDF 任務。
Iron Software 套件包含哪些附加工具?
Iron Software 套件包括 IronBarcode、IronXL、IronOCR、IronPDF 和 IronWebscraper,作為套裝方案提供,提高了對開發者的吸引力。



