【问题标题】:C# PDF Generation (using IronPDF on Azure)C# PDF 生成(在 Azure 上使用 IronPDF)
【发布时间】:2021-09-26 18:35:42
【问题描述】:

我正在使用 IronPDF 作为我们的 PDF 渲染引擎编写的 Azure Web 应用程序中成功生成 PDF 文档。该用例是在 C# 中生成财务报表和发票的 PDF,作为更广泛的封闭业务应用程序的一部分。

在本地开发中一切正常,HTML To PDF 文档生成器功能正是我们所需要的。暂存 PDF 生成器时,我们注意到渲染时间很慢。

 这些有时会导致请求队列中的 PDF 积压,当等待超过 30 秒时,可能会导致 Web 请求超时。我们的代码并不少见,并仔细遵循 Ironpdf C# PDF 创建教程中的步骤:https://ironpdf.com/tutorials/html-to-pdf/

PM> Install-Package IronPdf

var Renderer = new IronPdf.HtmlToPdf();
Renderer.RenderHtmlAsPdf(templateHTML);

templateHTML 对于每个渲染都是唯一的,并且包含指向 CSS 和图像的链接。

我们的开发人员如何提高 PDF 渲染性能并为 IronPdf.HtmlToPdf PDF 生成器类启用多线程?

在 .NET 的 Azure 上使用 IronPdf 在 C# 中生成 PDF 文件是否存在已知限制?

需要明确的是,我并不是在征求有关其他 3rd 方 C# PDF 库的建议,而只是征求如何最好地实施和优化我们选择的解决方案。

在明确的上下文中澄清问题:

  • 哪个 Azure Web 应用程序或功能计划将在 .NET Core 中使用 IronPDF 提供最佳的 HTML 到 PDF 生成性能
  • 如何在 Azure 上使用 IronPDF 同时渲染多个 PDF 文档

【问题讨论】:

  • 请编辑您的问题并包括您的开发人员面临的一些具体问题。否则问题仍然过于宽泛,很可能会被关闭。
  • 按要求编辑 - 感谢 Gaurav Mantri

标签: c# .net azure pdf ironpdf


【解决方案1】:

我作为 QA 工程师在 IronSoftware 工作,我发现自己能够就这个关于 IronPDF Nuget Packages for .NET 的问题提供建议。

哪个 Azure 计划:在 Azure 上呈现 PDF 文件

对于在 Azure 上的 .NET 应用程序中批量生成 Pdf 文件,我强烈建议使用基本 B1 层或更高层,或者高级计划。 Free 和 Shared 层以及 Consumption Plan 不适用于 PDF 渲染。这样做的原因是它使用完整的网络浏览器从 HTML 代码创建 PDF 文件。

我们需要提供足够的资源来处理每个渲染,就像您的浏览器处理任何网页一样——这可能需要一两秒钟。 IronPDF 库适用于 Azure WebApps、Functions 和 WebJobs。它适用于 Linux 和 Windows 变体,尽管我会推荐 Windows 变体 Functions 和 WebApps,因为它们测试得更好并且更容易安装。

这仅仅是因为 Linux 对 .NET 的支持较新。 Windows 历史悠久,更容易为 PDF 生成器用例配置权限!

警告:将 SVG 字体渲染到 PDF 文档中

我们发现,使用 C# 生成 PDF 文件的一个已知限制是 Azure 托管平台不支持在其共享 Web 应用程序层中加载 SVG 字体(例如 Google 字体)的服务器。这是因为出于安全原因,这些共享主机平台不允许访问 Windows GDI+ 图形对象。然而,这些限制在 Linux 或 Docker 容器中的 Windows 中不存在。 Docker 容器是一个不错的选择。

参考:https://ironpdf.com/docs/questions/azure/

多线程 PDF 生成

在编写 IronPdf 时是线程安全的,但不是真正的多线程。

每个 .NET 进程一次只能呈现一个 PDF 文件。直到 2021 年,它一直是 PDF 文档创建性能的一个主要缺点。例如,即使它被并行调用以同时生成 pdf 文档,它也会一个接一个地运行。

// using System.Linq;
// using System.Threading.Tasks;

var Renderer = new IronPdf.HtmlToPdf();
// Where Htmls is an iEnumerable of HTML strings 

Parallel.ForEach(Htmls, html =>  
  {  
   Renderer.RenderHtmlAsPdf(html); 
   // works but not faster than formal foreach 
  }  

更新到 IronPDF 2021.9 及更高版本找到了解决方案:

// PM> Install-Package IronPdf
// using System.Linq;
// using System.Threading.Tasks;IronPdf.Installation.DefaultRenderingEngine = IronPdf.Rendering.PdfRenderingEngine.Chrome;var Renderer = new IronPdf.HtmlToPdf();Parallel.ForEach(Htmls, html =>  
  {  
   Renderer.RenderHtmlAsPdf(html); 
   // works in multiple threads !!
  }  

简而言之:删除旧的 IronPDF Nuget 包并用 IronPDF 2021.9 或更高版本替换它

IronPd 2021.9 是对我们的 .NET PDF 渲染技术的彻底重建:

提供轻松的多线程和异步,使用尽可能多的 CPU 内核。对于 SAAS 和高负载应用,这可能要快一个数量级;优于直接浏览器使用和网络驱动程序。您还可以使用新的 2021 API:

// using IronPdf;
// PM> Install-Package IronPdf
ChromePdfRenderer Renderer = new ChromePdfRenderer();
Renderer.RenderingOptions.FitToPaper = true;
Renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Screen;
Renderer.RenderingOptions.PrintHtmlBackgrounds = true;
Renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
var doc = await Renderer.RenderHtmlAsPdfAsync ("<h1>Hello world!</h1>");

Azure 是新 IronPDF 渲染器的一等公民,它基于最新的“Blink!” HTML字符串到pdf文件渲染!从 Chrome 相同的 PDF 创建或增强的渲染设置中进行选择 - 我们发现它们比 Chrome 更准确且更易于编码。

我们还推荐这条路线,因为它在 C# PDF Generator 中添加了第 508 节可访问性合规性:使用 PDF(UA) 标记的 PDF 标准生成可访问的 PDF。

IronPDF 团队维护并改进了对以下各项的全面支持:.Net 5、Core 和 Framework 4.0+ 支持。我们还在当前版本 (2021.9) 中使用 1156 个绿色单元和集成测试对其进行了测试

【讨论】:

  • 感谢您提供非常详细和快速的回​​复。
  • 我同意 LarryX 在异步方面有一个很好的观点,尽管我不是 Azure 分布式架构方面的专家。 IronPdf 确实具有渲染方法的异步变体,例如此处记录的ironpdf.com/examples/async。我发现对于我的用例,使用 Parallel.ForEach 是批量渲染 Html To PDF 的最高性能策略 - 它比 async 效果更好
  • 我不再需要使用 EAP。 IronPDF 主分支现在支持所有这些:nuget.org/packages/IronPdf。谢谢@darren
  • 遗憾的是,此重构中的回归意味着 IronPDF 不再从 Azure 中的包文件运行,这违反了 Microsoft 的最佳实践建议。
  • Chrome 出于安全和性能原因将每个浏览器隔离在自己的进程中 - 因此,IronPdf 使用的 Chrome 渲染器需要在其自己的部署目录中具有足够的执行权限。 “从包文件运行”将 zip 存档安装为只读环境,这会给 Chrome 渲染器带来一些问题。
【解决方案2】:

通常您希望通过将请求写入存储队列来使其异步,然后立即返回。使用 Azure 函数(高度可扩展)处理来自队列的请求。

根据应用类型,可以使用signalR通道通知UI生成pdf完成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多