Конвертация HTML страницы в PDF документ на C# - это распространённая задача, которая часто используется для создания счетов-фактур, отчётов, договоров и других деловых документов из HTML-шаблонов. Также конвертация HTML страницы в PDF документ на C# имеет важное значение для создания статических, портативных и готовых к печати документов из динамического веб-контента.
В процессе конвертации HTML страницы в PDF документ нужно выполнить следующие шаги:
- Открыть исходный HTML файл и распарсить код HTML страницы.
- Получить CSS- и JavaScript-файлы, которые используются на HTML странице.
- Распарсить CSS-стили, которые используются на HTML странице.
- Распарсить JavaScript-код, который используется на HTML странице.
- Выполнить JavaScript-код и получить результирующий код HTML страницы.
- Создать новый PDF документ.
- Преобразовать растровую и векторную графику на HTML странице (c учетом CSS-стилей и прозрачности) в графику на PDF странице и добавить графику в результирующий PDF документ.
- Преобразовать текст на HTML странице (c учетом CSS-стилей) в текст на PDF странице и добавить текст в результирующий PDF документ.
- Сохранить созданный PDF документ в файл.
Спецификация стандарта HTML5 (
https://html.spec.whatwg.org/print.pdf) содержит 1553 страницы.
Спецификация стандарта CSS2 (
https://www.w3.org/TR/CSS22/css2.pdf) содержит 426 страниц.
Спецификация стандарта JavaScript (
https://ecma-international.org/wp-content/uploads/ECMA-262_16th_edition_june_2025.pdf) содержит 835 страниц.
Шаги процесса конвертации HTML в PDF и информация о спецификациях HTML5, CSS2, JavaScript приведены выше, чтобы стало понятно, что в общем случае конвертация HTML в PDF является очень сложной задачей, если реализовывать данную задачу с нуля.
В тоже время эта сложная задача уже реализована в современных веб браузерах, которые отлично рендерят HTML страницы и могут сохранить загруженную HTML страницу в PDF файл. Поэтому напрашивается вполне резонный вопрос - а можно ли в C# приложении использовать веб браузер для конвертации HTML страницы в PDF документ?
В данной статье мы рассмотрим как в C# приложении абсолютно бесплатно и с максимальным качеством сконвертировать HTML страницу любой сложности в PDF документ с помощью Chromium.
Chromium - это проект веб-браузера с открытым исходным кодом, который в основном используется в качестве основы для большинства современных веб-браузеров, включая Google Chrome, Microsoft Edge, Opera и другие. Он разработан с учетом скорости, безопасности и стабильности, и в его создание внесли значительный вклад разработчики из Google, Microsoft и других компаний.
Конвертация HTML страницы в PDF документ в C# с помощью командной строки Chrome
Самый простой способ для конвертации HTML страницы в PDF документ — это запустить следующую команду Chrome в командной строке:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --headless --disable-gpu —run-all-compositor-stages-before-draw --no-margins --printBackground=true --no-pdf-header-footer --print-to-pdf="D:\result.pdf" "https://www.vintasoft.com/index.html"
Вот краткое описание параметров, которые используются в командной строке Chrome:
- --headless – указывает, что Chrome должен быть запущен без графического интерфейса.
- --disable-gpu — указывает, что нужно отключить GPU во время рендеринга HTML страницы. Данный параметр нужен для совместимости с старыми версиями Chrome.
- --run-all-compositor-stages-before-draw – указывает, что все этапы рендеринга и композиции должны быть завершены до того, как HTML страница будет отрендерена.
- --no-margins — указывает, что исходная HTML страница должна рендериться без отступов.
- --printBackground — указывает, что HTML страница должна содержать фоновую графику.
- --no-pdf-header-footer — указывает, что созданный PDF документ не должен содержать заголовок/подвал с информацией о документе.
- --print-to-pdf — указывает путь к сохраняемому PDF файлу. Путь обязательно должен быть абсолютным.
Указанная выше команда может быть запущена в командной строке Windows/Linux/macOS или запущена из C# кода.
Вот C# код, который демонстрирует как в консольном .NET приложении сконвертировать HTML страницу в PDF документ с помощью Chrome:
using System.Diagnostics;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
string chromePath = @"C:\Program Files\Google\Chrome\Application\chrome.exe";
string sourceUrl = "https://www.vintasoft.com/index.html";
string resultPdfFilePath = @"D:\result.pdf";
string chromeArgsTemplate =
"--headless --no-pdf-header-footer --no-margins --disable-gpu --run-all-compositor-stages-before-draw --printBackground=true --print-to-pdf=\"{0}\" {1}";
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = chromePath,
Arguments = string.Format(chromeArgsTemplate, resultPdfFilePath, sourceUrl),
UseShellExecute = false,
CreateNoWindow = false
};
using (Process process = Process.Start(startInfo))
{
process.WaitForExit();
}
Console.WriteLine("HTML page is converted to the PDF document.");
}
}
}
Данный метод конвертации можно использовать, если на компьютере установлен веб браузер Chrome и вы знаете путь к файлу "chrome.exe".
Созданное .NET приложение имеет маленький размер, потому что не содержит каких-либо дополнительных библиотек и полностью полагается на работу веб браузера Chrome.
Конвертация HTML страницы в PDF документ в C# с помощью nuget-пакета CefSharp.OffScreen
Nuget-пакет CefSharp.OffScreen содержит в себе скомпилированную версию проекта CefSharp и позволяет разработчикам запускать полноценный экземпляр веб браузера Chromium в фоновом режиме без видимого пользовательского интерфейса.
Для использования библиотеки CefSharp.OffScreen в .NET Framework приложении достаточно добавить ссылку на nuget-пакет CefSharp.OffScreen к .NET Framework приложению.
Для использования библиотеки CefSharp.OffScreen в .NET Core приложении достаточно добавить ссылку на nuget-пакет CefSharp.OffScreen.NETCore к .NET Core приложению.
Вот C# код консольного .NET приложения, которое позволяет конвертировать HTML страницу в PDF документ с помощью библиотеки CefSharp.OffScreen:
using CefSharp;
using CefSharp.OffScreen;
using System;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
string sourceUrl = "https://www.vintasoft.com/index.html";
string resultPdfFilePath = @"D:\result.pdf";
Task task = ConvertHtmlToPdfUsingCefSharpOffScreen(sourceUrl, resultPdfFilePath);
task.Wait();
Console.WriteLine("HTML page is converted to the PDF document.");
Console.ReadKey();
}
static async Task ConvertHtmlToPdfUsingCefSharpOffScreen(string url, string pdfPath)
{
// if CEF is not initialized
if (Cef.IsInitialized == null || Cef.IsInitialized == false)
{
// create CEF settings
CefSettings settings = new CefSettings();
// initialize CEF
Cef.Initialize(settings);
}
// create Chromium web browser
using (ChromiumWebBrowser browser = new ChromiumWebBrowser(url))
{
// wait while page will be loaded
await browser.WaitForInitialLoadAsync();
// create PDF print settings
PdfPrintSettings printSettings = new PdfPrintSettings
{
MarginType = CefPdfPrintMarginType.None,
PrintBackground = true,
Landscape = false,
Scale = 1.0,
PreferCssPageSize = true,
DisplayHeaderFooter = false
};
// print web page to a PDF file
await browser.PrintToPdfAsync(pdfPath, printSettings);
}
}
}
}
Данный метод конвертации не зависит от веб браузера Chrome и в данном случае не нужно самостоятельно компилировать CefSharp, потому что это уже сделали создатели nuget-пакета CefSharp.OffScreen.
Созданное .NET приложение является абсолютно автономным и имеет большой размер (чуть больше 300Мб), потому что содержит файлы библиотеки CefSharp.
Конвертация HTML страницы в PDF документ в C# с помощью библиотеки CefSharp
CefSharp это проект с открытым исходным кодом, который предоставляет .NET-обертку для Chromium Embedded Framework (CEF). CefSharp позволяет разработчикам встраивать полнофункциональный веб-браузер на основе Chromium непосредственно в настольные приложения на C# или VB.NET.
Репозиторий с файлами CefSharp находится на GitHub:
https://github.com/cefsharp/cefsharp
Репозиторий содержит 15 проектов в числе которых есть пример консольного приложения, пример WinForms приложения, пример WPF приложения.
Попробуйте запустить пример WPF приложения (проект "CefSharp.Wpf.Example.netcore") и вы увидите WPF приложение с возможностью навигации по страницам как в Chrome. В WPF приложении работает навигация по ссылкам, CSS-стили, JavaScript-код - в общем ощущение как будто находишься в Chrome. В главном меню приложения можно выбрать меню "Tests => Print Current tab to PDF" и сохранить загруженную страницу в PDF файл.
Данный метод конвертации не зависит от веб браузера Chrome, но нужно будет самостоятельно скомпилировать CefSharp из исходных кодов, что делается автоматически при компиляции проекта CefSharp в Visual Studio.
Созданное .NET приложение (проект "CefSharp.Wpf.Example.netcore") является абсолютно автономным и имеет большой размер (чуть больше 400Мб), потому что содержит файлы библиотеки CefSharp.
Обработка PDF документа с помощью VintaSoft Imaging .NET SDK
Компания ВинтаСофт не стала внедрять функционал для конвертации HTML страницы в PDF документ в свои SDK, потому что задача является очень сложной и она уже реализована в современных веб браузерах.
В тоже время
VintaSoft Imaging .NET SDK +
VintaSoft PDF .NET Plug-in позволяет создавать, просматривать, верифицировать, печатать, аннотировать, редактировать, защищать, подписывать, оптимизировать, сжимать, конвертировать, сохранять PDF и PDF/A документы в Windows, Linux, macOS.
Соответственно SDK компании ВинтаСофт можно использовать для обработки созданного PDF документа, а именно:
Подробную информацию о возможностях обработки PDF документа с помощью
VintaSoft Imaging .NET SDK +
VintaSoft PDF .NET Plug-in можно получить здесь:
https://www.vintasoft.ru/vspdf-dotnet-index.html