
如何使用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
同时从您的部署中移除本地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.vb or Startup.vb)
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" .
完整的 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");
}
}' NuGet: Install-Package MuPDF.NET
Imports MuPDFCore
Imports System.IO
Class Program
Shared Sub Main()
' MuPDF doesn't support HTML 至 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 至 PDF conversion")
End Sub
End Class' NuGet: Install-Package MuPDF.NET
Imports MuPDFCore
Imports System.IO
Class Program
Shared Sub Main()
' MuPDF doesn't support HTML 至 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 至 PDF conversion")
End Sub
End ClassAfter (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");
}
}' NuGet: Install-Package IronPdf
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' NuGet: Install-Package IronPdf
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 ModuleImports 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 ModuleAfter (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);
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports System
Module Program
Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
Dim text As String = pdf.ExtractAllText()
Console.WriteLine(text)
End Sub
End Module' NuGet: Install-Package IronPdf
Imports IronPdf
Imports System
Module Program
Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
Dim text As String = pdf.ExtractAllText()
Console.WriteLine(text)
End Sub
End ModuleMuPDF.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 ClassImports 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 ClassAfter (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");
}
}' NuGet: Install-Package IronPdf
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' NuGet: Install-Package IronPdf
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 ClassMuPDF.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
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 pdfImports 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 pdfImports 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;
}' 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' 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
};'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
}'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")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' 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()' 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);netnet迁移清单
迁移前
- 清点代码库中所有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)上进行测试
- 考虑添加新功能(水印、安全设置、页眉/页脚)
Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。
相关文章


