跳至页脚内容
视频

如何在 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,那么您很可能正在使用:

  1. 启动 SumatraPDF.exe 作为外部进程以显示 PDF
  2. 通过命令行打印 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 共价义务。


开始之前

前提条件

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

安装

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

许可配置

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

完整的 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
$vbLabelText   $csharpLabel

核心能力映射

苏门答腊 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
$vbLabelText   $csharpLabel

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

本例展示了基本的架构差异。苏门答腊 PDF无法直接将 HTML 转换为 PDF,您必须使用 wkhtmltopdf 等外部工具作为中介,然后作为一个单独的进程启动 Sumatra 以查看结果。 这需要两个外部可执行文件和多个进程启动。

IronPDF 在仅三行代码中使用 ChromePdfRendererRenderHtmlAsPdf()。 无外部工具、无流程管理、无中间文件。 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
$vbLabelText   $csharpLabel

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

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

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

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

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

水印

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

密码保护

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

迁移清单

迁移前

  • 识别所有 Sumatra 进程启动(Process.Start("SumatraPDF.exe", ...)
  • 记录打印工作流程(-print-to-default 参数)
  • 注意所使用的任何 Sumatra 命令行参数。
  • ironpdf.com获取IronPDF许可证密钥

代码更新

  • 安装 IronPdf NuGet 包
  • 删除苏门答腊进程代码
  • 替换 Process.Start("SumatraPDF.exe", pdfPath)PdfDocument.FromFile(pdfPath)
  • ChromePdfRenderer.RenderHtmlAsPdf() 替换外部 wkhtmltopdf.exe 调用
  • pdf.ExtractAllText() 替换外部 pdftotext.exe 调用
  • pdf.Print() 替换 -print-to-default 进程调用
  • 在应用程序启动时添加许可证初始化

测试

  • 测试PDF生成质量
  • 验证打印功能
  • 在所有目标平台上进行测试
  • 确认不再存在对苏门答腊的依赖。

清理

  • 从安装程序中移除 Sumatra
  • 更新文档
  • 从系统要求中移除 Sumatra

请注意Sumatra PDF 和 wkhtmltopdf 是其各自所有者的注册商标。 本网站与苏门答腊 PDF项目或 wkhtmltopdf 项目无关联、无背书、无赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

Curtis Chau
技术作家

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

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

钢铁支援团队

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