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

Обзор

Эта статья объясняет, как преобразовать HTML в PDF с помощью C#. Рассматриваются следующие темы.

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

Aspose.PDF for .NET — это API для работы с PDF, позволяющее без проблем преобразовывать любые существующие HTML‑документы в PDF. Процесс преобразования HTML в PDF можно гибко настраивать.

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

Следующий пример кода на C# показывает, как преобразовать HTML‑документ в PDF.

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

  1. Создайте экземпляр класса HtmlLoadOptions.
  2. Инициализируйте объект Document.
  3. Сохраните полученный PDF‑документ, вызвав метод Document.Save().
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Load the HTML file into a document using HtmlLoadOptions
    var options = new Aspose.Pdf.HtmlLoadOptions();

    // Open HTML document
    using (var document = new Aspose.Pdf.Document(dataDir + "test.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "ConvertHTMLtoPDF_out.pdf");
    }
}

Расширенное преобразование HTML в PDF

Движок преобразования HTML имеет несколько параметров, позволяющих контролировать процесс конвертации.

Поддержка медиазапросов

Медиазапросы — популярный приём для предоставления адаптированных таблиц стилей различным устройствам. Мы можем задать тип устройства с помощью свойства HtmlMediaType.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFAdvancedMediaType()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Load the HTML file into a document using HtmlLoadOptions with Print media type
    var options = new HtmlLoadOptions
    {
        // Set Print or Screen mode
        HtmlMediaType = Aspose.Pdf.HtmlMediaType.Print
    };

    // Open HTML document
    using (var document = new Aspose.Pdf.Document(dataDir + "test.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "ConvertHTMLtoPDFAdvancedMediaType_out.pdf");
    }
}

Включить (отключить) встраивание шрифтов

HTML‑страницы часто используют шрифты (например, шрифты из локальной папки, Google Fonts и т.д.). Мы также можем управлять встраиванием шрифтов в документ с помощью свойства IsEmbedFonts.

 // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
 private static void ConvertHTMLtoPDFAdvancedEmbedFonts()
 {
     // The path to the documents directory
     var dataDir = RunExamples.GetDataDir_AsposePdf();

     // Load the HTML file into a document using HtmlLoadOptions with the font embedding option set
     var options = new Aspose.Pdf.HtmlLoadOptions
     {
         // Disable font embedding
         IsEmbedFonts = false
     };

     // Open HTML document
     using (var document = new Aspose.Pdf.Document(dataDir + "test_fonts.html", options))
     {
         // Save PDF document
         document.Save(dataDir + "ConvertHTMLtoPDFAdvanced_EmbedFonts_out.pdf");
     }
 }

Управление загрузкой внешних ресурсов

Движок преобразования предоставляет механизм, позволяющий контролировать загрузку определённых ресурсов, связанных с HTML‑документом.
Класс HtmlLoadOptions имеет свойство CustomLoaderOfExternalResources, с помощью которого можно задать поведение загрузчика ресурсов.
Предположим, что нам нужно заменить все PNG‑изображения одним изображением test.jpg и заменить внешние URL‑адреса внутренними для остальных ресурсов.
Для этого мы можем определить пользовательский загрузчик SamePictureLoader и указать CustomLoaderOfExternalResources на это имя.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFAdvanced_DummyImage()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Load the HTML file into a document with a custom resource loader for external images
    var options = new Aspose.Pdf.HtmlLoadOptions
    {
        CustomLoaderOfExternalResources = SamePictureLoader
    };

    // Open HTML document
    using (var document = new Aspose.Pdf.Document(dataDir + "test.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "html_test.pdf");
    }
}

private static Aspose.Pdf.LoadOptions.ResourceLoadingResult SamePictureLoader(string resourceURI)
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();
    Aspose.Pdf.LoadOptions.ResourceLoadingResult result;

    if (resourceURI.EndsWith(".png"))
    {
        byte[] resultBytes = File.ReadAllBytes(dataDir + "test.jpg");
        result = new Aspose.Pdf.LoadOptions.ResourceLoadingResult(resultBytes)
        {
            // Set MIME Type
            MIMETypeIfKnown = "image/jpeg"
        };
    }
    else
    {
        result = new Aspose.Pdf.LoadOptions.ResourceLoadingResult(GetContentFromUrl(resourceURI));
    }
    return result;
}

private static byte[] GetContentFromUrl(string url)
{
    var httpClient = new System.Net.Http.HttpClient();
    return httpClient.GetByteArrayAsync(url).GetAwaiter().GetResult();
}

Вывод всего HTML‑содержимого на одну страницу

Aspose.PDF for .NET предоставляет возможность выводить всё содержимое на одной странице при преобразовании HTML‑файла в PDF. Например, если у вас есть HTML‑контент, размер вывода которого превышает одну страницу, вы можете воспользоваться опцией вывода данных в один PDF‑лист. Чтобы включить эту опцию, в класс HtmlLoadOptions был добавлен флаг IsRenderToSinglePage. Ниже показан фрагмент кода, демонстрирующий использование этой функции.

 // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
 private static void ConvertHTMLtoPDFAdvancedSinglePageRendering()
 {
     // The path to the documents directory
     var dataDir = RunExamples.GetDataDir_AsposePdf();

     // Initialize HtmlLoadOptions
     var options = new Aspose.Pdf.HtmlLoadOptions
     {
         // Set Render to single page property
         IsRenderToSinglePage = true
     };

     // Open PDF document
     using (var document = new Aspose.Pdf.Document(dataDir + "HTMLToPDF.html", options))
     {
         // Save PDF document
         document.Save(dataDir + "RenderContentToSamePage_out.pdf");
     }
 }

Рендеринг HTML с данными SVG

Aspose.PDF for .NET позволяет преобразовать HTML‑страницу в PDF‑документ. Поскольку HTML допускает добавление SVG‑элементов в виде тегов на странице, Aspose.PDF также поддерживает преобразование таких данных в результирующий PDF‑файл. Следующий фрагмент кода показывает, как преобразовать HTML‑файлы с SVG‑тегами в PDF‑документы с тегами.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFWithSVG()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Initialize HtmlLoadOptions
    var options = new Aspose.Pdf.HtmlLoadOptions(Path.GetDirectoryName(dataDir + "HTMLSVG.html"));

    // Initialize Document object
    using (var document = new Aspose.Pdf.Document(dataDir + "HTMLSVG.html", options))
    {
        // Save PDF document
        document.Save(dataDir + "RenderHTMLwithSVGData_out.pdf");
    }
}

Создание логической структуры из HTML‑тегов

Для соответствия требованиям доступности PDF‑документ должен включать логические элементы структуры, определяющие порядок чтения, предоставляющие альтернативный текст для скрин‑ридеров и описывающие иллюстративные части документа, а также разметку иерархии его содержимого.

Многие HTML‑документы уже содержат такой тип логической структуры. Aspose.PDF может сохранять и переносить её в PDF во время преобразования HTML‑в‑PDF.

Установите свойство HtmlLoadOptions.CreateLogicalStructure в true, чтобы воспроизвести структуру исходного HTML‑документа с помощью логических элементов структуры PDF.

Преобразование веб‑страницы в PDF

Преобразование веб‑страницы немного отличается от преобразования локального HTML‑документа. Чтобы преобразовать содержимое веб‑страницы в PDF, можно сначала получить HTML‑содержимое с помощью экземпляра HttpClient, создать объект Stream, передать содержимое объекту Document и отрендерить результат в PDF.

При преобразовании веб‑страницы, размещённой на веб‑сервере, в PDF:

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

  1. Считайте содержимое страницы с помощью объекта HttpClient.
  2. Создайте объект HtmlLoadOptions и задайте базовый URL.
  3. Инициализируйте объект Document, передав ему объект потока.
  4. При необходимости задайте размер и/или ориентацию страницы.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertHTMLtoPDFAdvanced_WebPage()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    const string url = "https://en.wikipedia.org/wiki/Aspose_API";

    // Set page size A3 and Landscape orientation;   
    var options = new Aspose.Pdf.HtmlLoadOptions(url)
    {
        PageInfo =
        {
            Width = 842,
            Height = 1191,
            IsLandscape = true
        }
    };

    // Load the web page content as a stream and create a PDF document
    using (var document = new Aspose.Pdf.Document(GetContentFromUrlAsStream(url), options))
    {
        // Save PDF document
        document.Save(dataDir + "html_test.pdf");
    }
}

private static Stream GetContentFromUrlAsStream(string url, System.Net.ICredentials credentials = null)
{
    using (var handler = new System.Net.Http.HttpClientHandler { Credentials = credentials })
    using (var httpClient = new System.Net.Http.HttpClient(handler))
    {
        return httpClient.GetStreamAsync(url).GetAwaiter().GetResult();
    }
}

Предоставление учётных данных для преобразования веб‑страницы в PDF

Иногда требуется преобразовать HTML‑файлы, требующие аутентификации и прав доступа, чтобы только уполномоченные пользователи могли получать содержимое страницы. Это также включает сценарий, когда некоторые ресурсы/данные, указанные внутри HTML, запрашиваются с внешнего сервера, требующего аутентификации. Для удовлетворения этой потребности в класс HtmlLoadOptions добавлено свойство ExternalResourcesCredentials. Ниже показан фрагмент кода, демонстрирующий шаги передачи учётных данных при запросе HTML и соответствующих ресурсов во время преобразования HTML‑файла в PDF.

 // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
 private static void ConvertHTMLtoPDFAdvancedAuthorized()
 {
     // The path to the documents directory
     var dataDir = RunExamples.GetDataDir_AsposePdf();

     const string url = "http://httpbin.org/basic-auth/user1/password1";
     var credentials = new System.Net.NetworkCredential("user1", "password1");

     var options = new Aspose.Pdf.HtmlLoadOptions(url)
     {
         ExternalResourcesCredentials = credentials
     };

     using (var document = new Aspose.Pdf.Document(GetContentFromUrlAsStream(url, credentials), options))
     {
         // Save PDF document
         document.Save(dataDir + "HtmlTest_out.pdf");
     }
 }

private static Stream GetContentFromUrlAsStream(string url, System.Net.ICredentials credentials = null)
{
    using (var handler = new System.Net.Http.HttpClientHandler { Credentials = credentials })
    using (var httpClient = new System.Net.Http.HttpClient(handler))
    {
        return httpClient.GetStreamAsync(url).GetAwaiter().GetResult();
    }
}

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

MHTML, сокращённо MIME HTML, — формат архива веб‑страницы, используемый для объединения ресурсов, обычно представляемых внешними ссылками (изображения, Flash‑анимации, Java‑апплеты, аудиофайлы), с HTML‑кодом в один файл. Содержимое MHTML‑файла кодируется так, как если бы это было HTML‑сообщение электронной почты, используя MIME‑тип multipart/related. Aspose.PDF for .NET может преобразовывать HTML‑файлы в PDF, а начиная с версии Aspose.PDF for .NET 9.0.0, мы добавили новую возможность преобразования MHTML‑файлов в PDF. Следующий фрагмент кода показывает, как преобразовать MHTML‑файлы в PDF с помощью C#:

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

  1. Создайте экземпляр класса MhtLoadOptions.
  2. Инициализируйте объект Document.
  3. Сохраните полученный PDF‑документ, вызвав метод Document.Save().
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertMHTtoPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf();

    // Initialize MhtLoadOptions with page setup
    var options = new Aspose.Pdf.MhtLoadOptions()
    {
        PageInfo = { Width = 842, Height = 1191, IsLandscape = true }
    };

    // Initialize Document object using the MHT file and options
    using (var document = new Aspose.Pdf.Document(dataDir + "fileformatinfo.mht", options))
    {
        // Save PDF document
        document.Save(dataDir + "MhtmlTest_out.pdf");
    }
}