如何使用C#在PDF中旋转文本
为什么要从MuPDF迁移到 IronPDF.
MuPDF的挑战
MuPDF是一个功能强大的PDF工具包,但其来自Artifex的双AGPL/商业许可证和渲染优先的设计会为.NET开发人员构建商业HTML驱动的应用程序带来真正的摩擦。 有两个主要的.NET包装器: MuPDFCore(社区,由arklumpus,AGPL-3.0)和MuPDF.NET(Artifex的官方C#绑定,反映PyMuPDF)。
-
AGPL许可证陷阱: MuPDF和包装器都默认以AGPL-3.0发布。 在AGPL代码上分发闭源产品需要选择在AGPL下开源,或从Artifex购买商业许可证(价格基于报价,没有公布)。
-
渲染优先: 虽然MuPDF.NET可以合并、消隐、签名并加盖水印(反映PyMuPDF),大部分API和工具围绕浏览和结构化文本提取而非HTML驱动的文档生成。
-
没有HTML到PDF引擎: MuPDF.NET和MuPDFCore都不提供HTML/CSS引擎。生成来自HTML的PDF需要借助单独的浏览器引擎(Chromium,wkhtmltopdf,PrinceXML),仅加载结果到MuPDF中。
-
本机依赖: 两者都提供
MuPDFCore.NativeAssets/MuPDF.NativeAssets包,并附带每个RID的二进制文件(win-x64, linux-x64, osx-x64)。 跨平台部署有效,但Docker映像需配合匹配的本地包和基础映像(glibc vs musl)。 -
没有HTML水印/页眉/页脚: 打印是基于图像和文本的每页; 没有像基于Chromium的渲染器所提供的
{page}/{total-pages}模板引擎。 - C交互接口: 包装器暴露映射到底层C库的上下文/文档生命周期——处理顺序重要,原生崩溃可能导致整个进程掉线,对于大型文档,封送成本不可小觑。
MuPDF与IronPDF对比
| 特征 | MuPDF | IronPDF |
|---|---|---|
| 许可证 | AGPL-3.0或基于报价的商业(Artifex) | 商业,公布了价格 |
| 主要重点 | 渲染、结构化文本、低级工具包 | HTML驱动的生成+操作 |
| HTML 至 PDF | 不支持(没有HTML引擎) | 完整的 Chromium 引擎 |
| PDF 创建 | 仅页面级(插入文本/图像/向量) | HTML、URL、图像 |
| PDF 操作 | 支持在MuPDF.NET中(InsertPdf, Select, DeletePage) |
支持(Merge, CopyPages, RemovePages) |
| 依赖关系 | 本地MuPDF + RID NativeAssets | 托管包装器+捆绑的Chromium |
| 平台支持 | Windows/Linux/macOS通过NativeAssets | Windows/Linux/macOS/Docker |
| 异步支持 | 大部分为同步; MuPDFCore中有一些异步 | 跨渲染器和文档的异步API |
| .NET 集成 | 围绕C库的P/Invoke包装器 | .NET 包装器+本地 Chromium |
IronPDF作为托管.NET库运行,涵盖现代.NET版本,不涉及原生互操作复杂性。
迁移复杂性评估
按功能估算的工作量
| 特征 | 迁移复杂性 |
|---|---|
| 文件加载 | 极低 |
| 文本提取 | 极低 |
| PDF 合并 | low |
| 图像渲染 | low |
| HTML 至 PDF | 不适用(新能力) |
| 安全/水印 | 不适用(新能力) |
范式转换
MuPDF此次迁移的根本转变在于从仅用于渲染的查看器转变为完整的PDF解决方案:
MuPDF.NET:文档 → doc[i] → GetText / GetPixmap / InsertPdf
MuPDFCore: MuPDFContext → MuPDFDocument → Pages[i] → Render / SaveImage
IronPDF: PdfDocument.FromFile() → 完整操作 → 创建/编辑/合并/安全
开始之前
前提条件
- .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 访问权限:能够安装 NuGet 包
- IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。
NuGet 软件包变更
# RemoveMuPDFpackages (whichever wrapper you used)
dotnet remove package MuPDF.NET
dotnet remove package MuPDFCore
dotnet remove package MuPDFCore.NativeAssets.Linux
dotnet remove package MuPDFCore.NativeAssets.MacOS
dotnet remove package MuPDFCore.NativeAssets.Windows
dotnet remove package MuPDF.NativeAssets
# Install IronPDF
dotnet add package IronPdf
# RemoveMuPDFpackages (whichever wrapper you used)
dotnet remove package MuPDF.NET
dotnet remove package MuPDFCore
dotnet remove package MuPDFCore.NativeAssets.Linux
dotnet remove package MuPDFCore.NativeAssets.MacOS
dotnet remove package MuPDFCore.NativeAssets.Windows
dotnet remove package MuPDF.NativeAssets
# Install IronPDF
dotnet add package IronPdf
同时从您的部署中移除本地MuPDF二进制文件:
- 删除
mupdf.dll,libmupdf.so,libmupdf.dylib - 删除特定平台的文件夹(
runtimes/*/native/) - 更新 Docker 文件以移除MuPDF安装
许可配置
// 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"
确定MuPDF的用途
# Find allMuPDFreferences
grep -r "MuPDF\|MuPDFCore\|MuPDFDocument" --include="*.cs" .
# Find allMuPDFreferences
grep -r "MuPDF\|MuPDFCore\|MuPDFDocument" --include="*.cs" .
完整的 API 参考
文档加载
| MuPDF | IronPDF |
|---|---|
new Document(path)(MuPDF.NET) / new MuPDFDocument(ctx, path)(MuPDFCore) |
PdfDocument.FromFile(path) |
new Document("pdf", stream)(MuPDF.NET) |
PdfDocument.FromStream(stream) |
doc.Close() / Dispose() |
pdf.Dispose() |
页面访问
| MuPDF | IronPDF |
|---|---|
doc.PageCount(MuPDF.NET) / document.Pages.Count(MuPDFCore) |
pdf.PageCount |
doc[index](MuPDF.NET) / document.Pages[index](MuPDFCore) |
pdf.Pages[index] |
doc[i].GetText() / 结构化文本迭代(MuPDFCore) |
page.Text |
文本提取
| MuPDF | IronPDF |
|---|---|
遍历doc[i].GetText() |
pdf.ExtractAllText() |
PDF 创建(MuPDF 中不提供)
| MuPDF | IronPDF |
|---|---|
| (无HTML引擎) | ChromePdfRenderer.RenderHtmlAsPdf(html) |
| (无HTML引擎) | ChromePdfRenderer.RenderUrlAsPdf(url) |
PDF操作
| MuPDF | IronPDF |
|---|---|
docA.InsertPdf(docB)(MuPDF.NET) |
PdfDocument.Merge(pdf1, pdf2) |
每页的page.InsertImage(...)(仅限于图像/文本印章) |
pdf.ApplyWatermark(html) |
doc.Save(path, encryption: ..., ownerPw: ..., userPw: ...) |
pdf.SecuritySettings |
代码迁移示例
示例 1:HTML 到 PDF 的转换(MuPDF 无法做到这一点)
之前 (MuPDF):
// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System.IO;
class Program
{
static void Main()
{
//MuPDFdoesn't supportHTML 至 PDFconversion directly
// You would need to use another library to convert HTML to a supported format first
// This is a limitation -MuPDFis primarily a PDF renderer/viewer
// Alternative: Use a browser engine or intermediate conversion
string html = "<html><body><h1>Hello World</h1></body></html>";
// Not natively supported in MuPDF
throw new NotSupportedException("MuPDF does not support directHTML 至 PDFconversion");
}
}
// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System.IO;
class Program
{
static void Main()
{
//MuPDFdoesn't supportHTML 至 PDFconversion directly
// You would need to use another library to convert HTML to a supported format first
// This is a limitation -MuPDFis primarily a PDF renderer/viewer
// Alternative: Use a browser engine or intermediate conversion
string html = "<html><body><h1>Hello World</h1></body></html>";
// Not natively supported in MuPDF
throw new NotSupportedException("MuPDF does not support directHTML 至 PDFconversion");
}
}
Imports MuPDFCore
Imports System.IO
Class Program
Shared Sub Main()
'MuPDF doesn't support HTML to PDF conversion directly
' You would need to use another library to convert HTML to a supported format first
' This is a limitation - MuPDF is primarily a PDF renderer/viewer
' Alternative: Use a browser engine or intermediate conversion
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
' Not natively supported in MuPDF
Throw New NotSupportedException("MuPDF does not support direct HTML to PDF conversion")
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
这个例子突出了MuPDF的最大限制:它根本无法将 HTML 转换为 PDF。 MuPDF代码显式抛出NotSupportedException,因为HTML到PDF的转换并不是MuPDF提供的功能。 如果您需要使用MuPDF的这一功能,您必须使用一个单独的库,如 wkhtmltopdf 或浏览器引擎,然后将生成的 PDF 加载到MuPDF中查看。
IronPDF的ChromePdfRenderer使用完整的Chromium引擎来渲染HTML,并支持完整的CSS3、JavaScript和现代Web标准。 RenderHtmlAsPdf()方法直接接受HTML字符串。 请参阅 HTML to PDF 文档,了解包括 URL 渲染和 HTML 文件转换在内的其他渲染选项。
示例 2:文本提取
之前 (MuPDF):
// NuGet: Install-Package MuPDF.NET
using MuPDF.NET;
using System;
using System.Text;
class Program
{
static void Main()
{
Document doc = new Document("input.pdf");
StringBuilder allText = new StringBuilder();
for (int i = 0; i < doc.PageCount; i++)
{
string pageText = doc[i].GetText();
allText.AppendLine(pageText);
}
Console.WriteLine(allText.ToString());
}
}
// NuGet: Install-Package MuPDF.NET
using MuPDF.NET;
using System;
using System.Text;
class Program
{
static void Main()
{
Document doc = new Document("input.pdf");
StringBuilder allText = new StringBuilder();
for (int i = 0; i < doc.PageCount; i++)
{
string pageText = doc[i].GetText();
allText.AppendLine(pageText);
}
Console.WriteLine(allText.ToString());
}
}
Imports MuPDF.NET
Imports System
Imports System.Text
Module Program
Sub Main()
Dim doc As New Document("input.pdf")
Dim allText As New StringBuilder()
For i As Integer = 0 To doc.PageCount - 1
Dim pageText As String = doc(i).GetText()
allText.AppendLine(pageText)
Next
Console.WriteLine(allText.ToString())
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
Dim text As String = pdf.ExtractAllText()
Console.WriteLine(text)
End Sub
End Class
MuPDF.NET方法打开一个StringBuilder构建文本。
IronPDF将此简化为三行:用ExtractAllText(),并打印结果。 无须手动迭代,无需StringBuilder。 了解更多关于从PDF中提取文本的信息。
示例 3:合并多个 PDF 文件
之前 (MuPDF):
// NuGet: Install-Package MuPDF.NET
using MuPDF.NET;
class Program
{
static void Main()
{
Document doc1 = new Document("file1.pdf");
Document doc2 = new Document("file2.pdf");
// Append every page of doc2 to the end of doc1.
doc1.InsertPdf(doc2);
doc1.Save("merged.pdf");
}
}
// NuGet: Install-Package MuPDF.NET
using MuPDF.NET;
class Program
{
static void Main()
{
Document doc1 = new Document("file1.pdf");
Document doc2 = new Document("file2.pdf");
// Append every page of doc2 to the end of doc1.
doc1.InsertPdf(doc2);
doc1.Save("merged.pdf");
}
}
Imports MuPDF.NET
Class Program
Shared Sub Main()
Dim doc1 As New Document("file1.pdf")
Dim doc2 As New Document("file2.pdf")
' Append every page of doc2 to the end of doc1.
doc1.InsertPdf(doc2)
doc1.Save("merged.pdf")
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.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("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("file1.pdf")
Dim pdf2 = PdfDocument.FromFile("file2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
MuPDF.NET支持通过insert_pdf(),并将一个文档的每一页追加到另一个文档中。 MuPDFCore没有暴露等效的高级合并API。
IronPDF的静态PdfDocument.Merge()方法接受多个PDF文档,并返回一个合并的文档,同时保持输入文件不变。 对于多个文档的合并,传递一个列表:PdfDocument.Merge(pdfList)。 有关其他选项,请参阅 合并和拆分 PDF 文档。
关键迁移说明
删除本地二进制文件
MuPDF 需要特定平台的本地库。 迁移到IronPDF后,删除所有MuPDF本地二进制文件:
# Delete native libraries
rm -f mupdf*.dll libmupdf*.so libmupdf*.dylib
# Remove runtime folders
rm -rf runtimes/*/native/
# Update Docker files to removeMuPDFinstallation
# Delete native libraries
rm -f mupdf*.dll libmupdf*.so libmupdf*.dylib
# Remove runtime folders
rm -rf runtimes/*/native/
# Update Docker files to removeMuPDFinstallation
IronPDF 是完全托管的 .NET 代码,无需跨平台管理本地二进制文件。
简化处置模式
MuPDFCore需要显式的MuPDFContext; MuPDF.NET隐藏了这一点,但仍需要Close() / Dispose():
// MuPDFCore: explicit context required
using (var context = new MuPDFContext())
using (var document = new MuPDFDocument(context, "input.pdf"))
{
// Work with document
}
// MuPDF.NET: implicit context, manual close
Document doc = new Document("input.pdf");
try { /* work */ } finally { doc.Close(); }
// IronPDF: simpler pattern
var pdf = PdfDocument.FromFile("input.pdf");
// Work with pdf
// MuPDFCore: explicit context required
using (var context = new MuPDFContext())
using (var document = new MuPDFDocument(context, "input.pdf"))
{
// Work with document
}
// MuPDF.NET: implicit context, manual close
Document doc = new Document("input.pdf");
try { /* work */ } finally { doc.Close(); }
// IronPDF: simpler pattern
var pdf = PdfDocument.FromFile("input.pdf");
// Work with pdf
Imports MuPDFCore
Imports MuPDF.NET
Imports IronPDF
' MuPDFCore: explicit context required
Using context As New MuPDFContext()
Using document As New MuPDFDocument(context, "input.pdf")
' Work with document
End Using
End Using
' MuPDF.NET: implicit context, manual close
Dim doc As New Document("input.pdf")
Try
' work
Finally
doc.Close()
End Try
' IronPDF: simpler pattern
Dim pdf = PdfDocument.FromFile("input.pdf")
' Work with pdf
页面迭代模式更改
MuPDF 使用基于索引的迭代,并有明确的页数:
// MuPDF.NET
for (int i = 0; i < doc.PageCount; i++)
{
var pageText = doc[i].GetText();
}
// MuPDFCore
for (int i = 0; i < document.Pages.Count; i++)
{
var pageText = document.Pages[i].GetText();
}
//IronPDF(foreach supported)
foreach (var page in pdf.Pages)
{
var pageText = page.Text;
}
// MuPDF.NET
for (int i = 0; i < doc.PageCount; i++)
{
var pageText = doc[i].GetText();
}
// MuPDFCore
for (int i = 0; i < document.Pages.Count; i++)
{
var pageText = document.Pages[i].GetText();
}
//IronPDF(foreach supported)
foreach (var page in pdf.Pages)
{
var pageText = page.Text;
}
Imports MuPDF.NET
Imports MuPDFCore
Imports IronPDF
' MuPDF.NET
For i As Integer = 0 To doc.PageCount - 1
Dim pageText = doc(i).GetText()
Next
' MuPDFCore
For i As Integer = 0 To document.Pages.Count - 1
Dim pageText = document.Pages(i).GetText()
Next
' IronPDF (foreach supported)
For Each page In pdf.Pages
Dim pageText = page.Text
Next
可用的新功能
迁移到IronPDF后,您将获得MuPDF无法提供的功能:
//PDF 创建from HTML (not possible in MuPDF)
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");
// Watermarks (not possible in MuPDF)
pdf.ApplyWatermark("<div style='color:red;opacity:0.3;'>DRAFT</div>");
// Password Protection (not possible in MuPDF)
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "user";
// Headers and Footers (no HTML header/footer template in MuPDF)
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
//PDF 创建from HTML (not possible in MuPDF)
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");
// Watermarks (not possible in MuPDF)
pdf.ApplyWatermark("<div style='color:red;opacity:0.3;'>DRAFT</div>");
// Password Protection (not possible in MuPDF)
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "user";
// Headers and Footers (no HTML header/footer template in MuPDF)
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
Imports System
' PDF 创建from HTML (not possible in MuPDF)
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>")
' Watermarks (not possible in MuPDF)
pdf.ApplyWatermark("<div style='color:red;opacity:0.3;'>DRAFT</div>")
' Password Protection (not possible in MuPDF)
pdf.SecuritySettings.OwnerPassword = "admin"
pdf.SecuritySettings.UserPassword = "user"
' Headers and Footers (no HTML header/footer template in MuPDF)
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
.MaxHeight = 25
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}
故障排除
问题 1:未找到 MuPDFDocument
问题: IronPDF中不存在MuPDFDocument类。
解决方案: 使用PdfDocument.FromFile():
// MuPDF
using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
// IronPDF
var pdf = PdfDocument.FromFile("input.pdf");
// MuPDF
using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
// IronPDF
var pdf = PdfDocument.FromFile("input.pdf");
Imports MuPDF
Imports IronPDF
Using document As New MuPDFDocument("input.pdf")
End Using
Dim pdf = PdfDocument.FromFile("input.pdf")
问题 2:Pages.Count 未找到
问题: document.Pages.Count模式不起作用。
解决方案: 使用pdf.PageCount:
// MuPDF
for (int i = 0; i < document.Pages.Count; i++)
// IronPDF
for (int i = 0; i < pdf.PageCount; i++)
// Or use: foreach (var page in pdf.Pages)
// MuPDF
for (int i = 0; i < document.Pages.Count; i++)
// IronPDF
for (int i = 0; i < pdf.PageCount; i++)
// Or use: foreach (var page in pdf.Pages)
' MuPDF
For i As Integer = 0 To document.Pages.Count - 1
' IronPDF
For i As Integer = 0 To pdf.PageCount - 1
' Or use: For Each page In pdf.Pages
问题 3:GetText() 未找到
问题: page.GetText()方法不存在。
解决方案: 使用pdf.ExtractAllText():
// MuPDF
string pageText = document.Pages[i].GetText();
// IronPDF
string pageText = pdf.Pages[i].Text;
// Or for all text:
string allText = pdf.ExtractAllText();
// MuPDF
string pageText = document.Pages[i].GetText();
// IronPDF
string pageText = pdf.Pages[i].Text;
// Or for all text:
string allText = pdf.ExtractAllText();
' MuPDF
Dim pageText As String = document.Pages(i).GetText()
' IronPDF
Dim pageText As String = pdf.Pages(i).Text
' Or for all text:
Dim allText As String = pdf.ExtractAllText()
问题4:无法找到InsertPdf
问题: MuPDF.NET的insert_pdf)在IronPDF中没有直接等效的名称,MuPDFCore中根本没有提供高级合并功能。
解决方案: 使用静态PdfDocument.Merge():
// MuPDF.NET
docA.InsertPdf(docB);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
// MuPDF.NET
docA.InsertPdf(docB);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
迁移清单
迁移前
- 清点代码库中所有MuPDF的使用情况
- 记录所有渲染操作(DPI、缩放因子)
- 确定任何 PDF 创建需求(目前使用外部工具)
- 列出文本提取要求
- 检查部署脚本中的原生二进制文件处理情况
- 获取IronPDF许可证密钥
软件包变更
- 删除
MuPDF.NET包 - 删除
MuPDFCore包 - 删除
MuPDFCore.NativeAssets.*/MuPDF.NativeAssets包 - 安装
IronPdfNuGet包:dotnet add package IronPdf - 更新命名空间导入
代码更改
- 在启动时添加许可证密钥配置
- 用
Document(MuPDF.NET) /MuPDFDocument(MuPDFCore) - 用
doc.PageCount/document.Pages.Count - 用
doc[i].GetText() - 用
Document.InsertPdf调用 删除显式上下文/释放样板 - 如有需要,添加 PDF 创建代码(HTML 转 PDF)
后迁移
- 从项目中移除原生MuPDF二进制文件
- 更新 Docker 文件以移除MuPDF安装
- 删除平台特定的运行时文件夹
- 运行回归测试,比较渲染输出
- 在所有目标平台(Windows、Linux、macOS)上进行测试
- 考虑添加新功能(水印、安全设置、页眉/页脚)

