如何在 C# 中导出 PDF | IronPDF
从苏门答腊 PDF迁移到IronPDF可将您的 PDF 工作流程从使用桌面查看器应用程序的外部流程管理转变为具有完整 PDF 创建、操作和提取功能的本地 .NET 库集成。 本指南提供了完整的、逐步的迁移路径,消除了外部依赖、AGPLv3 共价义务,以及苏门答腊 PDF作为查看/打印器而非开发库的基本限制。
为什么要从苏门答腊 PDF迁移到 IronPDF.
了解苏门答腊 PDF.
Sumatra PDF 是一款轻量级的开源视窗PDF 阅读/打印器,以其简单性和速度而闻名。 它还显示 EPUB、MOBI、CBZ/CBR、FB2、CHM、XPS 和 DjVu 文件。 但是,Sumatra PDF 不提供除了查看和打印之外所需的创建或操作 PDF 文件的功能,并且没有官方的 .NET SDK 或 NuGet 包—社区包装器只是对 SumatraPDF.exe 进行外壳包装。
Sumatra PDF 是一个 独立的视窗桌面查看/打印应用程序,而不是一个开发库。 如果您正在.NET 应用程序中使用 Sumatra PDF,那么您很可能正在使用:
- 启动
SumatraPDF.exe作为外部进程以显示 PDF - 通过命令行打印 PDF(
-print-to "<printer>") 3.您的用户必须将其作为一个依赖项来安装
苏门答腊 PDF集成的关键问题
| 问题 | 影响 |
|---|---|
| 不是库 | 不能以编程方式创建或编辑 PDF |
| 外部流程 | 需要生成 SumatraPDF.exe; 没有进程内 API |
| AGPLv3 许可证 | 强制性共价(某些文件是 BSD 许可的); bundling into closed-source products imposes obligations most commercial vendors avoid |
| 用户依赖性 | 用户(或您的安装程序)必须在磁盘上放置 SumatraPDF.exe |
| 仅限 CLI | 仅限于记录的命令行参数 |
| 仅查看 / 打印 | 不能创建、编辑或操作 PDF |
| 仅限 Windows | 没有Linux或MacOS构建 |
苏门答腊 PDF与IronPDF对比
| 特征 | 苏门答腊 PDF | IronPDF |
|---|---|---|
| 类型 | 应用 | 库 |
| PDF阅读 | 是 | 是 |
| PDF 创建 | 否 | 是 |
| PDF 编辑 | 否 | 是 |
| 集成 | 有限(独立) | 完全集成到应用程序中 |
| 许可 | AGPLv3(部分文件 BSD) | 商业翻译 |
| 创建 PDF 文件 | 否 | 是 |
| 编辑 PDF 文件 | 否 | 是 |
| HTML 到 PDF | 否 | 是 |
| 合并/拆分 | 否 | 是 |
| 水印。 | 否 | 是 |
| 数字签名 | 否 | 是 |
| 表格填写 | 否 | 是 |
| 文本提取 | 否 | 是 |
| .NET集成 | None | 本地 |
| 网络应用 | 否 | 是 |
IronPDF 与苏门答腊 PDF不同,不与任何特定的桌面应用程序或外部流程绑定。 它为开发人员提供了一个灵活的库,可直接在 C# 中动态创建、编辑和操作 PDF 文档。 这种与外部流程脱钩的做法有一个明显的优势--它简单明了,适应性强,适用于各种应用,而不仅仅是浏览。
对于旨在跟随现代 .NET 的团队,IronPDF 提供了本地库集成,消除了苏门答腊 PDF的外部进程开销和 AGPLv3 共价义务。
开始之前
前提条件
- .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 访问权限:能够安装 NuGet 包
- IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。
安装
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
许可配置
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完整的 API 参考
命名空间变更
// Before:苏门答腊 PDF(external process)
using System.Diagnostics;
using System.IO;
// After: IronPDF
using IronPdf;
// Before:苏门答腊 PDF(external process)
using System.Diagnostics;
using System.IO;
// After: IronPDF
using IronPdf;
Imports System.Diagnostics
Imports System.IO
Imports IronPdf
核心能力映射
| 苏门答腊 PDF 方法 | IronPDF 同等产品 | 备注 |
|---|---|---|
Process.Start("SumatraPDF.exe", pdfPath) |
PdfDocument.FromFile() |
加载 PDF |
| 命令行参数 | 本地 API 方法 | 无需 CLI |
外部 pdftotext.exe |
pdf.ExtractAllText() |
文本提取 |
外部 wkhtmltopdf.exe |
renderer.RenderHtmlAsPdf() |
HTML 至 PDF |
-print-to-default 参数 |
pdf.Print() |
印刷 |
| 不可能 | PdfDocument.Merge() |
合并 PDF |
| 不可能 | pdf.ApplyWatermark() |
水印 |
| 不可能 | pdf.SecuritySettings |
密码保护 |
代码迁移示例
示例 1:HTML 到 PDF 的转换
之前(苏门答腊 PDF):
//苏门答腊 PDFis a standalone视窗app (AGPLv3) — there is NO official NuGet package.
// Download SumatraPDF.exe from https://www.sumatrapdfreader.org/and shell out to it.
// Sumatra is a viewer/printer only; it cannot convert HTML to PDF, so you must use a
// separate HTML-to-PDF tool (e.g. wkhtmltopdf) and then view/print with Sumatra.
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//苏门答腊 PDFcannot directly convert HTML to PDF
// You'd need to use wkhtmltopdf or similar, then view in Sumatra
string htmlFile = "input.html";
string pdfFile = "output.pdf";
// Using wkhtmltopdf as intermediary
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "wkhtmltopdf.exe",
Arguments = $"{htmlFile} {pdfFile}",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
// Then open with Sumatra
Process.Start("SumatraPDF.exe", pdfFile);
}
}
//苏门答腊 PDFis a standalone视窗app (AGPLv3) — there is NO official NuGet package.
// Download SumatraPDF.exe from https://www.sumatrapdfreader.org/and shell out to it.
// Sumatra is a viewer/printer only; it cannot convert HTML to PDF, so you must use a
// separate HTML-to-PDF tool (e.g. wkhtmltopdf) and then view/print with Sumatra.
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//苏门答腊 PDFcannot directly convert HTML to PDF
// You'd need to use wkhtmltopdf or similar, then view in Sumatra
string htmlFile = "input.html";
string pdfFile = "output.pdf";
// Using wkhtmltopdf as intermediary
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "wkhtmltopdf.exe",
Arguments = $"{htmlFile} {pdfFile}",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
// Then open with Sumatra
Process.Start("SumatraPDF.exe", pdfFile);
}
}
Imports System.Diagnostics
Imports System.IO
Module Program
Sub Main()
'苏门答腊 PDFcannot directly convert HTML to PDF
' You'd need to use wkhtmltopdf or similar, then view in Sumatra
Dim htmlFile As String = "input.html"
Dim pdfFile As String = "output.pdf"
' Using wkhtmltopdf as intermediary
Dim psi As New ProcessStartInfo With {
.FileName = "wkhtmltopdf.exe",
.Arguments = $"{htmlFile} {pdfFile}",
.UseShellExecute = False
}
Process.Start(psi)?.WaitForExit()
' Then open with Sumatra
Process.Start("SumatraPDF.exe", pdfFile)
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World</h1><p>This isHTML 至 PDFconversion.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World</h1><p>This isHTML 至 PDFconversion.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent As String = "<h1>Hello World</h1><p>This isHTML 至 PDFconversion.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class
本例展示了基本的架构差异。苏门答腊 PDF无法直接将 HTML 转换为 PDF,您必须使用 wkhtmltopdf 等外部工具作为中介,然后作为一个单独的进程启动 Sumatra 以查看结果。 这需要两个外部可执行文件和多个进程启动。
IronPDF 在仅三行代码中使用 ChromePdfRenderer 与 RenderHtmlAsPdf()。 无外部工具、无流程管理、无中间文件。 PDF 直接在内存中创建并使用 SaveAs() 保存。 请参阅 HTML 转 PDF 文档,了解全面的示例。
示例 2:打开和显示 PDF 文件
之前(苏门答腊 PDF):
//苏门答腊 PDFis a standalone视窗app (AGPLv3) — no official NuGet package.
// Download SumatraPDF.exe from https://www.sumatrapdfreader.org/and call it via Process.Start.
// Useful CLI flags: -page <n>, -print-to-default, -print-to "<printer>", -print-settings, -silent.
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
string pdfPath = "document.pdf";
//苏门答腊 PDFexcels at viewing PDFs
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "SumatraPDF.exe",
Arguments = $"\"{pdfPath}\"",
UseShellExecute = true
};
Process.Start(startInfo);
// Optional: Open specific page
// Arguments = $"-page 5 \"{pdfPath}\""
}
}
//苏门答腊 PDFis a standalone视窗app (AGPLv3) — no official NuGet package.
// Download SumatraPDF.exe from https://www.sumatrapdfreader.org/and call it via Process.Start.
// Useful CLI flags: -page <n>, -print-to-default, -print-to "<printer>", -print-settings, -silent.
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
string pdfPath = "document.pdf";
//苏门答腊 PDFexcels at viewing PDFs
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "SumatraPDF.exe",
Arguments = $"\"{pdfPath}\"",
UseShellExecute = true
};
Process.Start(startInfo);
// Optional: Open specific page
// Arguments = $"-page 5 \"{pdfPath}\""
}
}
Imports System.Diagnostics
Imports System.IO
Class Program
Shared Sub Main()
Dim pdfPath As String = "document.pdf"
'苏门答腊 PDFexcels at viewing PDFs
Dim startInfo As New ProcessStartInfo With {
.FileName = "SumatraPDF.exe",
.Arguments = $"""{pdfPath}""",
.UseShellExecute = True
}
Process.Start(startInfo)
' Optional: Open specific page
' .Arguments = $"-page 5 ""{pdfPath}"""
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Extract information
Console.WriteLine($"Page Count: {pdf.PageCount}");
//IronPDFcan manipulate and save, then open with default viewer
pdf.SaveAs("modified.pdf");
// Open with default PDF viewer
Process.Start(new ProcessStartInfo("modified.pdf") { UseShellExecute = true });
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Extract information
Console.WriteLine($"Page Count: {pdf.PageCount}");
//IronPDFcan manipulate and save, then open with default viewer
pdf.SaveAs("modified.pdf");
// Open with default PDF viewer
Process.Start(new ProcessStartInfo("modified.pdf") { UseShellExecute = true });
}
}
Imports IronPdf
Imports System
Imports System.Diagnostics
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
' Extract information
Console.WriteLine($"Page Count: {pdf.PageCount}")
' IronPDF can manipulate and save, then open with default viewer
pdf.SaveAs("modified.pdf")
' Open with default PDF viewer
Process.Start(New ProcessStartInfo("modified.pdf") With {.UseShellExecute = True})
End Sub
End Class
Sumatra PDF 擅长查看 PDF,但仅限于使用命令行参数启动外部进程。 您不能以编程方式访问 PDF 内容,只能将其显示出来。
IronPDF 使用 PdfDocument.FromFile() 加载 PDF,赋予您完整的程序访问权限。 您可以读取诸如 PageCount 的属性,操作文档、保存更改,然后用系统的默认 PDF 查看器打开。 关键区别在于IronPDF提供的是实际的 API,而不仅仅是流程参数。 在我们的教程中了解更多信息。
示例 3:从 PDF 中提取文本
之前(苏门答腊 PDF):
//苏门答腊 PDFis a standalone视窗viewer (AGPLv3) — no official NuGet package
// and no programmatic text-extraction API. To extract text you must shell out to a
// separate tool such as pdftotext (Xpdf / Poppler).
using System;
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//苏门答腊 PDFis a viewer, not a text extraction library
// You'd need to use PDFBox, iTextSharp, or similar for extraction
string pdfFile = "document.pdf";
// This would require external tools like pdftotext
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "pdftotext.exe",
Arguments = $"{pdfFile} output.txt",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
string extractedText = File.ReadAllText("output.txt");
Console.WriteLine(extractedText);
}
}
//苏门答腊 PDFis a standalone视窗viewer (AGPLv3) — no official NuGet package
// and no programmatic text-extraction API. To extract text you must shell out to a
// separate tool such as pdftotext (Xpdf / Poppler).
using System;
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
//苏门答腊 PDFis a viewer, not a text extraction library
// You'd need to use PDFBox, iTextSharp, or similar for extraction
string pdfFile = "document.pdf";
// This would require external tools like pdftotext
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "pdftotext.exe",
Arguments = $"{pdfFile} output.txt",
UseShellExecute = false
};
Process.Start(psi)?.WaitForExit();
string extractedText = File.ReadAllText("output.txt");
Console.WriteLine(extractedText);
}
}
Imports System
Imports System.Diagnostics
Imports System.IO
Module Program
Sub Main()
'苏门答腊 PDFis a viewer, not a text extraction library
' You'd need to use PDFBox, iTextSharp, or similar for extraction
Dim pdfFile As String = "document.pdf"
' This would require external tools like pdftotext
Dim psi As New ProcessStartInfo With {
.FileName = "pdftotext.exe",
.Arguments = $"{pdfFile} output.txt",
.UseShellExecute = False
}
Process.Start(psi)?.WaitForExit()
Dim extractedText As String = File.ReadAllText("output.txt")
Console.WriteLine(extractedText)
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Extract text from all pages
string allText = pdf.ExtractAllText();
Console.WriteLine("Extracted Text:");
Console.WriteLine(allText);
// Extract text from specific page
string pageText = pdf.ExtractTextFromPage(0);
Console.WriteLine($"\nFirst Page Text:\n{pageText}");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
// Extract text from all pages
string allText = pdf.ExtractAllText();
Console.WriteLine("Extracted Text:");
Console.WriteLine(allText);
// Extract text from specific page
string pageText = pdf.ExtractTextFromPage(0);
Console.WriteLine($"\nFirst Page Text:\n{pageText}");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
' Extract text from all pages
Dim allText As String = pdf.ExtractAllText()
Console.WriteLine("Extracted Text:")
Console.WriteLine(allText)
' Extract text from specific page
Dim pageText As String = pdf.ExtractTextFromPage(0)
Console.WriteLine(vbCrLf & "First Page Text:" & vbCrLf & pageText)
End Sub
End Class
Sumatra PDF 是一个阅读器,而不是一个文本提取库。 要提取文本,您必须使用外部命令行工具如 pdftotext.exe,生成一个进程,等待其完成,读取输出文件,并处理所有相关的文件 I/O 和清理。
IronPDF 提供本地文本提取功能,可对整个文档使用 ExtractAllText() 或对特定页面使用 ExtractTextFromPage(0)。 无外部进程、无临时文件、无需清理。
功能对比
| 特征 | 苏门答腊 PDF | IronPDF | |||
|---|---|---|---|---|---|
| :创造: | HTML 至 PDF | 否 | 是 | ||
| URL 至 PDF | 否 | 是 | |||
| 文本到 PDF | 否 | 是 | |||
| 图像到 PDF | 否 | 是 | |||
| 操纵 | 合并 PDF | 否 | 是 | ||
| 拆分 PDF | 否 | 是 | |||
| 旋转页面 | 否 | 是 | |||
| 删除页面 | 否 | 是 | |||
| 重新排序页面 | 否 | 是 | |||
| :内容: | 添加水印 | 否 | 是 | ||
| 添加页眉/页脚 | 否 | 是 | |||
| 印章文本 | 否 | 是 | |||
| 图章图像 | 否 | 是 | |||
| :安全: | 密码保护 | 否 | 是 | ||
| 数字签名 | 否 | 是 | |||
| 加密 | 否 | 是 | |||
| 权限设置 | 否 | 是 | |||
| 提取: | 提取文本 | 否 | 是 | ||
| 提取图片 | 否 | 是 | |||
| :平台: | 视窗 | 是 | 是 | ||
| Linux | 否 | 是 | |||
| MacOS | 否 | 是 | |||
| 网络应用程序 | 否 | 是 | |||
| Azure/AWS | 否 | 是 |
迁移后的新功能
迁移到IronPDF后,您将获得苏门答腊 PDF无法提供的功能:
从 HTML 创建 PDF.
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
<html>
<head><style>body { font-family: Arial; }</style></head>
<body>
<h1>Invoice #12345</h1>
<p>Thank you for your purchase.</p>
</body>
</html>");
pdf.SaveAs("invoice.pdf");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
<html>
<head><style>body { font-family: Arial; }</style></head>
<body>
<h1>Invoice #12345</h1>
<p>Thank you for your purchase.</p>
</body>
</html>");
pdf.SaveAs("invoice.pdf");
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("
<html>
<head><style>body { font-family: Arial; }</style></head>
<body>
<h1>Invoice #12345</h1>
<p>Thank you for your purchase.</p>
</body>
</html>")
pdf.SaveAs("invoice.pdf")
PDF 合并
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var pdf3 = PdfDocument.FromFile("chapter3.pdf");
var book = PdfDocument.Merge(pdf1, pdf2, pdf3);
book.SaveAs("complete_book.pdf");
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var pdf3 = PdfDocument.FromFile("chapter3.pdf");
var book = PdfDocument.Merge(pdf1, pdf2, pdf3);
book.SaveAs("complete_book.pdf");
Dim pdf1 = PdfDocument.FromFile("chapter1.pdf")
Dim pdf2 = PdfDocument.FromFile("chapter2.pdf")
Dim pdf3 = PdfDocument.FromFile("chapter3.pdf")
Dim book = PdfDocument.Merge(pdf1, pdf2, pdf3)
book.SaveAs("complete_book.pdf")
水印
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(@"
<div style='
font-size: 60pt;
color: rgba(255, 0, 0, 0.3);
transform: rotate(-45deg);
'>
CONFIDENTIAL
</div>");
pdf.SaveAs("watermarked.pdf");
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(@"
<div style='
font-size: 60pt;
color: rgba(255, 0, 0, 0.3);
transform: rotate(-45deg);
'>
CONFIDENTIAL
</div>");
pdf.SaveAs("watermarked.pdf");
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("
<div style='
font-size: 60pt;
color: rgba(255, 0, 0, 0.3);
transform: rotate(-45deg);
'>
CONFIDENTIAL
</div>")
pdf.SaveAs("watermarked.pdf")
密码保护
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Sensitive Data</h1>");
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user456";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SaveAs("protected.pdf");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Sensitive Data</h1>");
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user456";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SaveAs("protected.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Sensitive Data</h1>")
pdf.SecuritySettings.OwnerPassword = "owner123"
pdf.SecuritySettings.UserPassword = "user456"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint
pdf.SaveAs("protected.pdf")
迁移清单
迁移前
- 识别所有 Sumatra 进程启动(
Process.Start("SumatraPDF.exe", ...)) - 记录打印工作流程(
-print-to-default参数) - 注意所使用的任何 Sumatra 命令行参数。
- 从ironpdf.com获取IronPDF许可证密钥
代码更新
- 安装
IronPdfNuGet 包 - 删除苏门答腊进程代码
- 替换
Process.Start("SumatraPDF.exe", pdfPath)为PdfDocument.FromFile(pdfPath) - 用
ChromePdfRenderer.RenderHtmlAsPdf()替换外部wkhtmltopdf.exe调用 - 用
pdf.ExtractAllText()替换外部pdftotext.exe调用 - 用
pdf.Print()替换-print-to-default进程调用 - 在应用程序启动时添加许可证初始化
测试
- 测试PDF生成质量
- 验证打印功能
- 在所有目标平台上进行测试
- 确认不再存在对苏门答腊的依赖。
清理
- 从安装程序中移除 Sumatra
- 更新文档
- 从系统要求中移除 Sumatra

