跳至页脚内容
视频

如何使用C#在PDF中旋转文本

为什么要从MuPDF迁移到 IronPDF.

MuPDF的挑战

MuPDF是一个功能强大的PDF工具包,但其来自Artifex的双AGPL/商业许可证和渲染优先的设计会为.NET开发人员构建商业HTML驱动的应用程序带来真正的摩擦。 有两个主要的.NET包装器: MuPDFCore(社区,由arklumpus,AGPL-3.0)和MuPDF.NET(Artifex的官方C#绑定,反映PyMuPDF)。

  1. AGPL许可证陷阱: MuPDF和包装器都默认以AGPL-3.0发布。 在AGPL代码上分发闭源产品需要选择在AGPL下开源,或从Artifex购买商业许可证(价格基于报价,没有公布)。

  2. 渲染优先: 虽然MuPDF.NET可以合并、消隐、签名并加盖水印(反映PyMuPDF),大部分API和工具围绕浏览和结构化文本提取而非HTML驱动的文档生成。

  3. 没有HTML到PDF引擎: MuPDF.NET和MuPDFCore都不提供HTML/CSS引擎。生成来自HTML的PDF需要借助单独的浏览器引擎(Chromium,wkhtmltopdf,PrinceXML),仅加载结果到MuPDF中。

  4. 本机依赖: 两者都提供MuPDFCore.NativeAssets / MuPDF.NativeAssets包,并附带每个RID的二进制文件(win-x64, linux-x64, osx-x64)。 跨平台部署有效,但Docker映像需配合匹配的本地包和基础映像(glibc vs musl)。

  5. 没有HTML水印/页眉/页脚: 打印是基于图像和文本的每页; 没有像基于Chromium的渲染器所提供的{page}/{total-pages}模板引擎。

  6. 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() → 完整操作 → 创建/编辑/合并/安全

开始之前

前提条件

  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 (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
SHELL

同时从您的部署中移除本地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"
$vbLabelText   $csharpLabel

确定MuPDF的用途

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

完整的 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
$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");
    }
}
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
$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 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
$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);
    }
}
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
$vbLabelText   $csharpLabel

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
$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");
    }
}
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
$vbLabelText   $csharpLabel

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
SHELL

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
$vbLabelText   $csharpLabel

页面迭代模式更改

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
$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 (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
}
$vbLabelText   $csharpLabel

故障排除

问题 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")
$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)
' 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
$vbLabelText   $csharpLabel

问题 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()
$vbLabelText   $csharpLabel

问题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);
$vbLabelText   $csharpLabel

迁移清单

迁移前

  • 清点代码库中所有MuPDF的使用情况
  • 记录所有渲染操作(DPI、缩放因子)
  • 确定任何 PDF 创建需求(目前使用外部工具)
  • 列出文本提取要求
  • 检查部署脚本中的原生二进制文件处理情况
  • 获取IronPDF许可证密钥

软件包变更

  • 删除MuPDF.NET
  • 删除MuPDFCore
  • 删除MuPDFCore.NativeAssets.* / MuPDF.NativeAssets
  • 安装IronPdf NuGet包: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)上进行测试
  • 考虑添加新功能(水印、安全设置、页眉/页脚)

请注意MuPDF, MuPDF.NET, 和 wkhtmltopdf 是各自所有者的注册商标。 本网站与 Artifex Software 或 wkhtmltopdf 无关,未获得其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

Curtis Chau
技术作家

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

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

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我