跳至页脚内容
产品比较

IronPDF vs ExpertPDF:高级.NET开发者应该选择哪个C# PDF库?

IronPDF在使用Chrome V8引擎进行HTML到PDF的转换方面表现出色,并且提供直观的API,而ExpertPDF则为.NET生产系统提供基本的PDF功能,但配置要求更复杂。

C#开发人员在处理PDF时常常面临挑战,无论是读取、写入、创建还是格式之间的转换。 许多库已经出现,以满足这些需求,为C#应用程序提供平滑的集成。 在开发C# PDF报告时,选择合适的库对开发时间和输出质量有重要影响。 对于完整的C#中PDF生成,了解库的能力至关重要。

本文对比了两款.NET开发人员使用的PDF库:

这两个库都提供了在.NET环境中生成、转换和编辑PDF的方法。 关键考虑因素在于确定哪个库最能满足特定项目需求。 此分析突出了基本特征,以辅助决策。 无论是实现HTML到PDF转换PDF编辑功能还是文档组织功能,选择合适的库至关重要。

什么是IronPDF库?

IronPDF提供了一套完整的.NET PDF解决方案,特别对C#开发人员有帮助。 该库可以在C#应用程序中实现所有必要的PDF功能。 支持Azure部署AWS Lambda,该库适合云原生架构。 开发人员可从优秀的Windows支持Linux部署macOS兼容性中获益。 安装概述提供了完整的设置指导。

IronPDF整合了一个.NET Chromium引擎,将HTML内容渲染为PDF,简化了文档设计,而无需复杂的API。HTML到PDF转换器使用HTML5、CSS、JavaScript和图像创建文档。 此外,开发人员可以编辑PDF添加页眉和页脚,以及提取图像。 该库通过可靠的文本提取功能简化了文本读取。 对于生产环境,Chrome渲染引擎确保了准确渲染。

IronPDF 的主要功能是什么?

如何从HTML创建PDF文件?

如何无需Adobe Acrobat Reader编辑PDF?

如何操作PDF文档?

可以转换哪些文件格式为PDF?

如何保存和打印PDF?

什么是ExpertPDF?

访问ExpertPDF官方网站以探索他们的.NET库提供的HTML到PDF转换。 该库无需复杂的报告软件即可生成PDF报告。 对于寻求完整文档API参考的开发人员,考虑使用IronPDF而非ExpertPDF,以获得更丰富的资源。

ExpertPDF提供简明的PDF编辑功能。 HTML到PDF转换器可快速集成到.NET应用程序中。 兼容.NET Framework、.NET Core、.NET 5和.NET 6,但缺乏Linux部署macOS支持。 对于容器化部署,IronPDF提供Docker支持,而ExpertPDF不提供。 IronPDF还支持远程容器部署本地与远程引擎选项

此库可在.NET应用程序中从网页URL或原始HTML标记创建PDF。 对于高级场景,如渲染WebGL网站JavaScript密集型应用程序,IronPDF提供了卓越的渲染能力。 快速入门指南帮助开发人员快速开始。

ExpertPDF的主要功能是什么?

显著功能包括:

  • 将URL网页转换为PDF
  • 将HTML字符串转换为PDF
  • 多种输出文件选项
  • 设置页面边距和大小
  • 设置页眉和页脚
  • 添加自动和自定义分页符
  • 将特定网页部分转换为PDF
  • 在转换过程中隐藏元素
  • 将多个网页合并为单个PDF
  • 转换经过身份验证的网页为PDF
  • 选择CSS媒体类型进行渲染
  • 书签支持
  • 数字签名支持
  • 检索PDF中的HTML元素位置
  • 支持HTML5/CSS3
  • 支持网络字体
  • 文件类型转换:
    • PDF 到文本转换器
    • HTML 到 PDF 转换器
    • HTML 到图像转换器
    • PDF 到图像转换器
    • RTF 到 PDF 转换器

以下部分涵盖:

  1. 创建控制台项目
  2. IronPDF 安装
  3. ExpertPDF \u5b89\u88c5
  4. 从 URL 创建 PDF
  5. 从 HTML 输入字符串创建 PDF
  6. 将多个PDF合并为一个PDF
  7. 将图像转换为 PDF
  8. 许可和定价
  9. 结论

如何创建控制台项目?

按以下步骤使用Visual Studio 2022创建控制台应用程序:

  • 打开 Visual Studio 2022 并点击创建新项目

    Visual Studio 2022欢迎屏幕,暗色主题界面显示四个主要开发选项:为协作项目克隆存储库,打开现有工作项目或解决方案,打开本地文件夹以进行文件探索,并创建新项目以开始新开发

  • 选择 C# 控制台应用并单击下一步

    Visual Studio的创建新项目对话框,展示了各种.NET项目模板,带有跨平台支持指示器,适用于Windows, Linux, 和macOS,特色选项包括控制台应用程序、类库和MSTest测试项目与语言和项目类型过滤器

  • 输入项目名称并点击下一步

    Visual Studio项目配置窗口,显示名为'DemoApp'的跨平台C#控制台应用程序的新设置选项,包含Linux, macOS, Windows和控制台环境的目标选择

  • 选择.NET Framework版本(使用最新的6.0)

    Visual Studio项目创建向导,显示额外信息步骤,选择了控制台应用程序模板并选择了.NET 6.0框架,显示了对C#, Linux, macOS, Windows和控制台应用程序的跨平台支持标签

控制台项目已创建并准备好进行库测试。 两个库在使用前都需要安装。 请参考快速入门指南了解更多详情。 概述文档提供完整信息。

如何安装 IronPDF?

提供多种安装方法:

  1. 使用 Visual Studio
  2. 直接下载 NuGet 包
  3. 下载 IronPDF .DLL 库

请参考安装概述了解更多详情。 该库支持Windows安装程序进行系统范围的部署。 高级选项包括NuGet安装和使用许可证密钥

如何使用Visual Studio进行安装?

Visual Studio提供了NuGet包管理器用于安装包:

  • 通过项目菜单工具访问,或
  • 在解决方案资源管理器中右键单击项目

    Visual Studio解决方案资源管理器上下文菜单,显示多种项目管理选项,并突出显示'管理NuGet包'选项,方便访问包管理功能

    Visual Studio IDE工具菜单展开,显示NuGet包管理器子菜单,包含'为解决方案管理NuGet包'选项,用于集中的依赖管理,适用于解决方案中的所有项目

浏览并安装IronPDF NuGet包。 请参考NuGet安装指南了解更多详情。 平台特定指南包括Android集成F#开发VB.NET使用。 如需故障解决,请参阅NuGet包部署失败指南

如何直接下载NuGet包?

从NuGet网站下载IronPDF:

  • 访问NuGet IronPDF包
  • 选择"下载包"
  • 双击下载的软件包
  • 包自动安装
  • 重新加载Visual Studio

如何下载和安装IronPDF DLL?

IronPDF网站直接下载IronPDF .DLL。 点击下载IronPDF DLL

在项目中引用IronPDF:

  • 在解决方案资源管理器中右键单击解决方案
  • 选择"添加引用"
  • 浏览IronPDF.dll库
  • 点击确定

IronPDF安装完成。 有关额外选项,包括Docker部署远程引擎设置,请参考安装概述。 如需故障排除,请参阅快速故障排除指南或探索初次渲染性能GPU进程优化运行时文件夹指南有助于依赖管理。

如何安装ExpertPDF?

有两种安装方法:

  • 使用Visual Studio NuGet包管理器
  • 下载程序集(较旧的.NET版本)

使用NuGet包管理器为现代.NET框架安装ExpertPDF。 考虑使用IronPDF代替ExpertPDF,可通过高级安装方法包体积优化获得更大的灵活性。

如何使用Visual Studio NuGet包管理器进行安装?

访问NuGet包管理器:

  • 项目菜单工具
  • 在解决方案资源管理器中右键单击项目

    Visual Studio NuGet包管理器界面,显示IronPDF包搜索结果,带有多个库版本、下载次数(主包3.88M次)及适用于各种平台和渲染引擎的安装选项

    Visual Studio解决方案资源管理器上下文菜单,显示附加子菜单中高亮显示的'管理NuGet包'选项,提供快速访问包管理和依赖安装功能

浏览并安装ExpertPDF NuGet包。 为改进设置,请考虑IronPDF的使用声明指南

注意:ExpertPDF仅支持Windows,而IronPDF支持WindowsLinuxmacOS。 对于云部署,IronPDF提供Azure集成AWS Lambda支持。 IronPDF提供完整的性能优化内存管理指导。 对于特定平台,请参阅红帽企业Linux支持AWS Lambda在Amazon Linux 2平台上

如何从URL创建PDF?

两个库都能将HTML转换为PDF。 请参考URL转PDF指南了解更多详情。 复杂网站可能需要自定义渲染延迟JavaScript执行处理。 对于经过身份验证的网站,请参阅TLS网站和系统登录指南。 IronPDF使用Chrome渲染实现像素级精准HTML到PDF转换

IronPDF如何将URL转换为PDF?

IronPDF高效地将URL中的HTML渲染为PDF。 该库为CSSJavaScript图像表单提供高级支持。 使用Chrome渲染引擎确保像素级精准HTML到PDF转换。 如有渲染问题,请参阅像素级精准HTML格式化指南。 高级渲染选项包括自定义纸张尺寸和视图配置JavaScript消息侦听器支持动态内容处理。

此代码示例展示了IronPDF如何让开发人员从网站URL创建PDF。

// Import the IronPdf library
using IronPdf;

// Initialize a new renderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render the specified URL as a PDF
var pdf = renderer.RenderUrlAsPdf("___PROTECTED_URL_190___");
// Save the rendered PDF to a file
pdf.SaveAs("url.pdf");
// Import the IronPdf library
using IronPdf;

// Initialize a new renderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render the specified URL as a PDF
var pdf = renderer.RenderUrlAsPdf("___PROTECTED_URL_190___");
// Save the rendered PDF to a file
pdf.SaveAs("url.pdf");
$vbLabelText   $csharpLabel

对于经过身份验证的URL,请参阅TLS网站和系统登录指南。 为经过身份验证的请求配置cookie自定义HTTP头。 安全站点可能需要Kerberos身份验证。 进行调试时,请使用Chrome调试指南。 其他示例显示将URL转换为PDF

ExpertPDF如何将URL转换为PDF?

ExpertPDF使用savePdfFromUrlToFile方法转换URL,保留页面格式:

// Import the ExpertPdf.HtmlToPdf namespace
using ExpertPdf.HtmlToPdf;

// Initialize a new PdfConverter
PdfConverter pdfConverter = new PdfConverter();
// Use PdfConverter to save a webpage URL directly to a PDF file
pdfConverter.SavePdfFromUrlToFile("___PROTECTED_URL_191___", "output.pdf");
// Import the ExpertPdf.HtmlToPdf namespace
using ExpertPdf.HtmlToPdf;

// Initialize a new PdfConverter
PdfConverter pdfConverter = new PdfConverter();
// Use PdfConverter to save a webpage URL directly to a PDF file
pdfConverter.SavePdfFromUrlToFile("___PROTECTED_URL_191___", "output.pdf");
$vbLabelText   $csharpLabel

幕后,IronPDF利用其Chrome渲染引擎提供更好的HTML5和CSS3支持

如何从HTML输入字符串创建PDF?

两个库都可从HTML字符串创建PDF。 请参考HTML字符串到PDF指南了解更多详情。 使用适用于屏幕和打印的CSS并包含网络字体和图标字体。 IronPDF提供出色的Bootstrap和Flexbox CSS支持。 使用HTML创建PDF示例展示了实际的实现。

IronPDF如何将HTML字符串转换为PDF?

此代码示例展示了IronPDF如何让开发人员从HTML字符串生成PDF文档:

// Import the IronPdf library
using IronPdf;

// Initialize a new renderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render a PDF from HTML string and save it
var pdfDoc1 = renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
pdfDoc1.SaveAs("pixel-perfect.pdf");

// Render HTML with external assets and save it
var pdfDoc2 = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
pdfDoc2.SaveAs("html-with-assets.pdf");
// Import the IronPdf library
using IronPdf;

// Initialize a new renderer
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Render a PDF from HTML string and save it
var pdfDoc1 = renderer.RenderHtmlAsPdf("<h1>Html with CSS and Images</h1>");
pdfDoc1.SaveAs("pixel-perfect.pdf");

// Render HTML with external assets and save it
var pdfDoc2 = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
pdfDoc2.SaveAs("html-with-assets.pdf");
$vbLabelText   $csharpLabel

IronPDF支持基础URL用于相对路径和DataURIs用于嵌入图像。 对于复杂的HTML,请参考HTML文件到PDF指南。 对于特定的视图端口,请参考视图和缩放设置指南。该库无缝处理国际语言和UTF-8。 高级功能包括HTML渲染设置响应式HTML到PDF转换

ExpertPDF如何将HTML字符串转换为PDF?

ExpertPDF HTML To PDF转换器支持HTML字符串转换:

// Import the ExpertPdf.HtmlToPdf namespace
using ExpertPdf.HtmlToPdf;

// Initialize a new PdfConverter
PdfConverter pdfConverter = new PdfConverter();
// Use PdfConverter to save an HTML string to a PDF file
pdfConverter.SavePdfFromHtmlStringToFile("<h1>PDF using Expert PDF</h1>", "html-to-pdf.pdf");
// Import the ExpertPdf.HtmlToPdf namespace
using ExpertPdf.HtmlToPdf;

// Initialize a new PdfConverter
PdfConverter pdfConverter = new PdfConverter();
// Use PdfConverter to save an HTML string to a PDF file
pdfConverter.SavePdfFromHtmlStringToFile("<h1>PDF using Expert PDF</h1>", "html-to-pdf.pdf");
$vbLabelText   $csharpLabel

第一个参数指定HTML字符串,第二个指定输出文件名。 考虑使用IronPDF的Unicode和UTF-8支持,不再使用基本的HTML渲染,以获得更大的国际语言支持。

如何生成技术文档PDF?

技术文档可以从结构化布局和代码示例中获益。 此Bootstrap 5演示展示了IronPDF渲染具有语法高亮和警告的文档的能力。 请参考Bootstrap和Flexbox CSS支持指南了解更多详情。 IronPDF支持字体管理字体字距调整以提供专业排版。 为获得更好的结果,请查看字体故障排除指南国际语言支持

using IronPdf;

var renderer = new ChromePdfRenderer();

string technicalDocs = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='___PROTECTED_URL_192___ rel='stylesheet'>
    <style>
        .code-block { background: #f8f9fa; border-left: 3px solid #0d6efd; padding: 15px; border-radius: 4px; }
        .api-method { font-family: 'Courier New', monospace; color: #0d6efd; }
        @media print { .card, .alert { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-dark text-white'>
                <h2 class='mb-0'>API Reference - HTML to PDF Conversion</h2>
            </div>
            <div class='card-body'>
                <h4>RenderHtmlAsPdf() Method</h4>
                <p class='lead'>Converts HTML content to PDF with full CSS3 and JavaScript support.</p>

                <div class='code-block mb-3'>
                    <code class='api-method'>PdfDocument RenderHtmlAsPdf(string htmlContent)</code>
                </div>

                <div class='row mt-4'>
                    <div class='col-md-6'>
                        <h5 class='text-primary'>Parameters</h5>
                        <table class='table table-sm table-bordered'>
                            <tr>
                                <td><code>htmlContent</code></td>
                                <td>String containing HTML to convert</td>
                            </tr>
                        </table>
                    </div>
                    <div class='col-md-6'>
                        <h5 class='text-success'>Returns</h5>
                        <table class='table table-sm table-bordered'>
                            <tr>
                                <td><code>PdfDocument</code></td>
                                <td>Generated PDF document object</td>
                            </tr>
                        </table>
                    </div>
                </div>
            </div>
        </div>

        <div class='row g-3 mb-4'>
            <div class='col-md-4'>
                <div class='alert alert-success mb-0'>
                    <h6 class='alert-heading'>✓ Supported Features</h6>
                    <ul class='mb-0 small'>
                        <li>HTML5 semantic tags</li>
                        <li>CSS3 with Flexbox/Grid</li>
                        <li>JavaScript execution</li>
                        <li>External stylesheets</li>
                    </ul>
                </div>
            </div>
            <div class='col-md-4'>
                <div class='alert alert-info mb-0'>
                    <h6 class='alert-heading'>ⓘ Rendering Engine</h6>
                    <ul class='mb-0 small'>
                        <li>Chrome V8 Engine</li>
                        <li>98% browser fidelity</li>
                        <li>Sub-second rendering</li>
                        <li>Async/await support</li>
                    </ul>
                </div>
            </div>
            <div class='col-md-4'>
                <div class='alert alert-warning mb-0'>
                    <h6 class='alert-heading'>⚠ ExpertPDF Notes</h6>
                    <ul class='mb-0 small'>
                        <li>Complex API structure</li>
                        <li>Limited CSS3 support</li>
                        <li>No native JavaScript</li>
                        <li>Requires configuration</li>
                    </ul>
                </div>
            </div>
        </div>

        <div class='card shadow-sm'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Code Example Comparison</h5>
            </div>
            <div class='card-body'>
                <div class='row'>
                    <div class='col-md-6'>
                        <h6 class='text-primary'>IronPDF (Simple)</h6>
                        <div class='code-block'>
                            <pre class='mb-0'><code>var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");</code></pre>
                        </div>
                        <div class='badge bg-success mt-2'>3 Lines</div>
                    </div>
                    <div class='col-md-6'>
                        <h6 class='text-warning'>ExpertPDF (Complex)</h6>
                        <div class='code-block'>
                            <pre class='mb-0'><code>var converter = new HtmlToPdfConverter();
converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
converter.NavigationTimeout = 60;
byte[] result = converter.GetPdfBytesFromHtmlString(html);
File.WriteAllBytes("output.pdf", result);</code></pre>
                        </div>
                        <div class='badge bg-warning text-dark mt-2'>5+ Lines</div>
                    </div>
                </div>
            </div>
            <div class='card-footer text-muted'>
                <small><strong>Comparison:</strong> IronPDF provides a more intuitive API with less configuration overhead for common use cases.</small>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(technicalDocs);
pdf.SaveAs("technical-documentation.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string technicalDocs = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='___PROTECTED_URL_192___ rel='stylesheet'>
    <style>
        .code-block { background: #f8f9fa; border-left: 3px solid #0d6efd; padding: 15px; border-radius: 4px; }
        .api-method { font-family: 'Courier New', monospace; color: #0d6efd; }
        @media print { .card, .alert { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-dark text-white'>
                <h2 class='mb-0'>API Reference - HTML to PDF Conversion</h2>
            </div>
            <div class='card-body'>
                <h4>RenderHtmlAsPdf() Method</h4>
                <p class='lead'>Converts HTML content to PDF with full CSS3 and JavaScript support.</p>

                <div class='code-block mb-3'>
                    <code class='api-method'>PdfDocument RenderHtmlAsPdf(string htmlContent)</code>
                </div>

                <div class='row mt-4'>
                    <div class='col-md-6'>
                        <h5 class='text-primary'>Parameters</h5>
                        <table class='table table-sm table-bordered'>
                            <tr>
                                <td><code>htmlContent</code></td>
                                <td>String containing HTML to convert</td>
                            </tr>
                        </table>
                    </div>
                    <div class='col-md-6'>
                        <h5 class='text-success'>Returns</h5>
                        <table class='table table-sm table-bordered'>
                            <tr>
                                <td><code>PdfDocument</code></td>
                                <td>Generated PDF document object</td>
                            </tr>
                        </table>
                    </div>
                </div>
            </div>
        </div>

        <div class='row g-3 mb-4'>
            <div class='col-md-4'>
                <div class='alert alert-success mb-0'>
                    <h6 class='alert-heading'>✓ Supported Features</h6>
                    <ul class='mb-0 small'>
                        <li>HTML5 semantic tags</li>
                        <li>CSS3 with Flexbox/Grid</li>
                        <li>JavaScript execution</li>
                        <li>External stylesheets</li>
                    </ul>
                </div>
            </div>
            <div class='col-md-4'>
                <div class='alert alert-info mb-0'>
                    <h6 class='alert-heading'>ⓘ Rendering Engine</h6>
                    <ul class='mb-0 small'>
                        <li>Chrome V8 Engine</li>
                        <li>98% browser fidelity</li>
                        <li>Sub-second rendering</li>
                        <li>Async/await support</li>
                    </ul>
                </div>
            </div>
            <div class='col-md-4'>
                <div class='alert alert-warning mb-0'>
                    <h6 class='alert-heading'>⚠ ExpertPDF Notes</h6>
                    <ul class='mb-0 small'>
                        <li>Complex API structure</li>
                        <li>Limited CSS3 support</li>
                        <li>No native JavaScript</li>
                        <li>Requires configuration</li>
                    </ul>
                </div>
            </div>
        </div>

        <div class='card shadow-sm'>
            <div class='card-header bg-primary text-white'>
                <h5 class='mb-0'>Code Example Comparison</h5>
            </div>
            <div class='card-body'>
                <div class='row'>
                    <div class='col-md-6'>
                        <h6 class='text-primary'>IronPDF (Simple)</h6>
                        <div class='code-block'>
                            <pre class='mb-0'><code>var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");</code></pre>
                        </div>
                        <div class='badge bg-success mt-2'>3 Lines</div>
                    </div>
                    <div class='col-md-6'>
                        <h6 class='text-warning'>ExpertPDF (Complex)</h6>
                        <div class='code-block'>
                            <pre class='mb-0'><code>var converter = new HtmlToPdfConverter();
converter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
converter.NavigationTimeout = 60;
byte[] result = converter.GetPdfBytesFromHtmlString(html);
File.WriteAllBytes("output.pdf", result);</code></pre>
                        </div>
                        <div class='badge bg-warning text-dark mt-2'>5+ Lines</div>
                    </div>
                </div>
            </div>
            <div class='card-footer text-muted'>
                <small><strong>Comparison:</strong> IronPDF provides a more intuitive API with less configuration overhead for common use cases.</small>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(technicalDocs);
pdf.SaveAs("technical-documentation.pdf");
$vbLabelText   $csharpLabel

Output: 使用Bootstrap 5卡片、警告、表格和代码块的专业技术文档PDF。 IronPDF 准确渲染所有的排版、间距实用程序和网格布局,展示了优越的文档生成能力。

如何创建具有复杂布局的财务报告?

财务报告需要精确的表格格式和计算。 此示例展示了IronPDF如何使用CSS Grid和动态JavaScript渲染复杂的财务布局。 请参考PDF中的JavaScript指南,包括自定义JavaScript执行了解更多详情。 财务文档可能需要PDF压缩进行文件优化和元数据管理以符合法规要求。 在PDF中渲染图表指南有助于数据可视化。

using IronPdf;

var renderer = new ChromePdfRenderer();
// Enable JavaScript for dynamic calculations
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 500; // Allow JS to execute

string financialReport = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        @page { size: A4; margin: 20mm; }
        body { font-family: Arial, sans-serif; line-height: 1.6; }
        .header { text-align: center; margin-bottom: 30px; }
        .financial-grid { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 10px; margin-bottom: 20px; }
        .grid-header { background: #2c3e50; color: white; padding: 10px; font-weight: bold; }
        .grid-row { padding: 10px; border-bottom: 1px solid #ddd; }
        .grid-row:hover { background: #f9f9f9; }
        .amount { text-align: right; font-family: 'Courier New', monospace; }
        .positive { color: #27ae60; }
        .negative { color: #e74c3c; }
        .total-row { background: #ecf0f1; font-weight: bold; margin-top: 10px; }
        .footer-note { font-size: 0.8em; color: #666; margin-top: 30px; text-align: center; }
        @media print { 
            .grid-row:hover { background: transparent; }
            .financial-grid { page-break-inside: avoid; }
        }
    </style>
</head>
<body>
    <div class='header'>
        <h1>Quarterly Financial Report</h1>
        <p>Q4 2023 - Consolidated Statement</p>
    </div>

    <div class='financial-grid'>
        <div class='grid-header'>Revenue Stream</div>
        <div class='grid-header amount'>Q3 2023</div>
        <div class='grid-header amount'>Q4 2023</div>

        <div class='grid-row'>Software Licenses</div>
        <div class='grid-row amount'>$2,150,000</div>
        <div class='grid-row amount positive'>$2,875,000</div>

        <div class='grid-row'>Support Services</div>
        <div class='grid-row amount'>$850,000</div>
        <div class='grid-row amount positive'>$975,000</div>

        <div class='grid-row'>Consulting</div>
        <div class='grid-row amount'>$425,000</div>
        <div class='grid-row amount negative'>$380,000</div>

        <div class='grid-row total-row'>Total Revenue</div>
        <div class='grid-row total-row amount'>$3,425,000</div>
        <div class='grid-row total-row amount positive' id='total'>$4,230,000</div>
    </div>

    <div class='financial-grid'>
        <div class='grid-header'>Operating Expenses</div>
        <div class='grid-header amount'>Q3 2023</div>
        <div class='grid-header amount'>Q4 2023</div>

        <div class='grid-row'>R&D</div>
        <div class='grid-row amount'>$1,200,000</div>
        <div class='grid-row amount'>$1,350,000</div>

        <div class='grid-row'>Sales & Marketing</div>
        <div class='grid-row amount'>$800,000</div>
        <div class='grid-row amount'>$950,000</div>

        <div class='grid-row'>General & Admin</div>
        <div class='grid-row amount'>$400,000</div>
        <div class='grid-row amount'>$425,000</div>

        <div class='grid-row total-row'>Total Expenses</div>
        <div class='grid-row total-row amount'>$2,400,000</div>
        <div class='grid-row total-row amount'>$2,725,000</div>
    </div>

    <script>
        // Calculate growth percentage
        const q3Total = 3425000;
        const q4Total = 4230000;
        const growth = ((q4Total - q3Total) / q3Total * 100).toFixed(1);

        // Add growth indicator
        const totalEl = document.getElementById('total');
        totalEl.innerHTML += ` <small>(+${growth}%)</small>`;
    </script>

    <div class='footer-note'>
        <p>This report was generated using IronPDF's advanced rendering engine.<br>
        All financial figures are in USD. Report generated on: <span id='date'></span></p>
    </div>

    <script>
        document.getElementById('date').textContent = new Date().toLocaleDateString();
    </script>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(financialReport);
pdf.SaveAs("financial-report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
// Enable JavaScript for dynamic calculations
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 500; // Allow JS to execute

string financialReport = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <style>
        @page { size: A4; margin: 20mm; }
        body { font-family: Arial, sans-serif; line-height: 1.6; }
        .header { text-align: center; margin-bottom: 30px; }
        .financial-grid { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 10px; margin-bottom: 20px; }
        .grid-header { background: #2c3e50; color: white; padding: 10px; font-weight: bold; }
        .grid-row { padding: 10px; border-bottom: 1px solid #ddd; }
        .grid-row:hover { background: #f9f9f9; }
        .amount { text-align: right; font-family: 'Courier New', monospace; }
        .positive { color: #27ae60; }
        .negative { color: #e74c3c; }
        .total-row { background: #ecf0f1; font-weight: bold; margin-top: 10px; }
        .footer-note { font-size: 0.8em; color: #666; margin-top: 30px; text-align: center; }
        @media print { 
            .grid-row:hover { background: transparent; }
            .financial-grid { page-break-inside: avoid; }
        }
    </style>
</head>
<body>
    <div class='header'>
        <h1>Quarterly Financial Report</h1>
        <p>Q4 2023 - Consolidated Statement</p>
    </div>

    <div class='financial-grid'>
        <div class='grid-header'>Revenue Stream</div>
        <div class='grid-header amount'>Q3 2023</div>
        <div class='grid-header amount'>Q4 2023</div>

        <div class='grid-row'>Software Licenses</div>
        <div class='grid-row amount'>$2,150,000</div>
        <div class='grid-row amount positive'>$2,875,000</div>

        <div class='grid-row'>Support Services</div>
        <div class='grid-row amount'>$850,000</div>
        <div class='grid-row amount positive'>$975,000</div>

        <div class='grid-row'>Consulting</div>
        <div class='grid-row amount'>$425,000</div>
        <div class='grid-row amount negative'>$380,000</div>

        <div class='grid-row total-row'>Total Revenue</div>
        <div class='grid-row total-row amount'>$3,425,000</div>
        <div class='grid-row total-row amount positive' id='total'>$4,230,000</div>
    </div>

    <div class='financial-grid'>
        <div class='grid-header'>Operating Expenses</div>
        <div class='grid-header amount'>Q3 2023</div>
        <div class='grid-header amount'>Q4 2023</div>

        <div class='grid-row'>R&D</div>
        <div class='grid-row amount'>$1,200,000</div>
        <div class='grid-row amount'>$1,350,000</div>

        <div class='grid-row'>Sales & Marketing</div>
        <div class='grid-row amount'>$800,000</div>
        <div class='grid-row amount'>$950,000</div>

        <div class='grid-row'>General & Admin</div>
        <div class='grid-row amount'>$400,000</div>
        <div class='grid-row amount'>$425,000</div>

        <div class='grid-row total-row'>Total Expenses</div>
        <div class='grid-row total-row amount'>$2,400,000</div>
        <div class='grid-row total-row amount'>$2,725,000</div>
    </div>

    <script>
        // Calculate growth percentage
        const q3Total = 3425000;
        const q4Total = 4230000;
        const growth = ((q4Total - q3Total) / q3Total * 100).toFixed(1);

        // Add growth indicator
        const totalEl = document.getElementById('total');
        totalEl.innerHTML += ` <small>(+${growth}%)</small>`;
    </script>

    <div class='footer-note'>
        <p>This report was generated using IronPDF's advanced rendering engine.<br>
        All financial figures are in USD. Report generated on: <span id='date'></span></p>
    </div>

    <script>
        document.getElementById('date').textContent = new Date().toLocaleDateString();
    </script>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(financialReport);
pdf.SaveAs("financial-report.pdf");
$vbLabelText   $csharpLabel

此代码示例展示了IronPDF如何让开发人员使用CSS Grid布局JavaScript执行针对打印的CSS。 向报告中添加自定义页眉和页脚,实现背景和前景以进行品牌推广,水印用于安全性,数字签名用于身份验证。 请参考生成PDF报告指南了解更多详情。

如何将多个PDF文件合并为一个PDF?

这两个库都能将多个PDF合并为单个文档,便捷的传输。 请参考合并或拆分PDF指南了解更多详情。 多页文档可能需要页面管理拆分多页PDF。 对于大文件性能,考虑使用异步PDF生成并行处理合并两个或多个PDF示例提供了实际的实现。 对于组织PDF,IronPDF提供了完整的工具。

IronPDF如何合并PDF文件?

此代码示例展示了IronPDF如何让开发人员从HTML字符串渲染两个PDF并合并它们。 这直接的方法提供了额外的设置选项。 有关页码分页符的信息,请参阅相应的指南。 此外,在PDF之间复制页面以实现更细化的控制。 有关表单,请参阅表单管理编辑表单文档页码和分页符示例展示了组合实现。

// Import the IronPdf library
using IronPdf;

// Define HTML strings to convert to PDF
var htmlA = @"<p> [PDF_A] </p>
        <p> [PDF_A] 1st Page </p>
        <div style='page-break-after: always;'></div>
        <p> [PDF_A] 2nd Page</p>";

var htmlB = @"<p> [PDF_B] </p>
        <p> [PDF_B] 1st Page </p>
        <div style='page-break-after: always;'></div>
        <p> [PDF_B] 2nd Page</p>";

// Initialize a new renderer
var renderer = new ChromePdfRenderer();

// Render HTML strings as PDFs
var pdfDocA = renderer.RenderHtmlAsPdf(htmlA);
var pdfDocB = renderer.RenderHtmlAsPdf(htmlB);

// Merge the PDF documents
var mergedPdf = PdfDocument.Merge(pdfDocA, pdfDocB);

// Save the merged PDF
mergedPdf.SaveAs("Merged.pdf");
// Import the IronPdf library
using IronPdf;

// Define HTML strings to convert to PDF
var htmlA = @"<p> [PDF_A] </p>
        <p> [PDF_A] 1st Page </p>
        <div style='page-break-after: always;'></div>
        <p> [PDF_A] 2nd Page</p>";

var htmlB = @"<p> [PDF_B] </p>
        <p> [PDF_B] 1st Page </p>
        <div style='page-break-after: always;'></div>
        <p> [PDF_B] 2nd Page</p>";

// Initialize a new renderer
var renderer = new ChromePdfRenderer();

// Render HTML strings as PDFs
var pdfDocA = renderer.RenderHtmlAsPdf(htmlA);
var pdfDocB = renderer.RenderHtmlAsPdf(htmlB);

// Merge the PDF documents
var mergedPdf = PdfDocument.Merge(pdfDocA, pdfDocB);

// Save the merged PDF
mergedPdf.SaveAs("Merged.pdf");
$vbLabelText   $csharpLabel

Merge方法接受多个文件作为Enumerable对象。 请参阅合并PDF的IronPDF代码示例。 有关添加封面或创建目录,请参见专业指南。 还可盖印新内容添加附件拆分PDF并提取页面示例演示了逆向操作。

请注意,包含可编辑表单的合并PDF其表单字段名称附加了索引号。 有关详细信息,请参阅表单数据处理指南。

ExpertPDF如何合并PDF文件?

ExpertPDF使用一个需要单独安装的合并PDF组件。 AppendPDFFile方法将文件附加到PDFMerge对象:

// Import the ExpertPdf.MergePdf namespace
using ExpertPdf.MergePdf;

// Initialize a new PDFMerge object
PDFMerge pdfMerge = new PDFMerge();
// Append PDF files to the merge object
pdfMerge.AppendPDFFile("output.pdf");
pdfMerge.AppendPDFFile("html-to-pdf.pdf");
// Save the merged PDF to a file
pdfMerge.SaveMergedPDFToFile("merged.pdf");
// Import the ExpertPdf.MergePdf namespace
using ExpertPdf.MergePdf;

// Initialize a new PDFMerge object
PDFMerge pdfMerge = new PDFMerge();
// Append PDF files to the merge object
pdfMerge.AppendPDFFile("output.pdf");
pdfMerge.AppendPDFFile("html-to-pdf.pdf");
// Save the merged PDF to a file
pdfMerge.SaveMergedPDFToFile("merged.pdf");
$vbLabelText   $csharpLabel

在后台,IronPDF使用更高效的合并算法。 考虑使用IronPDF的异步PDF生成多线程生成替代同步操作以获得更高性能。

我如何实现带有文档组织的高级PDF合并?

企业应用程序需要在合并PDF时具有书签、页面组织和元数据保留等高级功能。 此示例演示书签管理元数据处理和文档组织。 为确保合规,实施修订历史PDF/A转换PDF/UA可访问性大纲和书签示例提供了更多实现细节。 有关详细信息,请参阅设置和编辑元数据指南元数据可见性故障排除

using IronPdf;
using System.Collections.Generic;
using System.Linq;

public class AdvancedPdfMerger
{
    public static void MergeDocumentsWithBookmarks()
    {
        var renderer = new ChromePdfRenderer();
        var documentsToMerge = new List<PdfDocument>();

        // Create chapter PDFs with proper structure
        string[] chapters = { "Introduction", "Technical Overview", "Implementation", "Conclusion" };

        foreach (var chapter in chapters)
        {
            string html = $@"
                <html>
                <head>
                    <style>
                        body {{ font-family: Georgia, serif; margin: 40px; }}
                        h1 {{ color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }}
                        .chapter-number {{ color: #7f8c8d; font-size: 0.8em; }}
                    </style>
                </head>
                <body>
                    <h1><span class='chapter-number'>Chapter {Array.IndexOf(chapters, chapter) + 1}</span><br>{chapter}</h1>
                    <p>This is the content for the {chapter} chapter. In a real document, this would contain 
                    extensive content, diagrams, and detailed explanations.</p>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor 
                    incididunt ut labore et dolore magna aliqua.</p>
                </body>
                </html>";

            var pdf = renderer.RenderHtmlAsPdf(html);

            // Add metadata to each chapter
            pdf.MetaData.Title = $"Chapter: {chapter}";
            pdf.MetaData.Author = "Technical Documentation Team";
            pdf.MetaData.Subject = "Enterprise PDF Generation";

            documentsToMerge.Add(pdf);
        }

        // Create a table of contents
        string tocHtml = @"
            <html>
            <head>
                <style>
                    body { font-family: Georgia, serif; margin: 40px; }
                    h1 { text-align: center; color: #2c3e50; margin-bottom: 40px; }
                    .toc-entry { margin: 15px 0; font-size: 1.1em; }
                    .toc-entry a { text-decoration: none; color: #3498db; }
                    .page-number { float: right; color: #7f8c8d; }
                </style>
            </head>
            <body>
                <h1>Table of Contents</h1>";

        int pageNumber = 2; // Starting after TOC page
        foreach (var chapter in chapters)
        {
            tocHtml += $@"
                <div class='toc-entry'>
                    <a href='#'>Chapter {Array.IndexOf(chapters, chapter) + 1}: {chapter}</a>
                    <span class='page-number'>{pageNumber}</span>
                </div>";
            pageNumber += 2; // Assuming each chapter is 2 pages
        }

        tocHtml += @"
            </body>
            </html>";

        var tocPdf = renderer.RenderHtmlAsPdf(tocHtml);

        // Merge all documents with TOC first
        var allDocuments = new List<PdfDocument> { tocPdf };
        allDocuments.AddRange(documentsToMerge);

        var finalPdf = PdfDocument.Merge(allDocuments);

        // Add bookmarks for navigation
        finalPdf.BookMarks.AddBookMarkAtStart("Table of Contents", 0);
        int currentPage = 1; // After TOC
        foreach (var chapter in chapters)
        {
            finalPdf.BookMarks.AddBookMarkAtStart($"Chapter {Array.IndexOf(chapters, chapter) + 1}: {chapter}", currentPage);
            currentPage += 2;
        }

        // Set document properties
        finalPdf.MetaData.Title = "Complete Technical Documentation";
        finalPdf.MetaData.Keywords = "IronPDF, Documentation, Enterprise, .NET";
        finalPdf.MetaData.CreationDate = System.DateTime.Now;

        // Add page numbers to footer
        finalPdf.AddTextFooters("Page {page} of {total-pages}", 
            new ChromePdfRenderer.ChromePdfRenderOptions() 
            { 
                MarginBottom = 20,
                MarginLeft = 50,
                MarginRight = 50
            });

        finalPdf.SaveAs("advanced-merged-document.pdf");
    }
}
using IronPdf;
using System.Collections.Generic;
using System.Linq;

public class AdvancedPdfMerger
{
    public static void MergeDocumentsWithBookmarks()
    {
        var renderer = new ChromePdfRenderer();
        var documentsToMerge = new List<PdfDocument>();

        // Create chapter PDFs with proper structure
        string[] chapters = { "Introduction", "Technical Overview", "Implementation", "Conclusion" };

        foreach (var chapter in chapters)
        {
            string html = $@"
                <html>
                <head>
                    <style>
                        body {{ font-family: Georgia, serif; margin: 40px; }}
                        h1 {{ color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }}
                        .chapter-number {{ color: #7f8c8d; font-size: 0.8em; }}
                    </style>
                </head>
                <body>
                    <h1><span class='chapter-number'>Chapter {Array.IndexOf(chapters, chapter) + 1}</span><br>{chapter}</h1>
                    <p>This is the content for the {chapter} chapter. In a real document, this would contain 
                    extensive content, diagrams, and detailed explanations.</p>
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor 
                    incididunt ut labore et dolore magna aliqua.</p>
                </body>
                </html>";

            var pdf = renderer.RenderHtmlAsPdf(html);

            // Add metadata to each chapter
            pdf.MetaData.Title = $"Chapter: {chapter}";
            pdf.MetaData.Author = "Technical Documentation Team";
            pdf.MetaData.Subject = "Enterprise PDF Generation";

            documentsToMerge.Add(pdf);
        }

        // Create a table of contents
        string tocHtml = @"
            <html>
            <head>
                <style>
                    body { font-family: Georgia, serif; margin: 40px; }
                    h1 { text-align: center; color: #2c3e50; margin-bottom: 40px; }
                    .toc-entry { margin: 15px 0; font-size: 1.1em; }
                    .toc-entry a { text-decoration: none; color: #3498db; }
                    .page-number { float: right; color: #7f8c8d; }
                </style>
            </head>
            <body>
                <h1>Table of Contents</h1>";

        int pageNumber = 2; // Starting after TOC page
        foreach (var chapter in chapters)
        {
            tocHtml += $@"
                <div class='toc-entry'>
                    <a href='#'>Chapter {Array.IndexOf(chapters, chapter) + 1}: {chapter}</a>
                    <span class='page-number'>{pageNumber}</span>
                </div>";
            pageNumber += 2; // Assuming each chapter is 2 pages
        }

        tocHtml += @"
            </body>
            </html>";

        var tocPdf = renderer.RenderHtmlAsPdf(tocHtml);

        // Merge all documents with TOC first
        var allDocuments = new List<PdfDocument> { tocPdf };
        allDocuments.AddRange(documentsToMerge);

        var finalPdf = PdfDocument.Merge(allDocuments);

        // Add bookmarks for navigation
        finalPdf.BookMarks.AddBookMarkAtStart("Table of Contents", 0);
        int currentPage = 1; // After TOC
        foreach (var chapter in chapters)
        {
            finalPdf.BookMarks.AddBookMarkAtStart($"Chapter {Array.IndexOf(chapters, chapter) + 1}: {chapter}", currentPage);
            currentPage += 2;
        }

        // Set document properties
        finalPdf.MetaData.Title = "Complete Technical Documentation";
        finalPdf.MetaData.Keywords = "IronPDF, Documentation, Enterprise, .NET";
        finalPdf.MetaData.CreationDate = System.DateTime.Now;

        // Add page numbers to footer
        finalPdf.AddTextFooters("Page {page} of {total-pages}", 
            new ChromePdfRenderer.ChromePdfRenderOptions() 
            { 
                MarginBottom = 20,
                MarginLeft = 50,
                MarginRight = 50
            });

        finalPdf.SaveAs("advanced-merged-document.pdf");
    }
}
$vbLabelText   $csharpLabel

此高级实现演示书签管理元数据处理页码编排。 有关详情,请参阅组织PDF教程。 在合并后探索PDF压缩技术。 为了安全起见,实施密码保护加密添加经典文本页眉和页脚示例提供了格式选项。 有关其他功能,请查看添加页码添加目录指南。 密码、安全性和元数据示例展示了集成的实现。

如何将图像转换为PDF?

IronPDF将各种图像转换为PDF,这是ExpertPDF不具备的功能。 但是,ExpertPDF可以从PDF中提取图像,并将PDF转换为图像,这也是IronPDF的功能。 请参阅图像到PDF指南以获取更多信息。 IronPDF支持将PDF栅格化为图像提取文本和图像。 对于高级场景,可绘制文本和位图绘制线条和矩形图像到PDF示例演示了实用的实现。 关于图像质量,请参见C# PDF到图像不损失质量示例

IronPDF如何将图像转换为PDF?

从图像创建PDF使用ImageToPdfConverter类。 图片可以从任何文件夹加载,支持包括多页TIFF文件在内的多种格式。 同时可将图像添加到现有的PDF或使用SVG图形。 为了内存效率,使用使用MemoryStream将PDF栅格化为图像自定义PDF尺寸示例有助于版面控制。

// Import the IronPdf namespace
using IronPdf;

// Specify the folder containing the image files
var imageFiles = System.IO.Directory.EnumerateFiles(@"C:\project\assets")
                  .Where(file => file.EndsWith(".jpg") || file.EndsWith(".jpeg"));

// Convert the images to a PDF document
var pdfDocument = ImageToPdfConverter.ImageToPdf(imageFiles);
// Save the PDF document
pdfDocument.SaveAs(@"C:\project\composite.pdf");
// Import the IronPdf namespace
using IronPdf;

// Specify the folder containing the image files
var imageFiles = System.IO.Directory.EnumerateFiles(@"C:\project\assets")
                  .Where(file => file.EndsWith(".jpg") || file.EndsWith(".jpeg"));

// Convert the images to a PDF document
var pdfDocument = ImageToPdfConverter.ImageToPdf(imageFiles);
// Save the PDF document
pdfDocument.SaveAs(@"C:\project\composite.pdf");
$vbLabelText   $csharpLabel

除了将图像转换为PDF之外,IronPDF通过将其栅格化为图像来将扫描文档和商业文档转换为图像。 该库还可以提取图像,来自各种文件类型。有关内存操作的信息,请参阅使用MemoryStream将PDF栅格化为图像的指南。 对于大图像,请考虑ImageToPDF文件大小优化纵向和横向方向示例帮助进行页面设置。有关高级图像处理,请参阅嵌入位图和图像示例

如何创建具有版面控制的高级图像到PDF转换?

为了控制图像放置和专业版面,此照片集示例演示了嵌入图像和创建布局。 关于云存储,请参阅Azure Blob Storage图像指南设置灰度示例展示了图像处理选项:

using IronPdf;
using System.IO;

public class PhotoAlbumCreator
{
    public static void CreatePhotoAlbum(string imagesFolder, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;

        string htmlContent = @"
            <!DOCTYPE html>
            <html>
            <head>
                <style>
                    body { font-family: Arial, sans-serif; }
                    .album-title { text-align: center; font-size: 2em; margin-bottom: 30px; color: #2c3e50; }
                    .photo-container { margin-bottom: 30px; text-align: center; page-break-inside: avoid; }
                    .photo { max-width: 100%; max-height: 500px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
                    .caption { margin-top: 10px; font-style: italic; color: #666; }
                    .page-break { page-break-after: always; }
                </style>
            </head>
            <body>
                <h1 class='album-title'>My Photo Album</h1>";

        var imageFiles = Directory.GetFiles(imagesFolder, "*.*")
            .Where(file => new[] { ".jpg", ".jpeg", ".png", ".gif" }
            .Contains(Path.GetExtension(file).ToLower()))
            .ToList();

        for (int i = 0; i < imageFiles.Count; i++)
        {
            string base64Image = Convert.ToBase64String(File.ReadAllBytes(imageFiles[i]));
            string fileName = Path.GetFileNameWithoutExtension(imageFiles[i]);

            htmlContent += $@"
                <div class='photo-container'>
                    <img class='photo' src='data:image/jpeg;base64,{base64Image}' alt='{fileName}'>
                    <div class='caption'>Photo {i + 1}: {fileName}</div>
                </div>";

            // Add page break every 2 photos
            if ((i + 1) % 2 == 0 && i < imageFiles.Count - 1)
            {
                htmlContent += "<div class='page-break'></div>";
            }
        }

        htmlContent += @"
                <div style='text-align: center; margin-top: 40px; color: #999;'>
                    <small>Created with IronPDF - Total Photos: " + imageFiles.Count + @"</small>
                </div>
            </body>
            </html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs(outputPath);
    }
}

// Usage
PhotoAlbumCreator.CreatePhotoAlbum(@"C:\MyPhotos", @"C:\MyPhotoAlbum.pdf");
using IronPdf;
using System.IO;

public class PhotoAlbumCreator
{
    public static void CreatePhotoAlbum(string imagesFolder, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;

        string htmlContent = @"
            <!DOCTYPE html>
            <html>
            <head>
                <style>
                    body { font-family: Arial, sans-serif; }
                    .album-title { text-align: center; font-size: 2em; margin-bottom: 30px; color: #2c3e50; }
                    .photo-container { margin-bottom: 30px; text-align: center; page-break-inside: avoid; }
                    .photo { max-width: 100%; max-height: 500px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }
                    .caption { margin-top: 10px; font-style: italic; color: #666; }
                    .page-break { page-break-after: always; }
                </style>
            </head>
            <body>
                <h1 class='album-title'>My Photo Album</h1>";

        var imageFiles = Directory.GetFiles(imagesFolder, "*.*")
            .Where(file => new[] { ".jpg", ".jpeg", ".png", ".gif" }
            .Contains(Path.GetExtension(file).ToLower()))
            .ToList();

        for (int i = 0; i < imageFiles.Count; i++)
        {
            string base64Image = Convert.ToBase64String(File.ReadAllBytes(imageFiles[i]));
            string fileName = Path.GetFileNameWithoutExtension(imageFiles[i]);

            htmlContent += $@"
                <div class='photo-container'>
                    <img class='photo' src='data:image/jpeg;base64,{base64Image}' alt='{fileName}'>
                    <div class='caption'>Photo {i + 1}: {fileName}</div>
                </div>";

            // Add page break every 2 photos
            if ((i + 1) % 2 == 0 && i < imageFiles.Count - 1)
            {
                htmlContent += "<div class='page-break'></div>";
            }
        }

        htmlContent += @"
                <div style='text-align: center; margin-top: 40px; color: #999;'>
                    <small>Created with IronPDF - Total Photos: " + imageFiles.Count + @"</small>
                </div>
            </body>
            </html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs(outputPath);
    }
}

// Usage
PhotoAlbumCreator.CreatePhotoAlbum(@"C:\MyPhotos", @"C:\MyPhotoAlbum.pdf");
$vbLabelText   $csharpLabel

此代码示例展示了如何使用IronPDF让开发者实现使用DataURI嵌入图像、管理分页符以及创建专业布局。 有关云图像,请参阅Azure Blob Storage图像指南。 对于大文件,考虑ImageToPDF文件大小优化。 还可缩放PDF对象翻译PDF对象以实现精准定位。 将PDF导出到内存的示例帮助进行内存高效的工作流程。 请参阅高效添加HTML内容指南以进行批处理。

有什么许可和定价选项?

IronPDF是可在IronPDF网站上获得的商业C# PDF库。私人开发免费,商业用途有许可证。 有多种许可证可用,适用于单个项目、开发者、机构和企业。 支持SaaS和OEM再分发。 有关实施的细节,请参阅许可证密钥指南。 在部署时,请妥善应用许可证密钥。 对于Web应用程序,请在Web.config中设置许可证密钥。 对于许可证服务器连接问题,请参考故障排除指南。使用许可证密钥指南提供完整的实施细节。

Visual Studio IDE工具菜单显示NuGet Package Manager选项,包括Package Manager Console和管理NuGet Packages for Solution,为.NET开发项目提供集中依赖管理

所有许可证均包括30天退款保证、一年支持和产品更新。 永久许可证要求一次性购买,无需额外费用。 单个开发者/项目的Lite包从$799起。 有关第一年后支持,请参阅许可证延长。 要升级以获得更多功能或部署,请查看许可证升级。 有关IronPDF和IIS的部署或将IronPDF添加到软件安装程序的信息,请参见专业指南。 ClickOnce版本不兼容指南有助于解决部署问题。

ExpertPDF提供按开发者或公司许可证。 免费试用ExpertPDF。 查看下面的许可证功能。 考虑使用IronPDF的透明许可选项替代ExpertPDF以获取更高的价值和完整的支持。

NuGet Package Manager界面显示六个ExpertPDF库及其下载统计,显示HTML到PDF转换器(145K次下载)和各种专门的PDF操作工具,版本均为11.0.2.0

ExpertComponents工具包总计开发者许可证起价$850,ExpertPDF工具包起价$750。单独购买组件。 查看ExpertPDF完整定价。 对于企业需求,IronPDF的许可提供更高的价值和完整的功能集合。

我应该选择哪个PDF库?

IronPDF在本地渲染HTML到PDF,无需互联网连接,模拟符合标准的网络浏览器。 HTML渲染产生精确的、矢量格式的输出,适用于商业打印。 有透明定价的商业用途许可证。 对于企业部署,IronPDF提供Docker支持远程引擎能力。 请参阅指南远程容器运行IronPDF本地与远程引擎选项。 该库提供IronPdf.Slim以减少部署体积,并支持包大小优化IronPdf.Slim v2025.5.6部署异常指南有助于解决特定版本问题。

ExpertPDF的HTML到PDF转换器库将网页和HTML转换为PDF,从ASP.NET生成报告,并以电子方式签署合同。 免费使用带有许可的附加功能。 与IronPDF对包括Android部署的完整平台支持不同,ExpertPDF仅限于Windows平台。 在后台,IronPDF使用高级安全功能和定期产品更新里程碑概览展示了包括Chrome渲染里程碑兼容性里程碑稳定性和性能里程碑在内的持续改进。

虽然两个库都可以处理PDF并从流行格式转换,但IronPDF具有比ExpertPDF更大的优势。 IronPDF支持从更广泛的格式范围转换,包括XML、图像、AngularJSMarkdownRTF,具有可靠的PDF生成、格式化和编辑功能。 这可确保开发人员在实际开发中实现高效。 该库在性能提升方面表现出色,具有高通量场景的异步支持。 对于并发处理,IronPDF支持并行PDF生成多线程生成。 有关优化细节,请参阅初始渲染缓慢故障排除指南

ExpertPDF需要单独的组件安装,而IronPDF集成了所有功能。 当项目需要完整的PDF功能时,这尤为有用。 IronPDF软件包提供终身许可证,无需持续费用,而ExpertPDF则需要续订。 此外,IronPDF提供完整的文档API参考代码示例以实现快速启动。 演示部分展示了实际的实现。 如需故障排除,请参阅快速故障排除指南或探索初次渲染性能GPU进程优化获取最佳支持指南确保有效的问题解决。

对于生产部署,IronPDF提供卓越的调试能力自定义日志记录和广泛的故障排除指南。 该库支持高级功能:PDF/A合规性PDF/UA可访问性HSM数字签名清除以确保安全处理。 对于企业安全性,IronPDF提供加密和解密密码保护和完整的安全功能。 高级功能包括编辑文本压平PDF管理PDF版本将PDF转换为base64指南帮助进行数据传输。

关于支持和开发,IronPDF提供工程支持,并附有详细指南制作支持请求。 库产品更新里程碑展示了持续改进。 对于.NET MAUI开发者,IronPDF提供PDF查看功能XAML到PDF转换。 Blazor开发者使用Blazor Server集成Razor到PDF转换。 该库支持MVC应用程序的CSHTML到PDF转换无头CSHTML渲染。 请参阅Blazor Server / WebAssembly指南了解限制。

对于专用用途,IronPDF在OpenAI智能处理集成在PDF中呈现图表、MVC应用中的CSHTML到PDF转换以及对国际语言和UTF-8的支持方面表现优秀。 该库处理复杂场景:压平PDF线性化以便于快速网络查看创建PDF表单。 探索转换PDF页面删除PDF对象设置自定义临时路径。 IronPDF的完整功能概览展示了创建PDF转换PDF编辑PDF组织PDF保护PDF的能力。 附加功能包括在C#中读取PDF文件文本查找和替换以及删除特定PDF页面

关于部署注意事项,请参阅在本地机器上调试Azure FunctionsAzure日志文件管理AWS日志文件处理以及502错误网关解决方案。 IronPDF提供全面的错误处理,包括路径访问被拒解决方案Chrome依赖项部署PDFium依赖项部署不良分配错误解决方案。 平台特定支持包括Linux特定指南macOS本机异常Windows Nano Server限制。 安全功能包括Log4j漏洞状态和防止AWS Lambda上的内存段错误

请注意ExpertPDF 是其各自所有者的注册商标。 此网站与 ExpertPDF 无关,不受其赞助或认可。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。)}]

常见问题解答

如何在C#中将HTML转换为PDF?

你可以使用IronPDF的RenderHtmlAsPdf方法将HTML字符串转换为PDF。你还可以使用RenderHtmlFileAsPdf将HTML文件转换为PDF。

IronPDF和ExpertPDF之间的主要区别是什么?

IronPDF提供更广泛的格式支持和集成功能,包括从HTML创建PDF、编辑和格式转换。ExpertPDF提供简单的HTML到PDF转换,并具有输出文件配置和数字签名选项。

我可以使用这些库从PDF中提取文本和图像吗?

是的,IronPDF允许您从PDF文档中提取文本和图像,使在.NET应用程序中处理和分析PDF内容变得轻松。

这些PDF库有哪些安装选项?

IronPDF和ExpertPDF都可以使用Visual Studio的NuGet包管理器安装。此外,IronPDF的.DLL库可以直接从IronPDF网站下载。

是否可以将多个PDF文件合并成一个文档?

是的,IronPDF提供一个合并方法来将多个PDF合成一个文档。ExpertPDF也提供了一个PDFMerge组件来合并PDF。

IronPDF需要通过互联网连接才能进行HTML到PDF转换吗?

不,IronPDF不需要通过互联网连接进行HTML到PDF转换,这使其成为离线应用程序的可靠选项。

IronPDF有哪些许可选项?

IronPDF提供多种许可选项,包括单个项目、开发者、代理商和企业许可。所有许可都是永久的,并包括30天退款保证和一年的支持和更新。

ExpertPDF可以处理PDF文档的数字签名吗?

是的,ExpertPDF支持PDF文档的数字签名,允许生成安全和经过认证的PDF文件。

C#开发者在处理PDF时面临哪些挑战,这些库如何帮助解决?

C#开发者在读取、写入、创建和转换PDF时经常面临挑战。像IronPDF和ExpertPDF这样的库通过提供强大的HTML到PDF转换、PDF编辑等工具简化了这些任务,便于轻松集成到C#应用程序中。

Curtis Chau
技术作家

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

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

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me