跳至页脚内容
使用IRONPDF

如何使用 IronPDF for .NET 在 ASP.NET 中使用 C# 将 HTML 转换为 PDF

IronPDF 使用基于 Chrome 的渲染引擎在 ASP.NET 中将 HTML 转换为 PDF,只需几行 C# 代码即可将您的 HTML 字符串、文件或 URL 转换为像素级完美的 PDF 文档。

在当今快节奏的 ASP.NET 环境中,您的应用程序在生成发票或报告等重要文件时不能慢下来。 你需要一种能够轻松将 HTML 转换为 PDF 的方法,并保证每次转换都能在所有设备上获得完美的格式。

IronPDF 是为应对这一挑战而构建的 C# PDF 库。 它使用可靠的基于 Chrome 的渲染引擎,将您的动态 HTML 代码转换为像素级完美的 PDF 文档。 我们将引导您完成将 IronPDF 集成到您的 .NET 项目中的简单步骤,并立即开始创建专业级 PDF。

如何在 ASP.NET Core 中将 HTML 快速转换为 PDF?

在 ASP.NET Core 中开始进行HTML 到 PDF 的转换只需要几行代码。 首先,安装 IronPDF NuGet 包管理器控制台包

Install-Package IronPdf

想学习如何在 ASP.NET 中使用 C# 将 HTML 转换为 PDF 吗? 以下是一个完整的代码片段,演示了如何在ASP.NET Core MVC 控制器中将 HTML 字符串转换为 PDF 文件,以帮助您入门:

Nuget Icon立即开始使用 NuGet 创建 PDF 文件:

  1. 使用 NuGet 包管理器安装 IronPDF

    PM > Install-Package IronPdf

  2. 复制并运行这段代码。

    using IronPdf;
    using Microsoft.AspNetCore.Mvc;
    // your program.cs file
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllersWithViews();
    var app = builder.Build();
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    app.Run();
    // in your controller file
    public class PdfController : Controller
    {
        public IActionResult GeneratePdf()
        {
            var renderer = new ChromePdfRenderer();
            // Convert HTML string to PDF
            string HTML = @"
                <h1>Invoice #2024-001</h1>
                <p>Generated on: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
                <table>
                    <tr><th>Item</th><th>Price</th></tr>
                    <tr><td>Professional License</td><td>$799</td></tr>
                </table>";
            var PDF = renderer.RenderHtmlAsPdf(html);
            // Return PDF as file download
            return File(pdf.BinaryData, "application/pdf", "invoice.pdf");
        }
    }
  3. 部署到您的生产环境中进行测试

    立即开始在您的项目中使用 IronPDF,免费试用!
    arrow pointer

生成的 PDF 看起来像什么?

PDF 查看器显示一份编号为 #2024-001 的简单发票文档,其中包含发票抬头、生成日期以及一个包含"项目"和"价格"列的表格,表格中包含一项价值 799 美元的专业许可证条目。

该代码创建了一个简单的控制器,可直接从 HTML 字符串生成 PDF 文档。 ChromePdfRenderer 类处理所有复杂的渲染,确保您的 HTML 结构、CSS 样式甚至JavaScript 在最终的 PDF 输出中正确渲染

不同 HTML 源的基本方法是什么?

IronPDF 提供了三种将 HTML 内容转换为 PDF 格式的主要方法,每种方法都是针对您在 ASP.NET 开发中遇到的特定情况而设计的。 无论您是处理动态 HTML 内容静态 HTML 文件还是实时网页,IronPDF 都能满足您的需求。

如何转换动态HTML字符串?

处理数据库驱动报表等动态内容时,请使用RenderHtmlAsPdf直接转换 HTML 字符串。 这种方法非常适合从模板生成PDF报告

var renderer = new ChromePdfRenderer();
string htmlContent = BuildDynamicHtml(); // Your method to generate HTML
var PDF = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("dynamic-report.pdf");
var renderer = new ChromePdfRenderer();
string htmlContent = BuildDynamicHtml(); // Your method to generate HTML
var PDF = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("dynamic-report.pdf");
Dim renderer As New ChromePdfRenderer()
Dim htmlContent As String = BuildDynamicHtml() ' Your method to generate HTML
Dim PDF = renderer.RenderHtmlAsPdf(htmlContent)
PDF.SaveAs("dynamic-report.pdf")
$vbLabelText   $csharpLabel

HTML字符串转换能得到什么样的结果?

IronPDF 测试报告显示了渲染后的 HTML 内容,并应用了 CSS 样式,包括蓝色标题"IronPDF 测试报告"、绿色样式段落文本以及包含产品信息(例如小部件和工具)的格式化数据表。

这种方法非常适合从填充了实时数据、表单提交内容或任何动态生成的 HTML 内容的 HTML 模板生成 PDF 文档。 渲染引擎会保留所有 CSS 样式,包括自定义字体、颜色和表格格式。

何时应该将磁盘上的 HTML 文件转换为 HTML 文件?

对于以文件形式存储的静态 HTML 模板,请使用RenderHtmlFileAsPdf直接转换 HTML 文件。 这在使用基于模板的PDF生成时非常理想:

var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderHtmlFileAsPdf("wwwroot/templates/report-template.html");
pdf.SaveAs("report.pdf");
var renderer = new ChromePdfRenderer();
var PDF = renderer.RenderHtmlFileAsPdf("wwwroot/templates/report-template.html");
pdf.SaveAs("report.pdf");
Dim renderer = New ChromePdfRenderer()
Dim PDF = renderer.RenderHtmlFileAsPdf("wwwroot/templates/report-template.html")
PDF.SaveAs("report.pdf")
$vbLabelText   $csharpLabel

该方法能够高效地处理现有的 HTML 文件,自动解析CSS 样式图像和外部资源的相对 URL。 在处理复杂布局自定义字体时,它尤其有用。

如何将网页网址转换为PDF?

要捕获整个网页或将现有 URL 渲染为 PDF,请使用 URL 转换方法。 此功能支持JavaScript 渲染渲染延迟

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000); // Wait an extra second for JavaScript to load
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
var PDF = renderer.RenderUrlAsPdf("___PROTECTED_URL_79___");
pdf.SaveAs("webpage.pdf");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000); // Wait an extra second for JavaScript to load
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen;
var PDF = renderer.RenderUrlAsPdf("___PROTECTED_URL_79___");
pdf.SaveAs("webpage.pdf");
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(1000) ' Wait an extra second for JavaScript to load
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen
Dim PDF = renderer.RenderUrlAsPdf("___PROTECTED_URL_79___")
pdf.SaveAs("webpage.pdf")
$vbLabelText   $csharpLabel

基于URL的PDF转换会生成什么?

维基百科主页在PDF查看器中显示,完整展示了网页布局,包括导航、内容板块、特色文章预览和维基百科徽标,证明HTML到PDF转换成功,格式和图像均得以保留。

这项有效的功能支持复杂的 JavaScript 渲染,使其成为转换单页应用程序或从指定 URL 动态加载的 Web 内容的理想选择。 Chrome渲染引擎可确保准确再现现代网页功能。

如何处理表单数据和 POST 请求?

在生成 PDF 之前处理表单数据在 ASP.NET 应用程序中很常见。 以下是如何处理 POST 提交并从提交的数据生成 PDF 的方法,非常适合创建订单确认发票

[HttpPost]
public IActionResult ProcessFormToPdf(OrderModel model)
{
    var renderer = new ChromePdfRenderer();
    // Build HTML from form data
    string HTML = $@"
        <h2>Order Confirmation</h2>
        <p>Customer: {model.CustomerName}</p>
        <p>Order Date: {model.OrderDate:yyyy-MM-dd}</p>
        <ul>
            {string.Join("", model.Items.Select(i => $"<li>{i.Name} - ${i.Price}</li>"))}
        </ul>
        <p><strong>Total: ${model.Total}</strong></p>";
    var PDF = renderer.RenderHtmlAsPdf(html);
    // Save to server and return download
    var fileName = $"order-{model.OrderId}.pdf";
    return File(pdf.BinaryData, "application/pdf", fileName);
}
[HttpPost]
public IActionResult ProcessFormToPdf(OrderModel model)
{
    var renderer = new ChromePdfRenderer();
    // Build HTML from form data
    string HTML = $@"
        <h2>Order Confirmation</h2>
        <p>Customer: {model.CustomerName}</p>
        <p>Order Date: {model.OrderDate:yyyy-MM-dd}</p>
        <ul>
            {string.Join("", model.Items.Select(i => $"<li>{i.Name} - ${i.Price}</li>"))}
        </ul>
        <p><strong>Total: ${model.Total}</strong></p>";
    var PDF = renderer.RenderHtmlAsPdf(html);
    // Save to server and return download
    var fileName = $"order-{model.OrderId}.pdf";
    return File(pdf.BinaryData, "application/pdf", fileName);
}
Imports Microsoft.AspNetCore.Mvc

<HttpPost>
Public Function ProcessFormToPdf(model As OrderModel) As IActionResult
    Dim renderer = New ChromePdfRenderer()
    ' Build HTML from form data
    Dim HTML As String = $"
        <h2>Order Confirmation</h2>
        <p>Customer: {model.CustomerName}</p>
        <p>Order Date: {model.OrderDate:yyyy-MM-dd}</p>
        <ul>
            {String.Join("", model.Items.Select(Function(i) $"<li>{i.Name} - ${i.Price}</li>"))}
        </ul>
        <p><strong>Total: ${model.Total}</strong></p>"
    Dim PDF = renderer.RenderHtmlAsPdf(HTML)
    ' Save to server and return download
    Dim fileName = $"order-{model.OrderId}.pdf"
    Return File(PDF.BinaryData, "application/pdf", fileName)
End Function
$vbLabelText   $csharpLabel

表单界面是什么样的?

网页表单界面显示订单创建页面,其中包含客户详细信息部分(姓名栏显示"Jane Doe",日期显示"2025年11月19日")、订单项目部分(显示"笔记本电脑",价格为"1300")、订单摘要(显示总金额)以及一个蓝色的"生成PDF"按钮。

表单数据在生成的PDF文件中如何显示?

PDF 查看器显示了一个清晰的订单确认文档,标题为"订单确认",客户姓名为"Jane Doe",订单日期为"2025-11-19",详细清单显示了购买笔记本电脑的订单,金额为 1300 美元,表明表单已成功转换为 PDF 文件。

对于更复杂的场景,您可以集成PDF 表单编辑现有的 PDF 模板来创建动态文档。 该图书馆还支持法律文件和合同的数字签名

哪些高级功能可以提升 PDF 生成效率?

如何添加专业的页眉、页脚和水印?

专业的PDF文档通常需要页眉、页脚水印。 IronPDF 提供高效的编辑功能,使这些添加操作变得简单易行,从而简化了 PDF 操作:

var renderer = new ChromePdfRenderer();
// Configure headers and footers
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    MaxHeight = 25,
    HtmlFragment = "<div style='text-align:center'>Annual Report 2024</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    MaxHeight = 20,
    HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
};
// Generate PDF
var PDF = renderer.RenderHtmlAsPdf(htmlContent);
// Add watermark
pdf.ApplyWatermark("<h2 style='color:red;opacity:0.3'>CONFIDENTIAL</h2>",
    30, VerticalAlignment.Middle, HorizontalAlignment.Center);
pdf.SaveAs("report-with-watermark.pdf");
var renderer = new ChromePdfRenderer();
// Configure headers and footers
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    MaxHeight = 25,
    HtmlFragment = "<div style='text-align:center'>Annual Report 2024</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    MaxHeight = 20,
    HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
};
// Generate PDF
var PDF = renderer.RenderHtmlAsPdf(htmlContent);
// Add watermark
pdf.ApplyWatermark("<h2 style='color:red;opacity:0.3'>CONFIDENTIAL</h2>",
    30, VerticalAlignment.Middle, HorizontalAlignment.Center);
pdf.SaveAs("report-with-watermark.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
' Configure headers and footers
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .MaxHeight = 25,
    .HtmlFragment = "<div style='text-align:center'>Annual Report 2024</div>"
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
    .MaxHeight = 20,
    .HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
}
' Generate PDF
Dim PDF = renderer.RenderHtmlAsPdf(htmlContent)
' Add watermark
PDF.ApplyWatermark("<h2 style='color:red;opacity:0.3'>CONFIDENTIAL</h2>",
    30, VerticalAlignment.Middle, HorizontalAlignment.Center)
PDF.SaveAs("report-with-watermark.pdf")
$vbLabelText   $csharpLabel

PDF 中的水印和页眉是什么样的?

IronPDF 测试报告显示,该 PDF 文档带有自定义蓝色标题"IronPDF 测试报告"、绿色内联文本格式、包含产品信息的数据表,以及位于页面对角线位置的红色"机密"水印。

这些功能将基本的 HTML 转换为 PDF 转变为专业的文档生成,是合同、报告和官方文件的完美选择。 您还可以添加页码背景和前景,甚至自定义图章

如何改进 PDF 的 CSS 和打印媒体效果?

为确保 PDF 输出符合预期,请使用CSS 打印媒体查询和响应式设计原则。 IronPDF 完全支持分页符自定义纸张尺寸

var renderer = new ChromePdfRenderer();
// Configure CSS media type
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
// Set viewport for responsive designs
renderer.RenderingOptions.ViewPortWidth = 1024;
// Configure margins
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
string HTML = @"
    <style>
        @media print {
            .no-print { display: none; }
            body { font-size: 12pt; }
            .page-break { page-break-after: always; }
        }
        @page {
            size: A4;
            margin: 1cm;
        }
    </style>
    <div class='content'>
        <h1>Professional Report</h1>
        <div class='page-break'></div>
        <h2>Section 2</h2>
    </div>";
var PDF = renderer.RenderHtmlAsPdf(html);
var renderer = new ChromePdfRenderer();
// Configure CSS media type
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
// Set viewport for responsive designs
renderer.RenderingOptions.ViewPortWidth = 1024;
// Configure margins
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
string HTML = @"
    <style>
        @media print {
            .no-print { display: none; }
            body { font-size: 12pt; }
            .page-break { page-break-after: always; }
        }
        @page {
            size: A4;
            margin: 1cm;
        }
    </style>
    <div class='content'>
        <h1>Professional Report</h1>
        <div class='page-break'></div>
        <h2>Section 2</h2>
    </div>";
var PDF = renderer.RenderHtmlAsPdf(html);
Dim renderer As New ChromePdfRenderer()
' Configure CSS media type
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
' Set viewport for responsive designs
renderer.RenderingOptions.ViewPortWidth = 1024
' Configure margins
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 10
Dim HTML As String = "
    <style>
        @media print {
            .no-print { display: none; }
            body { font-size: 12pt; }
            .page-break { page-break-after: always; }
        }
        @page {
            size: A4;
            margin: 1cm;
        }
    </style>
    <div class='content'>
        <h1>Professional Report</h1>
        <div class='page-break'></div>
        <h2>Section 2</h2>
    </div>"
Dim PDF = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

Print CSS 提供了哪些格式改进?

PDF 文档查看器以 76% 的缩放比例显示一份两页的专业报告,第一页标题为"专业报告",第二页标题为"第二部分",布局清晰,分页符正确,并应用了 CSS 格式。

使用打印 CSS 可确保您的 PDF 文档保持专业格式,同时隐藏不必要的网络元素,如导航菜单或交互式按钮。 您可以控制分页符位置等功能,以确保最佳渲染效果。 您还可以设置自定义边距和控制页面方向

如何处理身份验证和安全问题?

对于安全应用程序,IronPDF 支持各种身份验证方法,包括cookieHTTP 标头网络凭据。 以下是渲染受保护页面的示例:

var renderer = new ChromePdfRenderer();
// Add authentication cookie
renderer.RequestContext.Cookies.Add(new Cookie
{
    Name = "SessionId",
    Value = "your-session-token",
    Domain = "example.com"
});
// Or use basic authentication
renderer.ChromePdfRenderOptions.HttpLoginCredentials = new HttpLoginCredentials
{
    Username = "user",
    Password = "password"
};
var PDF = renderer.RenderUrlAsPdf("___PROTECTED_URL_80___");
var renderer = new ChromePdfRenderer();
// Add authentication cookie
renderer.RequestContext.Cookies.Add(new Cookie
{
    Name = "SessionId",
    Value = "your-session-token",
    Domain = "example.com"
});
// Or use basic authentication
renderer.ChromePdfRenderOptions.HttpLoginCredentials = new HttpLoginCredentials
{
    Username = "user",
    Password = "password"
};
var PDF = renderer.RenderUrlAsPdf("___PROTECTED_URL_80___");
Dim renderer As New ChromePdfRenderer()
' Add authentication cookie
renderer.RequestContext.Cookies.Add(New Cookie With {
    .Name = "SessionId",
    .Value = "your-session-token",
    .Domain = "example.com"
})
' Or use basic authentication
renderer.ChromePdfRenderOptions.HttpLoginCredentials = New HttpLoginCredentials With {
    .Username = "user",
    .Password = "password"
}
Dim PDF = renderer.RenderUrlAsPdf("___PROTECTED_URL_80___")
$vbLabelText   $csharpLabel

您还可以使用密码加密 PDF 文件并设置权限,或者添加数字签名以验证文档的真实性。

为什么选择 IronPDF 用于 ASP.NET PDF 生成?

IronPDF基于 Chrome 的渲染引擎可确保将 HTML 精确转换为 PDF,并完全支持现代 Web 标准。 该库可处理其他 PDF 转换器难以处理的复杂 JavaScript、CSS3 动画和响应式布局。 集成只需要几行代码,非常适合在您的.NET 项目.NET 应用程序中进行快速开发。

ChromePdfRenderer类通过其RenderingOptions 属性提供广泛的自定义功能,允许您控制纸张大小、边距、JavaScript 执行和渲染延迟。 无论是生成简单的发票还是复杂的多页报告,这种灵活性都能确保您的 PDF 输出符合准确的规格要求。 该库支持异步操作以获得更好的性能,并且可以处理多线程场景。

该库能够以同样的保真度渲染整个网页或较小的 HTML 片段,而不会留下临时文件。 它支持UTF-8 和国际语言网页字体和图标,甚至可以将Markdown 转换为 PDF 。 这些特性使其成为一款高效的HTML转PDF转换器。

对于企业应用,IronPDF 提供高级功能,例如用于归档的PDF/A 合规性用于辅助功能的 PDF/UA ,甚至可以处理WebGL 内容。 该库可在WindowsLinuxmacOS上无缝运行,并可部署到AzureAWS

PDF生成流程的下一步是什么?

使用 IronPDF 在 ASP.NET C# 中将 HTML 转换为 PDF,可以简化文档生成工作流程,同时保持完美的视觉保真度。 该库的简单 API 和高效的渲染功能,使其成为任何需要生成 PDF 的 ASP.NET Core 应用程序的理想解决方案。 无论您是为 .NET Core、.NET Framework 开发,还是构建移动应用程序,它都是处理 PDF 任务的完美 .NET 封装器。

您可以使用命令行,也可以直接在 Visual Studio 中使用解决方案资源管理器来使用它。 无论您是创建Blazor 应用程序、使用MVC Core还是构建Razor Pages ,IronPDF 都能无缝集成。 您经常会在诸如 static async Task Main 之类的方法中使用 var renderer 和 string url(或文件名)之类的模式,以便直接从输入的 HTML 或 URL 以编程方式保存 PDF

为了方便调试和优化,IronPDF 提供自定义日志记录功能和性能优化指导。 您还可以使用高级功能,例如合并 PDF提取文本和图像解析现有 PDF

立即开始免费试用,将您的 HTML 代码转化为专业的 PDF 文档。 对于生产部署,请浏览我们的许可选项,找到最适合您项目需求的选项。

常见问题解答

如何在 ASP.NET Core 中将 HTML 转换为 PDF?

您可以使用 IronPDF 在 ASP.NET Core 中将 HTML 转换为 PDF。它提供了一个简单的 API,可确保完美的格式和专业的效果。

IronPDF 为何适用于 HTML 到 PDF 的转换?

IronPDF 适用于 HTML 到 PDF 的转换,因为它利用了强大的 Chrome 渲染引擎,确保 PDF 像素般完美,并保持原始布局和风格。

是否可以在 ASP.NET 中使用 IronPDF 生成发票和报告?

是的,IronPDF 可以通过将 HTML 内容转换为格式准确的 PDF 来生成发票和报告,是商业应用的理想选择。

IronPDF 是否支持生成 PDF 的响应式设计?

IronPDF 支持响应式设计,能准确地将 HTML 内容渲染为适应各种设备和屏幕尺寸的 PDF。

IronPDF能够处理复杂的HTML内容吗?

IronPdf 能够处理复杂的 HTML 内容,包括 CSS 和 JavaScript,确保生成的 PDF 与原始网页设计相匹配。

IronPdf 如何确保快速生成 PDF?

IronPDF 利用其高效的 Chrome 渲染引擎确保快速生成 PDF,该引擎可快速准确地处理 HTML,而不会降低 ASP.NET 应用程序的运行速度。

在快节奏的 ASP.NET 环境中使用 IronPDF 有什么好处?

在快节奏的 ASP.NET 环境中,IronPDF 可提供快速、可靠的 HTML 到 PDF 的转换,确保您的应用程序保持高性能并提供专业品质的文档。

IronPdf 是否支持不同的文件格式?

IronPdf 主要侧重于将 HTML 转换为 PDF,但也支持合并、拆分和编辑 PDF,为文档管理提供了一个多功能解决方案。

Curtis Chau
技术作家

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

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