如何在HTML到PDF页面中处理断页
BitMiracle Docotic PDF 是一个广受好评的 .NET PDF 库,以其 100% 的托管代码架构和广泛的 PDF 编程操作能力而闻名。 然而,其模块化附加结构--需要单独的软件包来实现 HTML 到 PDF 的转换、布局功能和其他功能--增加了项目管理和许可的复杂性。 本综合指南提供了从BitMiracle Docotic PDF逐步迁移到IronPDF的路径--IronPDF 是一个统一的 .NET PDF 库,内置基于 Chromium 的 HTML 渲染功能,所有功能都包含在一个 NuGet 包中。
为什么要从BitMiracle Docotic PDF迁移到 IronPDF?
虽然BitMiracle Docotic PDF提供了强大的 PDF 操作功能,但有几个因素促使开发团队寻求具有更精简架构的替代产品。
软件包架构比较
BitMiracle Docotic PDF 采用模块化附加方法,需要多个软件包才能实现全部功能:
| 方面 | BitMiracle Docotic PDF | IronPDF |
|---|---|---|
| HTML-to-PDF | 需要单独的插件 (HtmlToPdf) | 内置核心功能 |
| 软件包结构 | 核心 + 多个附加组件 | 单个 NuGet 软件包 |
| 许可模式 | 按次许可 | 所有功能包括 |
| API 复杂性 | 每个附加组件都有独立的命名空间 | 统一 API |
| HTML 引擎 | Chromium (通过附加组件) | Chromium (内置) |
| 社区规模 | 较小 | 规模更大、资源更多 |
| 文档 | 技术参考 | 广泛的教程 |
功能对等
这两个库都支持全面的 PDF 功能:
| 特征 | BitMiracle Docotic PDF | IronPDF |
|---|---|---|
| 从零开始创建 PDF | ✅ | ✅ |
| HTML 至 PDF | ✅(需要插件) | ✅(内置) |
| URL 至 PDF | ✅(需要插件) | ✅(内置) |
| PDF 操作 | ✅ | ✅ |
| 文本提取 | ✅ | ✅ |
| 合并/拆分 | ✅ | ✅ |
| 数字签名 | ✅ | ✅ |
| 加密 | ✅ | ✅ |
| 表格填写 | ✅ | ✅ |
| 符合 PDF/A 标准 | ✅ | ✅ |
方法上的主要差异
BitMiracle Docotic PDF使用基于画布的绘图和坐标定位 (canvas.DrawString(x, y, text)),而IronPDF利用HTML/CSS进行布局和定位。 这代表了一种模式的转变,简化了熟悉网络技术的开发人员的内容创建。
迁移前准备
前提条件
确保您的环境符合这些要求:
- .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 或带有 C# 扩展的 VS Code
- 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用)
审计BitMiracle Docotic PDF的使用情况
在解决方案目录中运行这些命令,以识别所有 Docotic.Pdf 引用:
# Find all Docotic.Pdf usages in your codebase
grep -r "using BitMiracle.Docotic" --include="*.cs" .
grep -r "PdfDocument\|PdfPage\|PdfCanvas" --include="*.cs" .
# Find NuGet package references
grep -r "Docotic.Pdf" --include="*.csproj" .
# Find all Docotic.Pdf usages in your codebase
grep -r "using BitMiracle.Docotic" --include="*.cs" .
grep -r "PdfDocument\|PdfPage\|PdfCanvas" --include="*.cs" .
# Find NuGet package references
grep -r "Docotic.Pdf" --include="*.csproj" .
值得期待的重大变化
| 变更 | BitMiracle Docotic PDF | IronPDF | 影响 |
|---|---|---|---|
| HTML 渲染 | 需要 HtmlToPdf 附加组件 | 内置 | 删除附加软件包 |
| 页面索引 | 基于0的 (Pages[0]) |
基于0的 (Pages[0]) |
无需改动 |
| 坐标系 | 左下方原点 | HTML/CSS 流程 | 使用 CSS 进行定位 |
| 画布绘图 | PdfCanvas.DrawText() |
HTML 标记 | 范式转换 |
| 文本提取 | page.GetText() |
pdf.ExtractAllText() |
方法名称更改 |
| 文档加载 | new PdfDocument(path) |
PdfDocument.FromFile(path) |
构造函数 → 静态方法 |
| 节约 | document.Save(path) |
pdf.SaveAs(path) |
方法名称更改 |
| 处置 | IDisposable 模式 |
不要求 | 简化资源管理 |
逐步迁移过程
步骤 1:更新 NuGet 软件包
删除BitMiracle Docotic PDF软件包并安装 IronPDF:
# Remove Docotic.Pdf packages
dotnet remove package BitMiracle.Docotic.Pdf
dotnet remove package BitMiracle.Docotic.Pdf.HtmlToPdf
dotnet remove package BitMiracle.Docotic.Pdf.Layout
# Install IronPDF
dotnet add package IronPdf
# Remove Docotic.Pdf packages
dotnet remove package BitMiracle.Docotic.Pdf
dotnet remove package BitMiracle.Docotic.Pdf.HtmlToPdf
dotnet remove package BitMiracle.Docotic.Pdf.Layout
# Install IronPDF
dotnet add package IronPdf
步骤 2:更新命名空间引用
用IronPDF替换BitMiracle Docotic PDF命名空间:
// Remove these
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.Layout;
// HtmlConverter from the BitMiracle.Docotic.Pdf.HtmlToPdf NuGet package
// also lives in the BitMiracle.Docotic.Pdf namespace (no extra using needed).
// Add this
using IronPdf;
// Remove these
using BitMiracle.Docotic.Pdf;
using BitMiracle.Docotic.Pdf.Layout;
// HtmlConverter from the BitMiracle.Docotic.Pdf.HtmlToPdf NuGet package
// also lives in the BitMiracle.Docotic.Pdf namespace (no extra using needed).
// Add this
using IronPdf;
Imports IronPdf
步骤 3:配置许可证
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完整的 API 迁移参考
文档操作
| 任务 | BitMiracle Docotic PDF | IronPDF |
|---|---|---|
| 创建空文档 | new PdfDocument() |
new PdfDocument() |
| 从文件加载 | new PdfDocument(path) |
PdfDocument.FromFile(path) |
| 从流加载 | PdfDocument.Load(stream) |
PdfDocument.FromStream(stream) |
| 从字节加载 | PdfDocument.Load(bytes) |
PdfDocument.FromBinaryData(bytes) |
| 保存到文件 | document.Save(path) |
pdf.SaveAs(path) |
| 获取页数 | document.PageCount |
pdf.PageCount |
| 关闭/处置 | document.Dispose() |
不要求 |
HTML 到 PDF 转换
| 任务 | BitMiracle Docotic PDF(HtmlToPdf 附加组件) | IronPDF |
|---|---|---|
| HTML 字符串到 PDF | await converter.CreatePdfFromStringAsync(html) |
renderer.RenderHtmlAsPdf(html) |
| HTML 文件到 PDF | await converter.CreatePdfAsync(filePath) |
renderer.RenderHtmlFileAsPdf(path) |
| URL 至 PDF | await converter.CreatePdfAsync(new Uri(url)) |
renderer.RenderUrlAsPdf(url) |
| 设置页面大小 | options.Page.SetSize(PdfPaperSize.A4) |
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 |
| 设置页边距 | options.Page.MarginTop = 20 (等) |
renderer.RenderingOptions.MarginTop = 20 |
合并和拆分操作
| 任务 | BitMiracle Docotic PDF | IronPDF |
|---|---|---|
| 合并文件 | doc1.Append("file.pdf") (路径/流/字节) |
PdfDocument.Merge(pdf1, pdf2) |
| 拆分文件 | 将 document.CopyPage(index) 到新文档 |
pdf.CopyPages(start, end) |
代码迁移示例
HTML 到 PDF 转换
最常见的操作展示了IronPDF带来的显著简化。
BitMiracle Docotic PDF 实现:
// NuGet: Install-Package BitMiracle.Docotic.Pdf
// NuGet: Install-Package BitMiracle.Docotic.Pdf.HtmlToPdf (separate add-on required)
using BitMiracle.Docotic.Pdf;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// HtmlConverter is async-only and downloads Chromium on first use
using var converter = await HtmlConverter.CreateAsync();
string html = "<html><body><h1>Hello World</h1><p>This isHTML 至 PDFconversion.</p></body></html>";
using var pdf = await converter.CreatePdfFromStringAsync(html);
pdf.Save("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package BitMiracle.Docotic.Pdf
// NuGet: Install-Package BitMiracle.Docotic.Pdf.HtmlToPdf (separate add-on required)
using BitMiracle.Docotic.Pdf;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// HtmlConverter is async-only and downloads Chromium on first use
using var converter = await HtmlConverter.CreateAsync();
string html = "<html><body><h1>Hello World</h1><p>This isHTML 至 PDFconversion.</p></body></html>";
using var pdf = await converter.CreatePdfFromStringAsync(html);
pdf.Save("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports BitMiracle.Docotic.Pdf
Imports System
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
' HtmlConverter is async-only and downloads Chromium on first use
Using converter = Await HtmlConverter.CreateAsync()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is HTML to PDF conversion.</p></body></html>"
Using pdf = Await converter.CreatePdfFromStringAsync(html)
pdf.Save("output.pdf")
End Using
Console.WriteLine("PDF created successfully")
End Using
End Function
End Module
IronPDF 实现:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This isHTML 至 PDFconversion.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This isHTML 至 PDFconversion.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is HTML to PDF conversion.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
IronPDF消除了对 using 语句的要求,并提供了一个专用的 ChromePdfRenderer 类,清楚地表明其基于Chromium的渲染能力。 有关更多 HTML 转换选项,请参阅 HTML 转 PDF 文档。
合并多个 PDF 文件
BitMiracle Docotic PDF 实现:
// NuGet: Install-Package BitMiracle.Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;
class Program
{
static void Main()
{
using (var pdf1 = new PdfDocument("document1.pdf"))
{
// PdfDocument.Append accepts a file path, Stream, or byte[] —
// not another PdfDocument instance.
pdf1.Append("document2.pdf");
pdf1.Save("merged.pdf");
}
Console.WriteLine("PDFs merged successfully");
}
}
// NuGet: Install-Package BitMiracle.Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;
class Program
{
static void Main()
{
using (var pdf1 = new PdfDocument("document1.pdf"))
{
// PdfDocument.Append accepts a file path, Stream, or byte[] —
// not another PdfDocument instance.
pdf1.Append("document2.pdf");
pdf1.Save("merged.pdf");
}
Console.WriteLine("PDFs merged successfully");
}
}
Imports BitMiracle.Docotic.Pdf
Imports System
Class Program
Shared Sub Main()
Using pdf1 As New PdfDocument("document1.pdf")
' PdfDocument.Append accepts a file path, Stream, or byte[] —
' not another PdfDocument instance.
pdf1.Append("document2.pdf")
pdf1.Save("merged.pdf")
End Using
Console.WriteLine("PDFs merged successfully")
End Sub
End Class
IronPDF 实现:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim pdf1 As PdfDocument = PdfDocument.FromFile("document1.pdf")
Dim pdf2 As PdfDocument = PdfDocument.FromFile("document2.pdf")
Dim merged As PdfDocument = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
merged.SaveAs("merged.pdf")
Console.WriteLine("PDFs merged successfully")
End Sub
End Module
IronPDF的静态 Merge 方法直接接受多个文档,提供了比迭代 Append 模式更清晰的API。 更多选项请参阅PDF 合并文档。
文本提取
BitMiracle Docotic PDF 实现:
// NuGet: Install-Package BitMiracle.Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;
class Program
{
static void Main()
{
using (var pdf = new PdfDocument("document.pdf"))
{
string allText = "";
foreach (var page in pdf.Pages)
{
allText += page.GetText();
}
Console.WriteLine("Extracted text:");
Console.WriteLine(allText);
}
}
}
// NuGet: Install-Package BitMiracle.Docotic.Pdf
using BitMiracle.Docotic.Pdf;
using System;
class Program
{
static void Main()
{
using (var pdf = new PdfDocument("document.pdf"))
{
string allText = "";
foreach (var page in pdf.Pages)
{
allText += page.GetText();
}
Console.WriteLine("Extracted text:");
Console.WriteLine(allText);
}
}
}
Imports BitMiracle.Docotic.Pdf
Imports System
Class Program
Shared Sub Main()
Using pdf As New PdfDocument("document.pdf")
Dim allText As String = ""
For Each page In pdf.Pages
allText &= page.GetText()
Next
Console.WriteLine("Extracted text:")
Console.WriteLine(allText)
End Using
End Sub
End Class
IronPDF 实现:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
Console.WriteLine("Extracted text:");
Console.WriteLine(allText);
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
Console.WriteLine("Extracted text:");
Console.WriteLine(allText);
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim allText As String = pdf.ExtractAllText()
Console.WriteLine("Extracted text:")
Console.WriteLine(allText)
End Sub
End Class
IronPDF 将文本提取从多行循环减少到单个方法调用。 有关更多提取选项,请参阅文本提取文档。
密码保护和加密
IronPDF 实现:
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");
// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("protected.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");
// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("protected.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>")
' Set security
pdf.SecuritySettings.UserPassword = "userPassword"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SaveAs("protected.pdf")
有关全面的安全选项,请参阅加密文档。
页眉和页脚
IronPDF 实现:
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:12px;'>
Company Header - Confidential
</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages}
</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
pdf.SaveAs("with_headers.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:12px;'>
Company Header - Confidential
</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages}
</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
pdf.SaveAs("with_headers.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='text-align:center; font-size:12px;'>
Company Header - Confidential
</div>",
.DrawDividerLine = True,
.MaxHeight = 30
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='text-align:center; font-size:10px;'>
Page {page} of {total-pages}
</div>",
.DrawDividerLine = True,
.MaxHeight = 25
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>")
pdf.SaveAs("with_headers.pdf")
IronPDF支持占位符标记,如 {page} 和 {total-pages} 用于动态页码。 有关更多选项,请参阅页眉和页脚文档。
关键迁移说明
画布到 HTML 的范式转变
BitMiracle Docotic PDF 基于画布的绘图方法必须通过 CSS 定位转换为 HTML:
BitMiracle Docotic PDF 模式:
var canvas = pdfPage.Canvas;
canvas.DrawString(50, 50, "Hello, World!");
var canvas = pdfPage.Canvas;
canvas.DrawString(50, 50, "Hello, World!");
Dim canvas = pdfPage.Canvas
canvas.DrawString(50, 50, "Hello, World!")
IronPDF模式:
var html = "<div style='position:absolute; left:50px; top:50px;'>Hello, World!</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
var html = "<div style='position:absolute; left:50px; top:50px;'>Hello, World!</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
Dim html As String = "<div style='position:absolute; left:50px; top:50px;'>Hello, World!</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
同页索引
两个库都使用基于0的索引(Pages[0] 是第一页)—页面访问代码不需要更改。
无需处理
IronPDF不需要 using 语句进行内存管理,简化了代码结构:
//BitMiracle Docotic PDF- disposal required
using (var pdf = new PdfDocument("input.pdf"))
{
// operations
}
//IronPDF- disposal optional
var pdf = PdfDocument.FromFile("input.pdf");
// operations - no using statement needed
//BitMiracle Docotic PDF- disposal required
using (var pdf = new PdfDocument("input.pdf"))
{
// operations
}
//IronPDF- disposal optional
var pdf = PdfDocument.FromFile("input.pdf");
// operations - no using statement needed
Imports BitMiracle.Docotic.Pdf
' BitMiracle Docotic PDF - disposal required
Using pdf As New PdfDocument("input.pdf")
' operations
End Using
' IronPDF - disposal optional
Dim pdf = PdfDocument.FromFile("input.pdf")
' operations - no using statement needed
同步支持
BitMiracle Docotic PDF 的 HtmlToPdf 附加组件要求处处采用异步模式。IronPDF支持同步和异步方法:
// Synchronous
var pdf = renderer.RenderHtmlAsPdf(html);
// Asynchronous
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
// Synchronous
var pdf = renderer.RenderHtmlAsPdf(html);
// Asynchronous
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
' Synchronous
Dim pdf = renderer.RenderHtmlAsPdf(html)
' Asynchronous
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
ASP.NET Core 集成
IronPDF模式:
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
}
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("[controller]")>
Public Class PdfController
Inherits ControllerBase
<HttpGet("generate")>
Public Function GeneratePdf() As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>")
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
<HttpGet("generate-async")>
Public Async Function GeneratePdfAsync() As Task(Of IActionResult)
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>")
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
End Class
迁移后核对表
完成代码迁移后,请验证以下内容:
运行所有单元测试以验证 PDF 生成功能是否正常。
- 比较 PDF 输出质量(IronPDF 的 Chromium 引擎渲染效果可能略有不同——通常更好)
- 验证文本提取准确性
- 测试表单填写功能
- 如适用,验证数字签名
- 性能测试批量操作
- 在所有目标环境中进行测试
- 更新 CI/CD 流水线
- 删除 Docotic.Pdf 许可证文件
其他资源
从BitMiracle Docotic PDF迁移到IronPDF可以消除管理多个附加软件包的复杂性,同时提供相同的基于 Chromium 的 HTML 渲染功能。 从基于画布的绘图过渡到 HTML/CSS 定位,利用了大多数 .NET 开发人员已经掌握的网络开发技能,从而使 PDF 生成代码更具可维护性。

