Эта страница может содержать автоматически переведенный текст.

Сконвертировать HTML в PDF в C# и VB.NET

Если много вашего времени и денег уже потрачено на создание контента в форме HTML, возможно, вам захочется создавать PDF-файлы из этого HTML. Такой подход является естественным направлением для каждого, кто хочет избегать дублирования работы.

Для успешного повторного использования инвестиций конвертация должна производиться программно и полученный PDF-файл должен быть визуально максимально приближен к исходному HTML.

Преобразование HTML в PDF

API для конвертации HTML в PDF в приложениях .NET

Бесплатное дополнение HTML в PDF для библиотеки Docotic.Pdf предоставляет API для таких преобразований. И надстройку, и библиотеку можно использовать из веб-приложений и настольных приложений, созданных для .NET и .NET Core.

Библиотека Docotic.Pdf 9.3.17036-dev Дополнение HTML в PDF 9.3.17036-dev
Регрессионные тесты 14,665 прошло Всего загрузок NuGet 4,191,515

Дополнение представляет собой .NET библиотеку для HTML в PDF, которая использует Chromium во время преобразования. Перед каждой конвертацией, дополнение автоматически проверяет, загружена ли уже последняя поддерживаемая версия Chromium. Любая уже загруженная подходящая версия будет использоваться повторно. Если подходящей версии не найдено, дополнение загружает его перед конвертацией. Ожидается, что процесс конвертации будет иметь такое же соответствие веб-стандартам, как и Google Chrome (R).

Дополнение может генерировать PDF-файлы из HTML в средах Windows, macOS и Linux. Прочитайте, как настроить дополнение в Linux в статье о преобразовании HTML в PDF в Azure.

Дополнение доступно на NuGet, и также включено в zip с двоичными файлами библиотеки. Чтобы попробовать библиотеку без ограничений ознакомительного режима, вы можете получить бесплатный лицензионный ключ с ограниченным сроком действия здесь.

Простое преобразование HTML в PDF на C#:

Используя HTML to PDF API, на C# код преобразования может выглядеть так:

static async Task convertUrlToPdfAsync(string urlString, string pdfFileName)
{
    using (var converter = await HtmlConverter.CreateAsync())
    {
        using (var pdf = await converter.CreatePdfAsync(new Uri(urlString)))
            pdf.Save(pdfFileName);
    }
}

Код довольно прост. Для создания PDF-документа требуется всего два вызова. Как видите, API является асинхронным и вообще не предоставляет синхронных методов.

В случаях, когда вы хотите вызвать API из какого-либо синхронного кода, вы можете использовать следующую обертку:

Task.Run(async () =>
{
    await convertUrlToPdfAsync("https://bitmiracle.com/", "output.pdf");
}).GetAwaiter().GetResult();

Обратите внимание, что в целом не рекомендуется вызывать асинхронные методы синхронно, поэтому используйте обертку только тогда, когда у вас нет другого выбора.

Мы предоставляем примеры кода, показывающие, как использовать API как в синхронных, так и в асинхронных консольных приложениях. Кроме того, существуют примеры кода для приложений Windows Forms и WPF.

Есть также группа примеров HTML в PDF. Каждый пример поставляется в версиях на C# и VB.NET.

Создать PDF-файл из строки или файла с HTML на C# и VB.NET

С помощью API легко преобразовать строку HTML в PDF. Строка может содержать полный HTML-документ или просто фрагмент. Конвертер создаст для вас PDF-файл из HTML-кода.

var html = "<body><br/><br/><br/><h1>Hello, World<h1></body>";
using (var pdf = await converter.CreatePdfFromStringAsync(html))
    pdf.Save("output.pdf");

Вы можете указать базовый URL-адрес для всех относительных ссылок в HTML-коде, который вы собираетесь конвертировать. Вот фрагмент кода, описывающий, как преобразовать HTML в PDF с указанием базового URL-адреса на C#.

var incompleteHtml = "<img src=\"/images/team.svg\"></img>";
var options = new HtmlConversionOptions();
options.Load.BaseUri = new Uri("https://bitmiracle.com/");
using (var pdf = await converter.CreatePdfFromStringAsync(incompleteHtml, options))
    pdf.Save("output.pdf");

Преобразование HTML-файла практически аналогично преобразованию URL-адреса. Просто используйте перегрузку для CreatePdfAsync, которая принимает путь вместо URL-адреса. Базовый URL-адрес и другие параметры также поддерживаются при преобразовании HTML-файла в PDF в коде на C# или VB.NET.

var sampleHtmlPath = @"C:\path\to\sample.html";
using (var pdf = await converter.CreatePdfAsync(sampleHtmlPath))
    pdf.Save("output.pdf");

Вы также можете конвертировать изображения SVG в PDF с помощью API.

Использовать произвольный размер страницы, поля и масштаб

Вы можете настроить любое преобразование HTML в PDF C#, предоставив параметры преобразования в методы для создания PDF.

Вот фрагмент кода, показывающий, как настроить размер, поля и масштаб выходной страницы на C#:

using (var converter = await HtmlConverter.CreateAsync())
{
    var options = new HtmlConversionOptions();

    // вы также можете указать, должна ли ориентация страницы быть альбомной
    // и вы можете указать размер в пунктах или дюймах
    options.Page.SetSize(PdfPaperSize.ItalyEnvelope);

    options.Page.MarginLeft = 10;
    options.Page.MarginTop = 20;
    options.Page.MarginRight = 30;
    options.Page.MarginBottom = 40;

    options.Page.Scale = 1.5;

    using (var pdf = await converter.CreatePdfAsync(url, options))
        pdf.Save("output.pdf");
}

Вы можете указать шаблоны верхнего и нижнего колонтитула, используя параметры страницы. В шаблонах используется обычный HTML-код с поддержкой нескольких переменных. Этими переменными являются date, title, url, pageNumber и totalPages.

Рекомендуется использовать встроенные стили и Data URI для изображений.

Возможно, вы захотите указать верхнее и нижнее поля страницы. Без полей, верхний или нижний колонтитул может быть скрыт содержимым страницы.

Пример Преобразование HTML в PDF с верхним и нижним колонтитулом в C# или VB.NET показывает, как использовать переменные и Data URI в шаблонах.

Преобразование HTML, защищённого паролем, в PDF

Вы можете создать PDF-файл, даже если HTML-страница защищена паролем. Это так же просто, как установка параметров аутентификации внутри HtmlConversionOptions.

var options = new HtmlConversionOptions();
options.Authentication.SetCredentials("foo", "bar");

using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

Также нет проблем, если для правильной работы страницы необходимо настроить некоторые файлы cookie. Просто добавьте эти файлы cookie в параметры. Вот так:

var options = new HtmlConversionOptions();
options.Cookies.Add(new Cookie("sessionID", "my-session-ID"));

using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

Задержать начало конвертации

По умолчанию конвертация начинается сразу после загрузки. Но бывают случаи, когда страница нужно некоторое время, чтобы подготовиться. Например, когда она выполняет некоторые вычисления и обновляет содержимое после того, как эти расчеты будут готовы.

Используя параметры начала преобразования, вы можете отложить преобразование на определенное количество миллисекунд.

// Ждём 10 секунд, прежде чем начать преобразование.
var options = new HtmlConversionOptions();
options.Start.SetStartAfterDelay(10 * 1000);

Иногда требуется запустить скрипт для переключения элементов на загруженной странице или дать загрузиться динамически подгружаемому контенту. Это также возможно:

var options = new HtmlConversionOptions();
var js = @"
    async function scrollDownUntilYouCantAnyMore() {
        await new Promise((resolve, reject) => {
            // опущено для краткости
            }, 400);
        });
    }
    scrollDownUntilYouCantAnyMore();
";
options.Start.SetStartAfterScriptRun(js);
using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

Пример Сконвертировать HTML в PDF после выполнения скрипта на C# или VB.NET содержит полную функцию scrollDownUntilYouCantAnyMore. В примере показано, как выполнить скрипт перед преобразованием HTML в PDF.

Конвертировать HTML в PDF в .NET, игнорируя ошибки SSL

Во время преобразования может произойти ошибка SSL. Такие ошибки обычно случаются из-за самоподписанного сертификата или сертификата, которому не доверяют по какой-либо другой причине. Отозванные сертификаты и сертификаты с истекшим сроком действия могут привести к исключениям во время конвертации HTML в PDF.

Вы можете игнорировать ошибки SSL, если понимаете, почему они происходят, и уверены, что их можно игнорировать. Чтобы игнорировать ошибки SSL во время преобразования HTML в PDF, используйте параметры движка с IgnoreSslErrors = true.

var engineOptions = new HtmlEngineOptions
{
    IgnoreSslErrors = true
};
using (var converter = await HtmlConverter.CreateAsync(engineOptions))
{
    var url = new Uri("https://self-signed.badssl.com/");
    using (var pdf = await converter.CreatePdfAsync(url))
        pdf.Save("output.pdf");
}

Разместить HTML поверх PDF страниц

В некоторых случаях вам может потребоваться преобразовать HTML и поместить результат конвертации поверх некоторых существующих PDF-страниц. Например, если у вас есть изображение формы, вы можете поместить что-нибудь над пустыми местами на этой картинке. Результат будет выглядеть как заполненная форма.

Чтобы поместить сконвертированных HTML поверх существующего содержимого PDF, вам необходимо:

  • создать PDF-страницы с прозрачным фоном из HTML
  • создать XObjects из сконвертированных страниц
  • нарисовать эти XObject на существующих страницах PDF.

Пример Сконвертировать HTML и поместить его поверх существующего содержимого PDF в C# или VB.NET показывает, как выполнить каждый шаг. Пожалуйста, взгляните на этот пример.