<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: elements</title>
    <description>The latest articles on DEV Community by elements (@sendemail_3943195a45b4c65).</description>
    <link>https://dev.to/sendemail_3943195a45b4c65</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3991387%2F0f12147b-802b-4ba4-b88e-e80a621d18dd.png</url>
      <title>DEV Community: elements</title>
      <link>https://dev.to/sendemail_3943195a45b4c65</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sendemail_3943195a45b4c65"/>
    <language>en</language>
    <item>
      <title>We replaced Chromium with a 1MB HTML-to-PDF library for Azure Functions</title>
      <dc:creator>elements</dc:creator>
      <pubDate>Fri, 17 Jul 2026 16:39:00 +0000</pubDate>
      <link>https://dev.to/sendemail_3943195a45b4c65/we-replaced-chromium-with-a-1mb-html-to-pdf-library-for-azure-functions-5hbg</link>
      <guid>https://dev.to/sendemail_3943195a45b4c65/we-replaced-chromium-with-a-1mb-html-to-pdf-library-for-azure-functions-5hbg</guid>
      <description>&lt;p&gt;Most document-generation infrastructure starts the same way:&lt;/p&gt;

&lt;p&gt;HTML template in, headless browser, PDF out.&lt;/p&gt;

&lt;p&gt;It is a rational default. Browsers are excellent CSS renderers, and no engineering team wants to fund a layout engine just to print invoices.&lt;/p&gt;

&lt;p&gt;But defaults chosen during prototyping can become production liabilities.&lt;/p&gt;

&lt;p&gt;That is the problem I wanted to evaluate with &lt;strong&gt;Bhowra.Ink&lt;/strong&gt;, a Chromium-free HTML-to-PDF renderer for .NET.&lt;/p&gt;

&lt;p&gt;The question was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For static business documents, do we really need to ship a full browser just to generate a PDF?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This post is a technical evaluation of that question.&lt;/p&gt;




&lt;h2&gt;
  
  
  The cost profile of a browser in your PDF pipeline
&lt;/h2&gt;

&lt;p&gt;When a headless browser is used only as a print engine, the cost shows up in four places.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Deployment weight
&lt;/h2&gt;

&lt;p&gt;A browser-based PDF pipeline usually brings hundreds of megabytes of browser binaries into the deployment.&lt;/p&gt;

&lt;p&gt;That is not just an aesthetic problem.&lt;/p&gt;

&lt;p&gt;It affects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build time&lt;/li&gt;
&lt;li&gt;container size&lt;/li&gt;
&lt;li&gt;registry storage&lt;/li&gt;
&lt;li&gt;rollout speed&lt;/li&gt;
&lt;li&gt;cold starts&lt;/li&gt;
&lt;li&gt;vulnerability scanning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a service whose job is to render static invoice HTML, that can feel like too much machinery.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Latency
&lt;/h2&gt;

&lt;p&gt;A browser process has to start before the first byte of PDF exists.&lt;/p&gt;

&lt;p&gt;On long-running servers, that may be acceptable.&lt;/p&gt;

&lt;p&gt;On serverless platforms, cold starts are part of the operating model.&lt;/p&gt;

&lt;p&gt;If PDF generation needs to run inside Azure Functions, AWS Lambda, or short-lived containers, process startup time matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Memory
&lt;/h2&gt;

&lt;p&gt;A browser is designed to render the web.&lt;/p&gt;

&lt;p&gt;That includes JavaScript, layout, painting, networking, fonts, images, security isolation, and many browser APIs.&lt;/p&gt;

&lt;p&gt;For full web-page rendering, that is exactly what you want.&lt;/p&gt;

&lt;p&gt;For static invoices, statements, payslips, and reports, it may be unnecessary overhead.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Security ownership
&lt;/h2&gt;

&lt;p&gt;If Chromium is in your production pipeline, Chromium becomes part of your operational responsibility.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;browser CVEs&lt;/li&gt;
&lt;li&gt;patch cycles&lt;/li&gt;
&lt;li&gt;dependency scanning&lt;/li&gt;
&lt;li&gt;sandbox behavior&lt;/li&gt;
&lt;li&gt;container hardening&lt;/li&gt;
&lt;li&gt;runtime compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For some applications, that trade-off is worth it.&lt;/p&gt;

&lt;p&gt;For static business documents, I wanted to understand whether a smaller rendering stack could be enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  To be clear: browsers are still the right tool sometimes
&lt;/h2&gt;

&lt;p&gt;This is not an argument against browser-based rendering as a category.&lt;/p&gt;

&lt;p&gt;Use Playwright, Puppeteer, or Chromium if your document needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript execution&lt;/li&gt;
&lt;li&gt;SPA rendering&lt;/li&gt;
&lt;li&gt;browser APIs&lt;/li&gt;
&lt;li&gt;canvas output&lt;/li&gt;
&lt;li&gt;client-side chart libraries&lt;/li&gt;
&lt;li&gt;screenshot-like fidelity of a real web page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what browsers are good at.&lt;/p&gt;

&lt;p&gt;But many enterprise PDFs are not web apps.&lt;/p&gt;

&lt;p&gt;They are static, server-rendered documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invoices&lt;/li&gt;
&lt;li&gt;receipts&lt;/li&gt;
&lt;li&gt;statements&lt;/li&gt;
&lt;li&gt;payslips&lt;/li&gt;
&lt;li&gt;reports&lt;/li&gt;
&lt;li&gt;contracts&lt;/li&gt;
&lt;li&gt;certificates&lt;/li&gt;
&lt;li&gt;labels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those documents, a full browser can be overkill.&lt;/p&gt;




&lt;h2&gt;
  
  
  The alternative I evaluated
&lt;/h2&gt;

&lt;p&gt;I wanted to look at a PDF pipeline that behaves like a normal .NET library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package Bhowra.Ink
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Bhowra.Ink&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""
&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Invoice&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;240.00&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="s"&gt;""";
&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HtmlConverter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConvertToBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteAllBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"invoice.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No browser process.&lt;/p&gt;

&lt;p&gt;No Node.js runtime.&lt;/p&gt;

&lt;p&gt;No native interop.&lt;/p&gt;

&lt;p&gt;No sidecar service.&lt;/p&gt;

&lt;p&gt;Just a managed .NET assembly.&lt;/p&gt;

&lt;p&gt;That is the architecture Bhowra.Ink is aiming for.&lt;/p&gt;




&lt;h2&gt;
  
  
  What matters in production-style documents
&lt;/h2&gt;

&lt;p&gt;I do not think PDF renderers should be evaluated only with demo pages.&lt;/p&gt;

&lt;p&gt;The real test is an ugly business document.&lt;/p&gt;

&lt;p&gt;The kind of template that has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nested tables&lt;/li&gt;
&lt;li&gt;logos&lt;/li&gt;
&lt;li&gt;QR codes&lt;/li&gt;
&lt;li&gt;custom fonts&lt;/li&gt;
&lt;li&gt;page breaks&lt;/li&gt;
&lt;li&gt;mixed languages&lt;/li&gt;
&lt;li&gt;right-to-left text&lt;/li&gt;
&lt;li&gt;taxes and totals&lt;/li&gt;
&lt;li&gt;headers and footers&lt;/li&gt;
&lt;li&gt;PDF/A requirements&lt;/li&gt;
&lt;li&gt;repeatable output requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where PDF renderers either earn trust or lose it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Operational footprint
&lt;/h2&gt;

&lt;p&gt;The core idea behind Bhowra.Ink is to keep the rendering stack small.&lt;/p&gt;

&lt;p&gt;It is positioned as a managed .NET library designed to avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chromium&lt;/li&gt;
&lt;li&gt;wkhtmltopdf&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;native binaries&lt;/li&gt;
&lt;li&gt;external rendering processes&lt;/li&gt;
&lt;li&gt;third-party runtime dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters in environments where installing or launching a browser is painful, restricted, or too heavy for the workload.&lt;/p&gt;

&lt;p&gt;A smaller rendering stack also makes audits easier.&lt;/p&gt;

&lt;p&gt;There is less to deploy, less to patch, and less to explain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;The performance target here is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Beat a browser at rendering arbitrary web pages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The target is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Render common business documents fast enough that PDF generation can stay inside normal request/response flows when appropriate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For static HTML invoices and reports, avoiding browser startup can make a meaningful difference.&lt;/p&gt;

&lt;p&gt;Instead of orchestrating a browser process, the application calls a .NET API and receives PDF bytes.&lt;/p&gt;

&lt;p&gt;That changes the architecture.&lt;/p&gt;

&lt;p&gt;In some systems, PDF generation can move from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;queue → worker → browser → storage → callback&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;API → render → return PDF&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That simplification is often more valuable than the raw millisecond number.&lt;/p&gt;




&lt;h2&gt;
  
  
  Determinism
&lt;/h2&gt;

&lt;p&gt;Deterministic output is one of the most important properties for document infrastructure.&lt;/p&gt;

&lt;p&gt;If the same HTML, assets, fonts, and options produce stable output, testing becomes much easier.&lt;/p&gt;

&lt;p&gt;You can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checksum comparisons&lt;/li&gt;
&lt;li&gt;golden-file tests&lt;/li&gt;
&lt;li&gt;visual regression tests&lt;/li&gt;
&lt;li&gt;PDF metadata checks&lt;/li&gt;
&lt;li&gt;CI-based rendering tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful for financial, legal, and compliance documents.&lt;/p&gt;

&lt;p&gt;A PDF renderer should not be a black box that changes output because a browser version changed underneath it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rendering fidelity
&lt;/h2&gt;

&lt;p&gt;The hard part of HTML-to-PDF is not writing a PDF file.&lt;/p&gt;

&lt;p&gt;The hard part is layout.&lt;/p&gt;

&lt;p&gt;Real documents need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tables that paginate correctly&lt;/li&gt;
&lt;li&gt;page breaks that behave&lt;/li&gt;
&lt;li&gt;headers and footers&lt;/li&gt;
&lt;li&gt;repeated table headers&lt;/li&gt;
&lt;li&gt;font embedding&lt;/li&gt;
&lt;li&gt;text extraction&lt;/li&gt;
&lt;li&gt;right-to-left shaping&lt;/li&gt;
&lt;li&gt;predictable spacing&lt;/li&gt;
&lt;li&gt;borders&lt;/li&gt;
&lt;li&gt;images&lt;/li&gt;
&lt;li&gt;QR codes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A renderer aimed at documents does not need to implement the entire modern browser platform.&lt;/p&gt;

&lt;p&gt;But the subset it supports must be reliable for document layouts.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;A browser renderer asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can I render the web?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A document renderer asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can I render this invoice, statement, payslip, report, or contract correctly every time?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Compliance
&lt;/h2&gt;

&lt;p&gt;Business PDFs often have requirements beyond visual appearance.&lt;/p&gt;

&lt;p&gt;They may need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF/A for archiving&lt;/li&gt;
&lt;li&gt;PDF/UA for accessibility&lt;/li&gt;
&lt;li&gt;encryption&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;embedded files&lt;/li&gt;
&lt;li&gt;QR codes&lt;/li&gt;
&lt;li&gt;machine-readable invoice data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E-invoicing makes this even more important.&lt;/p&gt;

&lt;p&gt;Formats such as Factur-X and ZUGFeRD combine a human-readable PDF with embedded structured XML.&lt;/p&gt;

&lt;p&gt;That turns PDF generation into part of the compliance pipeline, not just a print step.&lt;/p&gt;

&lt;p&gt;This is one reason I think invoice generation is a better benchmark than a “Hello World” PDF.&lt;/p&gt;




&lt;h2&gt;
  
  
  E-invoicing and QR codes
&lt;/h2&gt;

&lt;p&gt;Invoices are no longer always just visual documents.&lt;/p&gt;

&lt;p&gt;Depending on the market, they may require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tax QR codes&lt;/li&gt;
&lt;li&gt;embedded XML&lt;/li&gt;
&lt;li&gt;PDF/A-3 output&lt;/li&gt;
&lt;li&gt;archival metadata&lt;/li&gt;
&lt;li&gt;Arabic or Hebrew text&lt;/li&gt;
&lt;li&gt;custom fonts&lt;/li&gt;
&lt;li&gt;predictable text extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For these workflows, the PDF generator has to do more than make something that looks good on screen.&lt;/p&gt;

&lt;p&gt;It has to produce a document that can survive audit, archiving, and machine processing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I would still specify a browser
&lt;/h2&gt;

&lt;p&gt;I would still choose a browser renderer when the input is effectively a web application.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dashboard exports&lt;/li&gt;
&lt;li&gt;JavaScript charts&lt;/li&gt;
&lt;li&gt;SPA pages&lt;/li&gt;
&lt;li&gt;canvas-heavy layouts&lt;/li&gt;
&lt;li&gt;complex CSS dependent on browser behavior&lt;/li&gt;
&lt;li&gt;pages that must match Chrome pixel-for-pixel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not the workload Bhowra.Ink appears to be trying to own.&lt;/p&gt;

&lt;p&gt;The intended workload is static, server-generated HTML for business documents.&lt;/p&gt;




&lt;h2&gt;
  
  
  Known boundaries
&lt;/h2&gt;

&lt;p&gt;Every renderer has boundaries.&lt;/p&gt;

&lt;p&gt;The important thing is to know them before production.&lt;/p&gt;

&lt;p&gt;For this kind of browserless renderer, I would expect teams to check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript is not executed&lt;/li&gt;
&lt;li&gt;CJK fonts should be supplied explicitly by the application&lt;/li&gt;
&lt;li&gt;remote fonts should be embedded or made available locally&lt;/li&gt;
&lt;li&gt;browser APIs are not available&lt;/li&gt;
&lt;li&gt;SPA rendering is not the target use case&lt;/li&gt;
&lt;li&gt;image and CSS support should be tested against real production templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I consider this a strength, not a weakness.&lt;/p&gt;

&lt;p&gt;A production dependency should clearly tell you what it does and does not do.&lt;/p&gt;




&lt;h2&gt;
  
  
  My evaluation standard
&lt;/h2&gt;

&lt;p&gt;I would not choose a PDF engine based on a feature matrix alone.&lt;/p&gt;

&lt;p&gt;I would test it like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take the ugliest real template.&lt;/li&gt;
&lt;li&gt;Include the real fonts and assets.&lt;/li&gt;
&lt;li&gt;Render it on the actual deployment target.&lt;/li&gt;
&lt;li&gt;Check page breaks.&lt;/li&gt;
&lt;li&gt;Check table layout.&lt;/li&gt;
&lt;li&gt;Check text extraction.&lt;/li&gt;
&lt;li&gt;Check QR readability.&lt;/li&gt;
&lt;li&gt;Check PDF size.&lt;/li&gt;
&lt;li&gt;Check render time.&lt;/li&gt;
&lt;li&gt;Run it repeatedly and compare output stability.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An hour with a real invoice tells you more than a week reading marketing pages.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture decision
&lt;/h2&gt;

&lt;p&gt;Browser-based rendering solves one problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Render web pages as PDFs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But many enterprise document pipelines have a different problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Render static business documents reliably in a server-side .NET environment without carrying a browser runtime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For workloads like invoices, reports, statements, payslips, contracts, and e-invoicing documents, a small managed renderer can be the more appropriate architecture.&lt;/p&gt;

&lt;p&gt;Not because browsers are bad.&lt;/p&gt;

&lt;p&gt;Because they solve a larger problem than many document pipelines actually have.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it with your own document
&lt;/h2&gt;

&lt;p&gt;The best test is not a sample.&lt;/p&gt;

&lt;p&gt;It is your document.&lt;/p&gt;

&lt;p&gt;Take one real invoice, report, payslip, or statement.&lt;/p&gt;

&lt;p&gt;Render it.&lt;/p&gt;

&lt;p&gt;Look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;page breaks&lt;/li&gt;
&lt;li&gt;fonts&lt;/li&gt;
&lt;li&gt;borders&lt;/li&gt;
&lt;li&gt;QR codes&lt;/li&gt;
&lt;li&gt;RTL text&lt;/li&gt;
&lt;li&gt;PDF/A requirements&lt;/li&gt;
&lt;li&gt;text extraction&lt;/li&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;li&gt;deployment behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That will tell you quickly whether a browserless renderer fits your workload.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://bhowra.com/bhowra-ink.html" rel="noopener noreferrer"&gt;https://bhowra.com/bhowra-ink.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NuGet: &lt;a href="https://www.nuget.org/packages/Bhowra.Ink/" rel="noopener noreferrer"&gt;https://www.nuget.org/packages/Bhowra.Ink/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Disclosure: I am helping with early feedback for Bhowra.Ink. &lt;/p&gt;

</description>
      <category>pdf</category>
      <category>azure</category>
      <category>serverless</category>
      <category>agpl</category>
    </item>
  </channel>
</rss>
