产品比较

Wkhtmltopdf C# 比较与代码示例

发布 2021年九月30日
分享:

选择以编程方式处理 PDF 文件的最佳组件可能是一项艰巨的任务,但最终却能为您节省时间和精力。我们将探讨使用 wkhtmltopdf 和 IronPDF 处理 PDF 的必要代码和分步教程,以及它们的系统兼容性和许可结构,以帮助您决定哪种最适合您的项目。

请阅读下面的教程,了解如何创建 PDF 文件、使用预定义功能(如执行页眉和页脚)、生成文件等。


概述

关于 IronPDF

IronPDF 是一个用于处理 PDF 文件的组件,由 Iron Software C# 库.使用 IronPDF我们很容易 创建 PDF IronPDF 可通过 URL 或 HTML 字符串创建 PDF 文件,并以编程方式设置页眉、页脚、水印、页边距和其他 PDF 文件属性。IronPDF 以其享有盛誉的产品库、清晰的文档和自然语言而闻名,使其易于在开发人员项目中实施。

关于 wkhtmltopdf

wkhtmltopdf 是一款用于渲染 PDF 文件的 C++ 二进制软件。它可用于通过 URL 或 HTML 字符串创建 PDF 文件。它还能通过命令行界面设置 PDF 文件的页眉、页脚、页边距和其他属性。 (CLI).但是,它不是在 .NET 框架内设计的,因此可能难以与 .NET 应用程序集成。 (阅读更多,了解我们的解决方法).此外,它也不是由一家公司持续更新维护的。相反,它最初是由 雅各布-特鲁尔森 并由 阿希什-库尔卡尼,几个开发人员。

如何使用 Wkhtmltopdf C# 示例

  1. 下载 wkhtmlpdf.exe 文件并安装
  2. 启动新进程,使用 wkhtmltopdf.exe 文件执行命令
  3. 用 C# 创建一个方法,并将其称为 Main()
  4. 从章节中复制代码 使用 wkhtmltopdf 将 URL 转换为 PDF
  5. 运行 C# 代码

快速比较

1.IronPDF vs. wkhtmltopdf

为了帮助您选择最适合您项目的组件,我们将提供代码示例和教程,指导您如何使用 wkhtmltopdf 和 IronPDF 创建、编辑和管理 PDF 文件。以下是对这两种资源的功能和可用性的快速概述。

IronPDFwkhtmltopdf
IronPDF 可将 HTML 转换为 PDFwkhtmltopdf 将 HTML 转换为 PDF
支持 Windows、Linux 和 macOS支持 Windows、Ubuntu、Amazon Linux 和 macOS
使用 C# 在 .NET Framework 中设计用 C++ 设计
动态链接库(.dll),成为项目的一部分单独使用的 .exe 文件
IronPDF 设置页眉、页脚和方向页边距wkhtmltopdf 设置页眉、页脚和方向页边距
RenderDelay "函数可延迟渲染,确保网页加载成功javascript-delay "函数,用于延迟渲染,直到 JavaScript 执行完毕
经常更新新功能和产品修复程序产品更新不频繁
适用于 .NET 项目非常适合 CLI / Shell 项目
为特定页面添加水印的预定义功能没有添加水印的预定义功能
渲染、编辑、填充、解析和签署 PDF。仅为渲染。
技术支持团队随时待命没有已知的技术支持

步骤 1:安装

2.安装 IronPDF

IronPDF 可以通过两种不同的方法安装到系统中,您可以根据自己的项目需要选择最简单的方法。

2.1.使用 NuGet 软件包安装

第一种方法是使用 Visual Studio 的 "NuGet 包管理器"。打开并浏览 `IronPDF (由 "铁 "提供)然后安装。

Install-Package IronPdf

2.2 下载 IronPdf.dll

第二种方法是 下载 IronPDF.dll 文件。下载后,请在项目引用中提供该文件的路径,以便添加其引用。

注意:您可以通过编写以下行 using IronPdf; 来导入 IronPDF 的库

2.3.IronPDF 支持的平台

IronPDF 兼容多种语言和平台。

使用.NET 框架 4.0 或更高版本

  • 视窗

  • Azure

使用.NET Standard 2.0 & Core 2 & 3

  • 视窗
  • MacOS
  • Linux
  • Azure

云托管服务包括

  • 微软 Azure

  • Docker

  • AWS

IronPDF 可用于

  • ASP.NET MVC 应用程序

  • ASP.NET Web 窗体应用程序

  • 控制台应用程序

  • 云应用程序

  • 服务

  • 功能

  • 桌面应用程序

2.4.IronPDF 依赖项

使用 IronPDF 需要以下依赖项。

适用于 .NET Framework 4.0 或更高版本:

适用于 .NET 标准 2.0 或更高版本


教程

安装 Wkhtmltopdf

  1. 下载最新版本 wkhtmlpdf.exe 文件,与系统规格相关。
  2. 如果是压缩文件,请解压缩并运行该文件。
  3. 重新启动所有正在运行的服务器。

安装完成后,如果您安装的是 32 位,它会在 C:\Program Files 中创建一个名为 wkhtmltopdf 的新文件夹。 (x86)包括一些必要的文件。

如果安装的是 64 位,则该文件夹将创建为 C:\Program Files

创建文件夹后,wkhtmltopdf 将成功安装到您的系统中。

3.从 URL 创建 PDF

当我们谈到如何处理 PDF 文件时,脑海中浮现的基本用例就是如何从 URL 创建 PDF 文件。

3.1.使用 IronPDF 将 URL 转换为 PDF

使用 IronPDF,我们可以进行以下简单的转换。

/**
URL to PDF
anchor-url-to-pdf-using-ironpdf
**/
using IronPdf;
{
    var converter = new ChromePdfRenderer();
    //Specify URL 
    using var PDF = converter.RenderUrlAsPdf("URL");
    //Save the file
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created!");
    Console.ReadKey(); 
}
/**
URL to PDF
anchor-url-to-pdf-using-ironpdf
**/
using IronPdf;
{
    var converter = new ChromePdfRenderer();
    //Specify URL 
    using var PDF = converter.RenderUrlAsPdf("URL");
    //Save the file
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created!");
    Console.ReadKey(); 
}
'''
'''URL to PDF
'''anchor-url-to-pdf-using-ironpdf
'''*
Private ReadOnly Property IronPdf() As using
	Dim converter = New ChromePdfRenderer()
	'Specify URL 
	Dim PDF = converter.RenderUrlAsPdf("URL")
	'Save the file
	PDF.SaveAs("Sample.pdf")
	Console.WriteLine("successfully created!")
	Console.ReadKey()
End Property
VB   C#

上述代码将从指定的 URL 创建一个完整网页的 Sample.pdf 文件,并将其保存到指定位置。

注:

  • 如果不指定路径,只给出文件名,那么 PDF 文件将在项目的 bin\Debug 文件夹中创建。
  • 如果你想在其他位置创建 PDF 文件,例如在Local Disk E,那么你可以写入E:\Sample.pdf

现在,让我们看看如何使用 wkhtmltopdf 通过 URL 创建 PDF 文件。

3.2.使用 wkhtmltopdf 将 URL 转换为 PDF

如上所述,wkhtmltopdf 并不是在 .NET 框架中设计的。但我们仍然可以在 .NET 应用程序中使用它。

为此,我们将使用 wkhtmltopdf.exe 文件启动一个新进程来执行命令,如下例所示。

为避免复杂和混乱,我们创建一个方法并将其称为 `Main()功能如下

using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    //function calling
    ConvertChromePdfRenderer("URL", "Sample.pdf");
    Console.WriteLine("successfully created!");
    Console.ReadKey();
}
//function declaration
public static void ConvertChromePdfRenderer(string url, string filename)
{
    //function definition
    StringBuilder paramsBuilder = new StringBuilder();
    //make CLI command
    paramsBuilder.AppendFormat("\"{0}\" \"{1}\"", url, filename);
    //create new process
    using (Process process = new Process())
    {
        //specify wkhtmltopdf.exe file path to execute above CLI
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        //assign CLI as process argument
        process.StartInfo.Arguments = paramsBuilder.ToString();
        //setting the credentials
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        //start execution
        process.Start();
        if (!process.WaitForExit(60000))
        {
            process.Kill();
        }
    }
}
using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    //function calling
    ConvertChromePdfRenderer("URL", "Sample.pdf");
    Console.WriteLine("successfully created!");
    Console.ReadKey();
}
//function declaration
public static void ConvertChromePdfRenderer(string url, string filename)
{
    //function definition
    StringBuilder paramsBuilder = new StringBuilder();
    //make CLI command
    paramsBuilder.AppendFormat("\"{0}\" \"{1}\"", url, filename);
    //create new process
    using (Process process = new Process())
    {
        //specify wkhtmltopdf.exe file path to execute above CLI
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        //assign CLI as process argument
        process.StartInfo.Arguments = paramsBuilder.ToString();
        //setting the credentials
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        //start execution
        process.Start();
        if (!process.WaitForExit(60000))
        {
            process.Kill();
        }
    }
}
Imports System.Text
Imports System.Diagnostics
Shared Sub Main(ByVal args() As String)
	'function calling
	ConvertChromePdfRenderer("URL", "Sample.pdf")
	Console.WriteLine("successfully created!")
	Console.ReadKey()
End Sub
'function declaration
Public Shared Sub ConvertChromePdfRenderer(ByVal url As String, ByVal filename As String)
	'function definition
	Dim paramsBuilder As New StringBuilder()
	'make CLI command
	paramsBuilder.AppendFormat("""{0}"" ""{1}""", url, filename)
	'create new process
	Using process As New Process()
		'specify wkhtmltopdf.exe file path to execute above CLI
		process.StartInfo.FileName = "C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"
		'assign CLI as process argument
		process.StartInfo.Arguments = paramsBuilder.ToString()
		'setting the credentials
		process.StartInfo.UseShellExecute = False
		process.StartInfo.RedirectStandardOutput = True
		process.StartInfo.RedirectStandardError = True
		'start execution
		process.Start()
		If Not process.WaitForExit(60000) Then
			process.Kill()
		End If
	End Using
End Sub
VB   C#

请不要在生产中使用上述代码。 它不是线程安全的,会在服务器应用程序中造成死锁 !

这段代码将创建以下命令,并使用进程 wkhtmltopdf.exe 执行该命令

URL""FileName.pdf"。

上述代码还创建了一个 Sample.pdf 文件,就像我们使用 IronPDF 创建文件一样,并将其保存到指定位置。

我们可以很容易地观察到,在短短几行代码中使用 IronPDF 是多么容易。使用 wkhtmltopdf 时,我们需要运行一个单独的进程,除了要编写多行代码外,还会影响系统性能。

现在,让我们来谈谈这两个组件提供的函数,了解它们的功能。


4.处理 PDF 文件的功能

当我们对两个不同的组件进行评估并需要选择最佳组件时,了解哪个组件提供的功能最多、在项目中使用起来有多方便以及哪个组件所需的代码行数最少是非常重要的。

4.1.IronPDF 功能

我们可以在 Curly Brackets 中使用 IronPDF 函数。{}如下:

  • `{页码}打印当前页码。
  • `{总页数}打印总页数。
  • `{网址}打印已渲染网页的 URL。
  • `{日期}打印当前日期。
  • `{时间}打印当前时间。
  • `{html-title}打印网页标题。

  • `{pdf标题}打印文件标题。

如何在项目中使用上述函数?让我们看看下面的例子。

/**
PDF Functions
anchor-ironpdf-functions
**/
using IronPdf;
{
    var converter = new IronPdf.ChromePdfRenderer();
    //setting header
    converter.RenderingOptions.TextHeader = new TextHeaderFooter()
    {
        RightText = "{date} {time}"              
    };
    //setting footer
    converter.RenderingOptions.TextFooter = new TextHeaderFooter()
    {
        CenterText= "Page {page} of {total-pages}"              
    };
    using var PDF = converter.RenderUrlAsPdf("URL");
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey();
}
/**
PDF Functions
anchor-ironpdf-functions
**/
using IronPdf;
{
    var converter = new IronPdf.ChromePdfRenderer();
    //setting header
    converter.RenderingOptions.TextHeader = new TextHeaderFooter()
    {
        RightText = "{date} {time}"              
    };
    //setting footer
    converter.RenderingOptions.TextFooter = new TextHeaderFooter()
    {
        CenterText= "Page {page} of {total-pages}"              
    };
    using var PDF = converter.RenderUrlAsPdf("URL");
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey();
}
'''
'''PDF Functions
'''anchor-ironpdf-functions
'''*
Private ReadOnly Property IronPdf() As using
	Dim converter = New IronPdf.ChromePdfRenderer()
	'setting header
	converter.RenderingOptions.TextHeader = New TextHeaderFooter() With {.RightText = "{date} {time}"}
	'setting footer
	converter.RenderingOptions.TextFooter = New TextHeaderFooter() With {.CenterText= "Page {page} of {total-pages}"}
	Dim PDF = converter.RenderUrlAsPdf("URL")
	PDF.SaveAs("Sample.pdf")
	Console.WriteLine("successfully created..!")
	Console.ReadKey()
End Property
VB   C#

该代码将创建指定 URL 网页的 PDF 文件,在右侧页眉处打印日期和时间,并在页脚中央打印当前页码。

4.2. wkhtmltopdf 函数

下面给出了 wkhtmltopdf 的一些基本功能。这些函数可在 方括号 ` 中使用。[]如下

  • `[页码]打印当前页码。
  • `[拓扑]打印最后页码或总页数。
  • `[网页]打印正在转换的页面的 URL。
  • `[日期]打印当前日期。
  • `[时间]打印当前时间。
  • `[标题]打印当前页的标题。

了解更多 wkhtmltopdf 功能 这里。

让我们看看如何在项目中使用这些函数的示例。

using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    ConvertChromePdfRenderer("URL", "Sample.pdf");
    Console.WriteLine("ok");
    Console.ReadKey();
}
public static void ConvertChromePdfRenderer(string url, string filename)
{
    StringBuilder paramsBuilder = new StringBuilder();
    paramsBuilder.AppendFormat("--header-right \"[date][time]\" --footer-center \"Page [page] of [topage]\" \"{0}\" \"{1}\"", url, filename);
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        process.StartInfo.Arguments = paramsBuilder.ToString();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.Start();
        if (!process.WaitForExit(60000))
        {
            process.Kill();
        }
    }
}
using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    ConvertChromePdfRenderer("URL", "Sample.pdf");
    Console.WriteLine("ok");
    Console.ReadKey();
}
public static void ConvertChromePdfRenderer(string url, string filename)
{
    StringBuilder paramsBuilder = new StringBuilder();
    paramsBuilder.AppendFormat("--header-right \"[date][time]\" --footer-center \"Page [page] of [topage]\" \"{0}\" \"{1}\"", url, filename);
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        process.StartInfo.Arguments = paramsBuilder.ToString();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.Start();
        if (!process.WaitForExit(60000))
        {
            process.Kill();
        }
    }
}
Imports System.Text
Imports System.Diagnostics
Shared Sub Main(ByVal args() As String)
	ConvertChromePdfRenderer("URL", "Sample.pdf")
	Console.WriteLine("ok")
	Console.ReadKey()
End Sub
Public Shared Sub ConvertChromePdfRenderer(ByVal url As String, ByVal filename As String)
	Dim paramsBuilder As New StringBuilder()
	paramsBuilder.AppendFormat("--header-right ""[date][time]"" --footer-center ""Page [page] of [topage]"" ""{0}"" ""{1}""", url, filename)
	Using process As New Process()
		process.StartInfo.FileName = "C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"
		process.StartInfo.Arguments = paramsBuilder.ToString()
		process.StartInfo.UseShellExecute = False
		process.StartInfo.RedirectStandardOutput = True
		process.StartInfo.RedirectStandardError = True
		process.Start()
		If Not process.WaitForExit(60000) Then
			process.Kill()
		End If
	End Using
End Sub
VB   C#

这段代码将创建以下命令,并使用进程 wkhtmltopdf.exe 执行:

标题--右"[日期][时间]" --footer-center "页面 [页码] 的 [拓扑]""URL" "Sample.pdf"`

它还将创建与我们用 IronPDF 创建的 PDF 文件相同的文件,右侧页眉为 "日期时间",页脚中央为 "当前总页数"。


5.从 HTML 字符串创建 PDF

使用 HTML 字符串创建 PDF 文件是一项非常常见的要求。为此,这两个组件都提供了创建 PDF 文件的方法。请记住,IronPDF 是在 .NET 框架下开发的,而 wkhtmltopdf 是在 "C++"下开发的,因此这两个组件处理 PDF 文件的方式完全不同。

5.1.使用 IronPDF 将 HTML 字符串转换为 PDF

/**
HTML String to PDF
anchor-html-string-to-pdf-using-ironpdf
**/
using IronPdf;
{
    var converter = new ChromePdfRenderer();
    //HTML string
    string HTML = "<h1>Hello IronPDF!</h1> <h2>Welcome to PDF File</h2> ";
    //convert HTML string to PDF file
    using var PDF = converter.RenderHtmlAsPdf(HTML);
    //Save the file
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey();
}
/**
HTML String to PDF
anchor-html-string-to-pdf-using-ironpdf
**/
using IronPdf;
{
    var converter = new ChromePdfRenderer();
    //HTML string
    string HTML = "<h1>Hello IronPDF!</h1> <h2>Welcome to PDF File</h2> ";
    //convert HTML string to PDF file
    using var PDF = converter.RenderHtmlAsPdf(HTML);
    //Save the file
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey();
}
'''
'''HTML String to PDF
'''anchor-html-string-to-pdf-using-ironpdf
'''*
Private ReadOnly Property IronPdf() As using
	Dim converter = New ChromePdfRenderer()
	'HTML string
	Dim HTML As String = "<h1>Hello IronPDF!</h1> <h2>Welcome to PDF File</h2> "
	'convert HTML string to PDF file
	Dim PDF = converter.RenderHtmlAsPdf(HTML)
	'Save the file
	PDF.SaveAs("Sample.pdf")
	Console.WriteLine("successfully created..!")
	Console.ReadKey()
End Property
VB   C#

输出:

下面是 IronPDF 新创建的 "Sample.pdf "文件的截图:

注:

  • 如果我们不指定完整路径,而只写入文件名,就像上述代码那样,那么 PDF 文件将在项目的 bin\Debug 文件夹中创建。

5.2.使用 wkhtmltopdf 将 HTML 字符串转换为 PDF

wkhtmltopdf 的工作有点复杂,为了使其更加清晰易懂,我们定义了一个函数并将其称为 `Main()功能如下

using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    //Html string
    string HTML = "<h1>Hello wkhtmltopdf!</h1><h2>Welcome to PDF File</h2>";
    //Function calling
    ConvertChromePdfRenderer(HTML, "Sample.pdf");
    Console.WriteLine("ok");
    Console.ReadKey();
}
//Function Declaration
public static void ConvertChromePdfRenderer(string html, string path)
{
    //Function Definition
    StringBuilder paramsBuilder = new StringBuilder();
    //Build command
    paramsBuilder.AppendFormat("\"-\" \"{0}\"", path);
    //process to execute above command
    using (Process process = new Process())
    {
        //path of wkhtmltopdf.exe file
        string filepath= "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        //specify path
        process.StartInfo.FileName = filepath;
        //set command by argument
        process.StartInfo.Arguments = paramsBuilder.ToString();
        //set credentials
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        //start process
        process.Start();
        using (var stream = process.StandardInput)
        {
            byte [] buffer = Encoding.UTF8.GetBytes(html);
            stream.BaseStream.Write(buffer, 0, buffer.Length);
            stream.WriteLine();
        }
    }
}
using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    //Html string
    string HTML = "<h1>Hello wkhtmltopdf!</h1><h2>Welcome to PDF File</h2>";
    //Function calling
    ConvertChromePdfRenderer(HTML, "Sample.pdf");
    Console.WriteLine("ok");
    Console.ReadKey();
}
//Function Declaration
public static void ConvertChromePdfRenderer(string html, string path)
{
    //Function Definition
    StringBuilder paramsBuilder = new StringBuilder();
    //Build command
    paramsBuilder.AppendFormat("\"-\" \"{0}\"", path);
    //process to execute above command
    using (Process process = new Process())
    {
        //path of wkhtmltopdf.exe file
        string filepath= "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        //specify path
        process.StartInfo.FileName = filepath;
        //set command by argument
        process.StartInfo.Arguments = paramsBuilder.ToString();
        //set credentials
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        //start process
        process.Start();
        using (var stream = process.StandardInput)
        {
            byte [] buffer = Encoding.UTF8.GetBytes(html);
            stream.BaseStream.Write(buffer, 0, buffer.Length);
            stream.WriteLine();
        }
    }
}
Imports System.Text
Imports System.Diagnostics
Shared Sub Main(ByVal args() As String)
	'Html string
	Dim HTML As String = "<h1>Hello wkhtmltopdf!</h1><h2>Welcome to PDF File</h2>"
	'Function calling
	ConvertChromePdfRenderer(HTML, "Sample.pdf")
	Console.WriteLine("ok")
	Console.ReadKey()
End Sub
'Function Declaration
Public Shared Sub ConvertChromePdfRenderer(ByVal html As String, ByVal path As String)
	'Function Definition
	Dim paramsBuilder As New StringBuilder()
	'Build command
	paramsBuilder.AppendFormat("""-"" ""{0}""", path)
	'process to execute above command
	Using process As New Process()
		'path of wkhtmltopdf.exe file
		Dim filepath As String= "C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"
		'specify path
		process.StartInfo.FileName = filepath
		'set command by argument
		process.StartInfo.Arguments = paramsBuilder.ToString()
		'set credentials
		process.StartInfo.UseShellExecute = False
		process.StartInfo.RedirectStandardError = True
		process.StartInfo.RedirectStandardInput = True
		'start process
		process.Start()
		Using stream = process.StandardInput
			Dim buffer() As Byte = Encoding.UTF8.GetBytes(html)
			stream.BaseStream.Write(buffer, 0, buffer.Length)
			stream.WriteLine()
		End Using
	End Using
End Sub
VB   C#

输出:

wkhtmltopdf 新建的 "Sample.pdf "文件截图:

5.3.IronPDF 和 WkhtmlToPdf 的另一项比较

IronPDF 与 WkhtmlToPdf 的另一项比较

WkhtmlToPdf 是一款开源产品。它不具备 IronPDF 的所有功能。

比较的最好方法就是进行实际测试。

WkhtmlToPdf 的渲染质量

IronPDF 和 WkHtmlToPdf 在渲染 PDF 的质量上存在明显差异。

用户界面设计

WkHtmlToPdf 错过了所有必须应用于网页的 CSS 文件。

CSS 和 JS 文件对用户界面设计非常重要。WkHtmlToPdf 无需加载这些必要文件即可开始渲染页面。

相比之下,IronPDF 能高精度地渲染 CSS 和 JS 文件。

颜色

WkHtmlToPdf 文件渲染无法捕捉背景颜色。 同样,IronPDF 的效果更好,渲染中显示的颜色更准确。

标题

在 WkHtmlToPdf 渲染中,页眉完全缺失。而在 IronPDF 效果图中,页眉是有特色的,而且位置正确。

按钮

网页上按钮的位置显然很重要。更改按钮和 CTA (行动呼吁) 改变了意图。在 WkHtmlToPdf 中,按钮的位置并不准确。这与最初的网页设计完全不同。

另一方面,如果我们看 IronPDF 文件,就会发现按钮的位置是准确的。

结论

IronPDF 在渲染前暂停并等待所有文件加载的方式。这一步骤本身就能改善结果。总体而言,IronPDF 能提供更准确的结果。

5.4.比较结论

阅读完上述文章并理解了上述两个示例后,我们可以清楚地看到,IronPDF 提供了一种创建 PDF 文件的简单方法,而且其生成的 PDF 文件比 wkhtmltopdf 更具有可读性,因为它会自动调整左右两边的边距。

IronPdf 还允许我们解析、编辑、合并和签署 PDF 文件。

另一方面,wkhtmltopdf 更为复杂,因为我们需要添加一个单独的进程并运行它,这会影响项目的性能。


6.添加页眉和页脚

这两个组件都提供在 PDF 文件中添加页眉和页脚的功能,但两者的编程结构不同 (使用 .NET Framework 的 IronPDF 和 C++ 中的 wkhtmltopdf).

6.1.使用 IronPDF 添加页眉和页脚

IronPDF 提供以下函数来设置页眉和页脚的属性。可使用 "CamelCase "编写。

  • CenterText 将页眉或页脚的文本写在中间。
  • DrawDividerLine绘制水平线,将内容与页眉或页脚分开。
  • FontFamily指定页眉或页脚的字体系列。
  • FontSize 用于设置页眉和页脚的字体大小。
  • LeftText用于在页眉或页脚左侧书写文本。
  • RightText用于在页眉或页脚右侧书写文本。

  • 间距 用于设置页面内容与页眉或页脚之间的间距。
/**
Add Header Footer
anchor-add-headers-and-footers-using-ironpdf
**/
using IronPdf;
{
    var converter = new IronPdf.ChromePdfRenderer();
    converter.RenderingOptions.TextHeader = new TextHeaderFooter()
    {
        LeftText = "MyTask",
        RightText = "{date} - {time}",
        DrawDividerLine = true,            
    };
    converter.RenderingOptions.TextFooter = new TextHeaderFooter()
    {             
        RightText = "Page {page} of {total-pages}"              
    };
    using var PDF = converter.RenderHtmlAsPdf("<h1 style='text-align:center'>Welcome To IronPdf</h1>");
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey();
}
/**
Add Header Footer
anchor-add-headers-and-footers-using-ironpdf
**/
using IronPdf;
{
    var converter = new IronPdf.ChromePdfRenderer();
    converter.RenderingOptions.TextHeader = new TextHeaderFooter()
    {
        LeftText = "MyTask",
        RightText = "{date} - {time}",
        DrawDividerLine = true,            
    };
    converter.RenderingOptions.TextFooter = new TextHeaderFooter()
    {             
        RightText = "Page {page} of {total-pages}"              
    };
    using var PDF = converter.RenderHtmlAsPdf("<h1 style='text-align:center'>Welcome To IronPdf</h1>");
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey();
}
'''
'''Add Header Footer
'''anchor-add-headers-and-footers-using-ironpdf
'''*
Private ReadOnly Property IronPdf() As using
	Dim converter = New IronPdf.ChromePdfRenderer()
	converter.RenderingOptions.TextHeader = New TextHeaderFooter() With {
		.LeftText = "MyTask",
		.RightText = "{date} - {time}",
		.DrawDividerLine = True
	}
	converter.RenderingOptions.TextFooter = New TextHeaderFooter() With {.RightText = "Page {page} of {total-pages}"}
	Dim PDF = converter.RenderHtmlAsPdf("<h1 style='text-align:center'>Welcome To IronPdf</h1>")
	PDF.SaveAs("Sample.pdf")
	Console.WriteLine("successfully created..!")
	Console.ReadKey()
End Property
VB   C#

输出:

这是 IronPDF 新创建的 "Sample.pdf "文件的截图。

我们可以很容易地看到,"我的任务 "文本打印在页眉左侧,"日期时间 "打印在页眉右侧,"当前总页数 "打印在页脚右侧。

注:

  • 如果我们不指定完整路径,而只写入文件名,就像上述代码那样,那么 PDF 文件将在项目的 bin\Debug 文件夹中创建。

6.2.使用 wkhtmltopdf 添加页眉和页脚

wkhtmltopdf 还提供了许多处理 PDF 文件页眉和页脚的功能。它为页眉和页脚提供了单独的函数。为此,我们需要加上两个破折号 (--) 和一个破折号 (-) 以连接属性名称,如下所示

设置页眉属性

  • --header-center 将页眉文本居中打印。
  • --header-right,在右侧打印页眉文本。
  • --header-left,在左侧打印页眉文本。
  • --header-font-name 用于指定页眉文本的字体系列。
  • --header-font-size 用于指定页眉文本的字体大小。
  • --header-line用于绘制标题线,将标题与内容分开。
  • --no-header-line删除页眉和页面内容之间的页眉线。
  • --header-spacing指定页眉与页面内容之间的间距。

设置页脚属性

  • --footer-center 将页脚文本居中打印。
  • -footer-right,在右侧打印页脚文本。
  • -footer-left,在左侧打印页脚文本。
  • -footer-font-name指定页脚文本的字体系列。
  • -footer-font-size指定页脚文本的字体大小。
  • --footer-line 绘制页脚线,将页脚与内容分开。
  • --no-footer-line删除页脚和页面内容之间的页脚线
  • --footer-spacing 指定页脚与页面内容之间的间距。

了解更多关于 页眉和页脚 wkhtmltopdf 函数 以及更多。

在本例中,为了避免复杂性,我们将单独创建一个函数,以便于理解其工作原理。我们将创建与上例相同的 PDF 文件:

using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    ConvertChromePdfRenderer("<h1 style='text-align:center'>Welcom to wkhtmltopdf</h1>", "MyTask", "Sample.pdf");
                Console.WriteLine("Successfully Created");
                Console.ReadKey();
    }
public static void ConvertChromePdfRenderer(string html, string header, string path)
{ 
    StringBuilder paramsBuilder = new StringBuilder();
    paramsBuilder.AppendFormat("--header-left \"{0}\" --header-right \"[date] - [time]\" --header-line --footer-right \"Page [page] of [topage]\" \"-\"  \"{1}\"", header, path);
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        process.StartInfo.Arguments = paramsBuilder.ToString();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        process.Start();
        using (var stream = process.StandardInput)
        {
            byte [] buffer = Encoding.UTF8.GetBytes(html);
            stream.BaseStream.Write(buffer, 0, buffer.Length);
            stream.WriteLine();
        }
    }
}
using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    ConvertChromePdfRenderer("<h1 style='text-align:center'>Welcom to wkhtmltopdf</h1>", "MyTask", "Sample.pdf");
                Console.WriteLine("Successfully Created");
                Console.ReadKey();
    }
public static void ConvertChromePdfRenderer(string html, string header, string path)
{ 
    StringBuilder paramsBuilder = new StringBuilder();
    paramsBuilder.AppendFormat("--header-left \"{0}\" --header-right \"[date] - [time]\" --header-line --footer-right \"Page [page] of [topage]\" \"-\"  \"{1}\"", header, path);
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        process.StartInfo.Arguments = paramsBuilder.ToString();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        process.Start();
        using (var stream = process.StandardInput)
        {
            byte [] buffer = Encoding.UTF8.GetBytes(html);
            stream.BaseStream.Write(buffer, 0, buffer.Length);
            stream.WriteLine();
        }
    }
}
Imports System.Text
Imports System.Diagnostics
Shared Sub Main(ByVal args() As String)
	ConvertChromePdfRenderer("<h1 style='text-align:center'>Welcom to wkhtmltopdf</h1>", "MyTask", "Sample.pdf")
				Console.WriteLine("Successfully Created")
				Console.ReadKey()
End Sub
Public Shared Sub ConvertChromePdfRenderer(ByVal html As String, ByVal header As String, ByVal path As String)
	Dim paramsBuilder As New StringBuilder()
	paramsBuilder.AppendFormat("--header-left ""{0}"" --header-right ""[date] - [time]"" --header-line --footer-right ""Page [page] of [topage]"" ""-""  ""{1}""", header, path)
	Using process As New Process()
		process.StartInfo.FileName = "C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"
		process.StartInfo.Arguments = paramsBuilder.ToString()
		process.StartInfo.UseShellExecute = False
		process.StartInfo.RedirectStandardError = True
		process.StartInfo.RedirectStandardInput = True
		process.Start()
		Using stream = process.StandardInput
			Dim buffer() As Byte = Encoding.UTF8.GetBytes(html)
			stream.BaseStream.Write(buffer, 0, buffer.Length)
			stream.WriteLine()
		End Using
	End Using
End Sub
VB   C#

上述代码将使用 wkhtmltopdf.exe 文件执行以下命令

标题--left "MyTask" 标题--right "[日期] - [时间]" --header-line --footer-right "页码 [页码] 的 [拓扑]""-" "Sample.pdf"`

output

这是 wkhtmltopdf 新建的 "Sample.pdf "文件的截图。


7.添加和调整页边距

假设我们想通过 URL 创建 PDF 文件,并设置页边距。这两个组件都提供了从左、上、右和下设置页边距的功能。

7.1 使用 IronPDF 添加和调整页边距

/**
Adjust Margins
anchor-add-and-adjust-margins-using-ironpdf
**/
using IronPdf;
{
    //create rendering converter
    var converter = new ChromePdfRenderer();
    converter.RenderingOptions.MarginTop = 20;
    converter.RenderingOptions.MarginLeft = 40;
    //Specify URL 
    using var PDF = converter.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF");
    //Save the file
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey(); 
}
/**
Adjust Margins
anchor-add-and-adjust-margins-using-ironpdf
**/
using IronPdf;
{
    //create rendering converter
    var converter = new ChromePdfRenderer();
    converter.RenderingOptions.MarginTop = 20;
    converter.RenderingOptions.MarginLeft = 40;
    //Specify URL 
    using var PDF = converter.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF");
    //Save the file
    PDF.SaveAs("Sample.pdf");
    Console.WriteLine("successfully created..!");
    Console.ReadKey(); 
}
'''
'''Adjust Margins
'''anchor-add-and-adjust-margins-using-ironpdf
'''*
Private ReadOnly Property IronPdf() As using
	'create rendering converter
	Dim converter = New ChromePdfRenderer()
	converter.RenderingOptions.MarginTop = 20
	converter.RenderingOptions.MarginLeft = 40
	'Specify URL 
	Dim PDF = converter.RenderUrlAsPdf("https://en.wikipedia.org/wiki/PDF")
	'Save the file
	PDF.SaveAs("Sample.pdf")
	Console.WriteLine("successfully created..!")
	Console.ReadKey()
End Property
VB   C#

输出:

下面是 IronPDF 的 "Sample.pdf "文件截图。

很明显,上述代码从指定的 URL 创建了 PDF 文件,并设置了 margin-left 40 mm 和 margin-top 20 mm。现在,让我们使用 wkhtmltopdf 完成同样的操作。

7.2 使用 wkhtmltopdf 添加和调整页边距

要使用 wkhtmltopdf,我们需要使用 wkhtmltopdf.exe 文件执行单独的进程。为避免复杂性,我们将定义一个新函数并将其称为 `main()功能如下

using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    ConvertChromePdfRenderer(20, 40, "https://en.wikipedia.org/wiki/PDF", "Sample.pdf");
    Console.WriteLine("ok");
    Console.ReadKey();
}

public static void ConvertChromePdfRenderer(int margin_top, int margin_left, string url, string filename)
{
    StringBuilder paramsBuilder = new StringBuilder();
    paramsBuilder.AppendFormat("--margin-top \"{0}\" --margin-left \"{1}\" \"{2}\" \"{3}\"", margin_top, margin_left, url, filename);
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        process.StartInfo.Arguments = paramsBuilder.ToString();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.Start();
        if (!process.WaitForExit(60000))
        {
            process.Kill();
        }
    }
}
using System.Text;
using System.Diagnostics;
static void Main(string [] args)
{
    ConvertChromePdfRenderer(20, 40, "https://en.wikipedia.org/wiki/PDF", "Sample.pdf");
    Console.WriteLine("ok");
    Console.ReadKey();
}

public static void ConvertChromePdfRenderer(int margin_top, int margin_left, string url, string filename)
{
    StringBuilder paramsBuilder = new StringBuilder();
    paramsBuilder.AppendFormat("--margin-top \"{0}\" --margin-left \"{1}\" \"{2}\" \"{3}\"", margin_top, margin_left, url, filename);
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "C:\\Program Files (x86)\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        process.StartInfo.Arguments = paramsBuilder.ToString();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.Start();
        if (!process.WaitForExit(60000))
        {
            process.Kill();
        }
    }
}
Imports System.Text
Imports System.Diagnostics
Shared Sub Main(ByVal args() As String)
	ConvertChromePdfRenderer(20, 40, "https://en.wikipedia.org/wiki/PDF", "Sample.pdf")
	Console.WriteLine("ok")
	Console.ReadKey()
End Sub

Public Shared Sub ConvertChromePdfRenderer(ByVal margin_top As Integer, ByVal margin_left As Integer, ByVal url As String, ByVal filename As String)
	Dim paramsBuilder As New StringBuilder()
	paramsBuilder.AppendFormat("--margin-top ""{0}"" --margin-left ""{1}"" ""{2}"" ""{3}""", margin_top, margin_left, url, filename)
	Using process As New Process()
		process.StartInfo.FileName = "C:\Program Files (x86)\wkhtmltopdf\bin\wkhtmltopdf.exe"
		process.StartInfo.Arguments = paramsBuilder.ToString()
		process.StartInfo.UseShellExecute = False
		process.StartInfo.RedirectStandardOutput = True
		process.StartInfo.RedirectStandardError = True
		process.Start()
		If Not process.WaitForExit(60000) Then
			process.Kill()
		End If
	End Using
End Sub
VB   C#

这段代码将使用 wkhtmltopdf.exe 的进程执行以下命令:

--margin-top "20" --margin-left "40" "https://en.wikipedia.org/wiki/PDF" "Sample.pdf"

输出:

下面是 wkhtmltopdf 制作的 "Sample.pdf "文件。

它创建的 PDF 文件与我们使用 IronPDF 创建的文件相同。

7.3.结论

任何项目的性能都非常重要,不幸的是,wkhtmltopdf 会影响性能,因为它需要执行单独的进程和线程。另一方面,如果我们使用 IronPDF,就不需要运行单独的进程和线程。


许可和定价

8.许可和定价

让我们来谈谈这两种产品的许可和定价。

8.1.IronPDF 许可证和定价

IronPDF 可免费用于开发,并提供为期 30 天的免费部署试用。如需全面部署使用,许可证起价为"$liteLicense",可在以下网址获得适用于多个开发人员、项目和免版税再分发产品的软件包 IronPDF 许可.

IronPDF 几乎每月都会发布一个新版本,以跟上最新的技术和错误修复。该组件非常可靠,由 IronSoftware 的全职工程团队提供支持,可为客户提供高质量和高性能的产品。

8.2. wkhtmltopdf 许可和定价

wkhtmltopdf 是一款开源组件,可免费使用。因此,它不提供任何类型的软件更新、错误修复、支持、热修复或公司担保。如果我们在项目中使用了 wkhtmltopdf,那么调试和管理它的成功与否就取决于我们自己了。


摘要

9.IronPDF 与 wkhtmltopdf 的最终比较

IronPDFwkhtmltopdf
IronPDF 成为项目的一部分wkhtmltopdf 不会成为项目的一部分
无需单独流程需要运行单独的进程
自动设置空格以提高可读性页眉和页面内容之间没有自动空格
可启用或禁用 JavaScript可启用或禁用 JavaScript
可在不同尺寸的纸张上打印可在不同尺寸的纸张上打印
提供大量文件文献资料很少
无需指定单独的文件路径需要指定 "wkhtmltopdf.exe "文件的路径
C# 库,需要在项目中添加其引用基于 CLI,在 .NET 应用程序中使用 Process 执行命令。不建议在网络或服务器应用程序中使用。
提供将`.aspx`页面转换为 PDF 文件的通用方法未提供将`.aspx`页面转换为 PDF 的通用方法
可在 PDF 文件中轻松添加分页符分页可能需要研究。
免费用于开发,许可证提供版本更新和工程师支持开放源代码,无已知支持

教程快速访问

探索 IronPDF API 参考

探索 IronPDF C# 库的 API 参考,包括 IronPDF 的所有功能、类、方法字段、命名空间和枚举的详细信息。

查看应用程序接口参考
< 前一页
Syncfusion PDF 查看器 HTML 转 PDF 比较
下一步 >
Aspose PDF转换器教程与对比

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,731,156 查看许可证 >