跳至页脚内容
迁移指南

如何用 C# 从 MuPDF 迁移到 IronPDF

从MuPDF迁移到 IronPDF:完整的 C# 迁移指南。

从MuPDF迁移到IronPDF可以将您的 .NET PDF 工作流程从一个仅有渲染功能的库转变为一个具有完整创建、操作和安全功能的完整 PDF 解决方案,该库具有 AGPL 许可问题和本地依赖性。 本指南提供了一个全面的、分步骤的迁移路径,消除了本地二进制管理,同时增加了MuPDF无法提供的 HTML 到 PDF 的转换。

为什么要从MuPDF迁移到 IronPDF.

MuPDF的挑战

MuPDF 是一款优秀的 PDF 渲染器,但其 AGPL 许可证和仅渲染功能对构建商业应用程序的 .NET 开发人员造成了很大的限制:

1.AGPL 许可陷阱:MuPDF 的病毒式许可要求您根据 AGPL 协议开源整个应用程序,或者购买价格昂贵的商业许可,这些许可的定价不透明,需要联系销售人员。

2.仅关注渲染:MuPDF 是一个查看器/渲染器,它不是为从 HTML 创建 PDF、文档生成工作流、表单填充或添加水印和页眉/页脚而设计的。

3.不支持 HTML:MuPDF 不支持 HTML 到 PDF 的直接转换。 您需要先使用其他库将 HTML 转换为支持的格式。这是一个基本限制--MuPDF 主要是一个 PDF 渲染器/查看器。

4.本地依赖关系:针对特定平台的二进制文件需要对 Windows、Linux 和 macOS 进行手动管理。 Docker 部署因本地库要求而变得复杂,部署打包也带来了挑战。

5.有限的操作:不支持合并/拆分 PDF、页面旋转或重新排序、水印或注释或数字签名。

6.C Interop 复杂性:本地绑定会带来内存管理问题、特定平台的错误和调用开销。

MuPDF与IronPDF对比

特征MuPDFIronPDF
许可证AGPL(病毒)或昂贵的商业商业性,价格透明
主要重点渲染/查看完整的 PDF 解决方案
HTML 至 PDF不支持完整的 Chromium 引擎
PDF 创建不支持HTML、URL、图像
PDF 操作有限的完成(合并、拆分、编辑)
依赖关系本地二进制文件全面管理
平台支持每平台手册自动翻译
异步支持有限的完整的异步/等待
.NET 集成C# 互操作本地 .NET

对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队来说,IronPDF 作为一个完全托管的 .NET 库,提供了一个面向未来的基础,没有本地互操作的复杂性。


迁移复杂性评估

按功能估算的工作量

特征迁移复杂性备注
文件加载极低直接方法替换
文本提取极低更简单的应用程序接口
PDF 合并静态方法与手动循环
图像渲染RasterizeToImageFiles 与 pixmaps
HTML 至 PDF不适用(新能力)无法使用 MuPDF
安全/水印不适用(新能力)无法使用 MuPDF

范式转换

此次MuPDF迁移的根本转变是从 仅渲染的查看器完整的 PDF 解决方案

MuPDF:   MuPDFContext → MuPDFDocument → 页面迭代 → 仅渲染/提取
IronPDF.PdfDocument.FromFile.Text()()()()()()PdfDocument.FromFile() → 完全操作 → 创建/编辑/合并/安全

开始之前

前提条件

1..NET环境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet 访问:安装 NuGet 软件包的能力 3.IronPDF 许可证:从 ironpdf.com 获取许可证密钥

NuGet 软件包变更

# RemoveMuPDFpackages
dotnet remove package MuPDF.NET
dotnet remove package MuPDFCore
dotnet remove package MuPDFCore.MuPDFWrapper

# Install IronPDF
dotnet add package IronPdf
# RemoveMuPDFpackages
dotnet remove package MuPDF.NET
dotnet remove package MuPDFCore
dotnet remove package MuPDFCore.MuPDFWrapper

# Install IronPDF
dotnet add package IronPdf
SHELL

同时从您的部署中移除本地MuPDF二进制文件

  • 删除<代码>mupdf.dll</代码>、<代码>libmupdf.so</代码>、<代码>libmupdf.dylib</代码
  • 删除特定平台文件夹(runtimes/*/native/</code)
  • 更新 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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

确定MuPDF的用途

# Find allMuPDFreferences
grep -r "MuPDF\|MuPDFCore\|MuPDFDocument" --include="*.cs" .
# Find allMuPDFreferences
grep -r "MuPDF\|MuPDFCore\|MuPDFDocument" --include="*.cs" .
SHELL

完整的 API 参考

文档加载

MuPDFIronPDF备注
<代码>new MuPDFDocument(路径)</代码<代码>PdfDocument.FromFile(路径)</代码从文件加载
<代码>new MuPDFDocument(stream)</ 代码<代码>PdfDocument.FromStream(流)</代码从流加载
<代码>document.Dispose()</代码<代码>pdf.Dispose()</代码清理

页面访问

MuPDFIronPDF备注
<代码>document.Pages.Count</代码<代码>pdf.PageCount</代码页数
<代码>document.Pages[index]</代码<代码>pdf.Pages[index]</代码访问页面
<代码>page.GetText()</代码<代码>page.Text</代码页面文本

文本提取

MuPDFIronPDF备注
document.Pages[i].GetText() 中循环<代码>pdf.ExtractAllText()</代码一次性翻译所有文本

PDF 创建(MuPDF 中不提供)

MuPDFIronPDF备注
(不支持)<代码>ChromePdfRenderer.RenderHtmlAsPdf(html)</代码HTML 至 PDF
(不支持)<代码>ChromePdfRenderer.RenderUrlAsPdf(url)</代码URL 至 PDF

PDF 操作(MuPDF 中的限制)

MuPDFIronPDF备注
手册页面复制循环<代码>PdfDocument.Merge(pdf1, pdf2)</ 代码合并 PDF
(不支持)<代码>pdf.ApplyWatermark(html)</代码添加水印
(不支持)<代码>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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

这个例子突出了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 MuPDFCore;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
        {
            StringBuilder allText = new StringBuilder();

            for (int i = 0; i < document.Pages.Count; i++)
            {
                string pageText = document.Pages[i].GetText();
                allText.AppendLine(pageText);
            }

            Console.WriteLine(allText.ToString());
        }
    }
}
// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System;
using System.Text;

class Program
{
    static void Main()
    {
        using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
        {
            StringBuilder allText = new StringBuilder();

            for (int i = 0; i < document.Pages.Count; i++)
            {
                string pageText = document.Pages[i].GetText();
                allText.AppendLine(pageText);
            }

            Console.WriteLine(allText.ToString());
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

MuPDF 方法要求使用 MuPDFDocument 创建一个 using 块,使用 for 循环手动遍历<代码>document.Pages.Count</代码,为每个页面调用 document.Pages[i].GetText() 并使用 StringBuilder 构建文本。 这是一个简单文本提取的 12 行代码。

IronPDF 将其简化为 3 行:使用 PdfDocument.FromFile() 加载文档,调用 ExtractAllText() 并打印结果。 对于这种简单的操作,不需要手动迭代,不需要 StringBuilder,也不需要使用 using 块进行明确的资源管理。 了解有关从 PDF 中提取文本的更多信息。

示例 3:合并多个 PDF 文件

之前 (MuPDF):

// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System.IO;

class Program
{
    static void Main()
    {
        using (MuPDFDocument doc1 = new MuPDFDocument("file1.pdf"))
        using (MuPDFDocument doc2 = new MuPDFDocument("file2.pdf"))
        {
            // Create a new document
            using (MuPDFDocument mergedDoc = MuPDFDocument.Create())
            {
                // Copy pages from first document
                for (int i = 0; i < doc1.Pages.Count; i++)
                {
                    mergedDoc.CopyPage(doc1, i);
                }

                // Copy pages from second document
                for (int i = 0; i < doc2.Pages.Count; i++)
                {
                    mergedDoc.CopyPage(doc2, i);
                }

                mergedDoc.Save("merged.pdf");
            }
        }
    }
}
// NuGet: Install-Package MuPDF.NET
using MuPDFCore;
using System.IO;

class Program
{
    static void Main()
    {
        using (MuPDFDocument doc1 = new MuPDFDocument("file1.pdf"))
        using (MuPDFDocument doc2 = new MuPDFDocument("file2.pdf"))
        {
            // Create a new document
            using (MuPDFDocument mergedDoc = MuPDFDocument.Create())
            {
                // Copy pages from first document
                for (int i = 0; i < doc1.Pages.Count; i++)
                {
                    mergedDoc.CopyPage(doc1, i);
                }

                // Copy pages from second document
                for (int i = 0; i < doc2.Pages.Count; i++)
                {
                    mergedDoc.CopyPage(doc2, i);
                }

                mergedDoc.Save("merged.pdf");
            }
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

MuPDF 的合并操作特别繁琐。 您必须在嵌套的 using 块中打开两个源文档,使用 MuPDFDocument.Create() 创建一个新的空文档,调用 CopyPage() 遍历第一个文档的每一页,调用 CopyPage() 遍历第二个文档的每一页,最后保存。 这是 20 多行复杂嵌套的代码。

IronPDF 的静态 PdfDocument.Merge() 方法接受多个 PDF 文档并返回一个合并文档。 整个操作为 4 行可读代码。 对于合并多个文档,您可以传递一个列表:<代码>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
SHELL

IronPDF 是完全托管的 .NET 代码,无需跨平台管理本地二进制文件。

简化处置模式

MuPDF 需要明确的上下文和文档管理:

// MuPDF: Nested using blocks required
using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
{
    // Work with document
}

// IronPDF: Simpler pattern
var pdf = PdfDocument.FromFile("input.pdf");
// Work with pdf
// MuPDF: Nested using blocks required
using (MuPDFDocument document = new MuPDFDocument("input.pdf"))
{
    // Work with document
}

// IronPDF: Simpler pattern
var pdf = PdfDocument.FromFile("input.pdf");
// Work with pdf
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

页面迭代模式更改

MuPDF 使用基于索引的迭代,并有明确的页数:

// MuPDF
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
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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

可用的新功能

迁移到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 (not possible in MuPDF)
pdf.AddTextHeader("Document Title");
pdf.AddTextFooter("Page {page} of {total-pages}");
//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 (not possible in MuPDF)
pdf.AddTextHeader("Document Title");
pdf.AddTextFooter("Page {page} of {total-pages}");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

故障排除

问题 1:未找到 MuPDFDocument

问题MuPDFDocument 类在IronPDF中不存在。

解决方案:使用 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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 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)
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 3:GetText() 未找到

问题page.GetText() 方法不存在。

解决方案:使用<代码>page.Text</代码属性或 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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 4:未找到复制页面

问题:用于合并的手动页面复制模式。

解决方案:使用静态 PdfDocument.Merge()

// MuPDF
mergedDoc.CopyPage(doc1, i);

// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
// MuPDF
mergedDoc.CopyPage(doc1, i);

// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

迁移清单

迁移前

  • [ ] 清点代码库中所有MuPDF的使用情况
  • [ ] 记录所有渲染操作(DPI、比例因子)
  • [ ] 确定任何 PDF 创建需求(目前使用外部工具)
  • [ ] 列出文本提取要求
  • [ ] 审查部署脚本以进行本地二进制处理
  • [ ] 获取 IronPdf 许可证密钥

软件包变更

  • [ ] 删除 MuPDF.NET
  • [ ] 删除 MuPDFCore
  • [ ] 删除 MuPDFCore.MuPDFWrapper
  • [ ] 安装 IronPDF NuGet 软件包:<代码>dotnet 添加软件包 IronPdf
  • [更新命名空间导入

代码更改

  • [ ] 在启动时添加许可证密钥配置
  • [ ] 将 MuPDFDocument 替换为 PdfDocument.FromFile()
  • [ ] 将<代码>document.Pages.Count</代码替换为 pdf.PageCount
  • [ ] 将<代码>page.GetText()</代码替换为<代码>page.Text</代码或<代码>pdf.ExtractAllText()</代码。
  • [ ] 使用 PdfDocument.Merge() 替换手动 CopyPage 循环
  • [ ] 删除嵌套的 using 块以进行上下文管理
  • [ ] 必要时添加 PDF 创建代码(HTML 转 PDF)

后迁移

  • [ ] 从项目中删除本地MuPDF二进制文件
  • [ ] 更新 Docker 文件以移除MuPDF安装
  • [ ] 删除特定平台的运行时文件夹
  • [ ] 运行回归测试,比较渲染的输出结果
  • [ ] 在所有目标平台(Windows、Linux、macOS)上进行测试
  • [ ] 考虑添加新功能(水印、安全性、页眉/页脚)

结论

从MuPDF迁移到IronPDF可以消除 AGPL 许可问题、本地二进制管理和仅渲染限制,同时增加完整的 PDF 创建和操作功能。 从查看器库到完整 PDF 解决方案的模式转变意味着您可以将多个工具整合到一个库中。

本次迁移的主要变化有 1.许可:AGPL (病毒) → 商业 (透明) 2.重点:仅渲染 → 完整的 PDF 解决方案 3.HTML 转 PDF:不支持 → 全 Chromium 引擎 4.依赖关系:本地二进制文件 → 完全托管 5.合并:手动页面循环 → PdfDocument.Merge() 6.文本提取:循环 + StringBuilder → ExtractAllText()

探索完整的IronPdf文档教程API参考,加速您的MuPDF迁移。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。