如何在HTML中使用Java Script与PDF
为什么要从动态 PDF迁移到 IronPDF?
DynamicPDF 的产品碎片化是常见的迁移驱动力。 理解许可证模式有助于评估您当前实现的真实成本。
产品碎片化问题
DynamicPDF (ceTe Software) 将 PDF 功能作为单独许可的包进行提供:
- DynamicPDF Core Suite (
ceTe.DynamicPDF.CoreSuite.NET, v12.43.0):包括生成器、合并器和ReportWriter - DynamicPDF HTML Converter (
ceTe.DynamicPDF.HtmlConverter.NET, v3.3.0):HTML到PDF的单独插件 - DynamicPDF Converter (
ceTe.DynamicPDF.Converter.NET, v3.32.0):Office和50+文件格式转换 - DynamicPDF PrintManager (
ceTe.DynamicPDF.Printing.NET):编程打印 - DynamicPDF Rasterizer (
ceTe.DynamicPDF.Rasterizer.NET):PDF转图像 - DynamicPDF Viewer (
ceTe.DynamicPDF.Viewer.NET):WinForms/WPF查看器控件
生成器、合并器和报告编写器被合并到 Core Suite,但 HTML 渲染、光栅化、打印和查看仍然需要单独购买。IronPDF将这些功能打包成一个单一库和许可证。
架构比较
| 方面 | 动态 PDF | IronPDF |
|---|---|---|
| 产品模型 | 零散(5 个以上产品) | 一体化库 |
| 许可 | 需要多个许可证 | 单一许可证 |
| HTML 到 PDF | 单独购买附加组件 | 基于 Chromium 的内置 |
| CSS支持 | 有限(需要附加功能) | 带有 Flexbox/Grid 的完整 CSS3 |
| API 风格 | 基于坐标的定位 | HTML/CSS + 操作 API |
| 学习曲线 | Steep(多个应用程序接口) | 温和(网络技术) |
| 现代.NET | .NET Standard 2.0 / .NET 6 / .NET 8 / .NET Framework 4.6.2 | .NET 6/7/8/9+ 原生语言 |
主要迁移优势
1.单个包:一个 NuGet 包即可替代 3-5 个动态 PDF包 2.现代渲染: Chromium 引擎与传统渲染
- Web 技术:使用 HTML/CSS 而非基于坐标的定位 4.更简洁的 API:代码更少,更易读,更易于维护 5.无需额外购买: HTML、合并、安全功能全部包含在内
迁移前准备
前提条件
确保您的环境符合这些要求:
- .NET Framework 4.6.2+ or .NET 6/7/8/9+
- Visual Studio 2019+ 或带有 C# 扩展的 VS Code
- 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用)
审计动态 PDF的使用情况
在解决方案目录中运行这些命令,以识别所有动态 PDF引用:
# Find all动态 PDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic
# Find all动态 PDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic
需要查找的常见软件包:
ceTe.DynamicPDF.CoreSuite.NET(生成器 + 合并器 + ReportWriter)ceTe.DynamicPDF.HtmlConverter.NET(HTML到PDF插件)ceTe.DynamicPDF.Converter.NET(Office / 多格式到PDF)ceTe.DynamicPDF.Rasterizer.NET,ceTe.DynamicPDF.Printing.NET,ceTe.DynamicPDF.Viewer.NET
理解范式转变
从动态 PDF迁移到IronPDF时,最重要的变化是文档创建的基本方法。动态 PDF使用基于坐标的定位,您可以将元素放置在页面上特定的 X、Y 坐标上。IronPDF使用 HTML/CSS 渲染,您可以使用网络技术进行设计。
这种范式转变意味着将Table2元素转换为其HTML等价物——这一改变通常会导致代码更具可读性和可维护性。
逐步迁移过程
步骤 1:更新 NuGet 软件包
删除您实际安装的动态 PDF包并添加 IronPDF:
# Remove动态 PDFpackages (only those you actually have)
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
dotnet remove package ceTe.DynamicPDF.Converter.NET
dotnet remove package ceTe.DynamicPDF.Rasterizer.NET
dotnet remove package ceTe.DynamicPDF.Printing.NET
# Install IronPDF
dotnet add package IronPdf
# Remove动态 PDFpackages (only those you actually have)
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
dotnet remove package ceTe.DynamicPDF.Converter.NET
dotnet remove package ceTe.DynamicPDF.Rasterizer.NET
dotnet remove package ceTe.DynamicPDF.Printing.NET
# Install IronPDF
dotnet add package IronPdf
步骤 2:更新命名空间引用
用IronPDF替换动态 PDF命名空间:
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;
Imports IronPdf
步骤 3:配置许可证
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完整的 API 迁移参考
核心类映射
| DynamicPDF 类 | IronPDF 同等产品 |
|---|---|
Document |
ChromePdfRenderer |
Document |
PdfDocument |
Page |
HTML <div> 带分页 |
MergeDocument |
PdfDocument.Merge() |
HtmlConverter |
ChromePdfRenderer |
页面元素到 HTML 的映射
| DynamicPDF 页面元素 | IronPDF/HTML 同等版本 |
|---|---|
Label |
<p>, <span>, <div> |
TextArea |
<div>, <p> 带CSS |
Image |
<img> 标签 |
Table2 |
HTML <table> |
PageNumberingLabel |
{page} / {total-pages} 占位符 |
关键 API 映射
| 动态 PDF | IronPDF |
|---|---|
Document + Page |
ChromePdfRenderer |
Label, TextArea |
HTML <p>, <div> |
Table2 |
HTML <table> |
MergeDocument |
PdfDocument.Merge() |
HtmlConverter |
ChromePdfRenderer |
document.Draw() |
pdf.SaveAs() / pdf.BinaryData |
PageNumberingLabel %%CP%% |
{page} 占位符 |
代码迁移示例
HTML 到 PDF 转换
HTML到PDF的转换展示了DynamicPDF需要一个单独的HtmlConverter插件,而IronPDF内置了Chromium渲染。
DynamicPDF 实现:
// NuGet: Install-Package ceTe.DynamicPDF.Converter.NET
// HTML-to-PDF is a separate add-on; CoreSuite alone does not include it.
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.Converter.NET
// HTML-to-PDF is a separate add-on; CoreSuite alone does not include it.
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Conversion
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim converter As New HtmlConverter(html)
converter.Convert("output.pdf")
End Sub
End Class
IronPDF 实现:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF的ChromePdfRenderer提供了基于Chromium的渲染,完全支持CSS3,无需单独购买插件。 有关更多选项,请参阅 HTML 转 PDF 文档。
合并多个 PDF 文件
PDF合并展示了DynamicPDF的Merge方法的差异。
DynamicPDF 实现:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Merger
Class Program
Shared Sub Main()
Dim document As New MergeDocument("document1.pdf")
document.Append("document2.pdf")
document.Draw("merged.pdf")
End Sub
End Class
IronPDF 实现:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
IronPDF的静态PdfDocument对象。 更多选项请参阅PDF 合并文档。
在 PDF 中添加文本
文本位置展示了从DynamicPDF的基于坐标的TextStamper的范式转变。
DynamicPDF 实现:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Class Program
Shared Sub Main()
Dim document As New Document()
Dim page As New Page(PageSize.Letter)
Dim label As New Label("Hello from DynamicPDF!", 0, 0, 504, 100)
page.Elements.Add(label)
document.Pages.Add(page)
document.Draw("output.pdf")
End Sub
End Class
IronPDF 实现:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper As New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalAlignment = VerticalAlignment.Top
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF的TextStamper提供了基于对齐的定位而非基于坐标的放置,使布局在不同页面大小上更加适应。 有关更多选项,请参阅水印和盖章文档。
完整文档生成示例
本综合示例展示了将包含多个元素的动态 PDF文档转换为IronPDF的 HTML 方法。
DynamicPDF 实现:
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Imports ceTe.DynamicPDF.Merger
' Generation (requires Generator license)
Dim document As New Document()
Dim page As New Page(PageSize.A4)
Dim title As New Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18)
title.Align = TextAlign.Center
page.Elements.Add(title)
Dim table As New Table2(40, 60, 515, 500)
' ... complex table setup with columns, rows, cells...
page.Elements.Add(table)
document.Pages.Add(page)
document.Draw("invoice.pdf")
' Merging (requires Merger license)
Dim mergeDoc As New MergeDocument("cover.pdf")
mergeDoc.Append("invoice.pdf")
mergeDoc.Draw("final.pdf")
IronPDF 实现:
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' All features in one library
Dim html As String = "
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>"
Dim invoice As PdfDocument = renderer.RenderHtmlAsPdf(html)
' Merging included - no separate license
Dim cover As PdfDocument = PdfDocument.FromFile("cover.pdf")
Dim final As PdfDocument = PdfDocument.Merge(cover, invoice)
final.SaveAs("final.pdf")
关键迁移说明
基于坐标的 HTML/CSS 定位
基本模式的转变需要将 X、Y 坐标定位转换为基于 CSS 的布局:
//动态 PDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
//动态 PDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
'动态 PDF- coordinate-based
Dim label = New Label("Hello World", 100, 200, 300, 50)
'IronPDF- CSS positioning (if absolute positioning needed)
Dim html As String = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>"
'IronPDF- preferred approach (flow-based)
html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>"
页面编号语法
DynamicPDF 和IronPDF对页码使用不同的占位符语法:
//动态 PDFplaceholders
"Page %%CP%% of %%TP%%"
//IronPDFplaceholders
"Page {page} of {total-pages}"
//动态 PDFplaceholders
"Page %%CP%% of %%TP%%"
//IronPDFplaceholders
"Page {page} of {total-pages}"
'动态 PDFplaceholders
"Page %%CP%% of %%TP%%"
'IronPDFplaceholders
"Page {page} of {total-pages}"
页眉和页脚
将DynamicPDF的HtmlHeaderFooter:
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
'IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}
有关更多页眉/页脚选项,请参阅页眉和页脚文档。
安全设置
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
'IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.UserPassword = "userPassword"
有关全面的安全选项,请参阅加密文档。
迁移后核对表
完成代码迁移后,请验证以下内容:
- 生成PDF文件的可视化比较
- 检查文本位置和布局
- 测试表格渲染和溢出
- 检查所有页面的页眉/页脚
- 测试表单填写功能
- 验证安全性/加密
- 性能基准测试
- 删除未使用的动态 PDF许可证文件
- 更新文档
其他资源
从动态 PDF迁移到IronPDF将多种产品许可证整合为一个库,并用 Chromium 上的 HTML/CSS 渲染取代了基于坐标的位置。 已经熟悉网页技术的团队通常发现生成的代码更容易维护。

