Конвертация 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();
}

Конвертация веб-страницы в PDF

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

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

Конвертация веб-страницы в 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();
    }
}

Отображение всего содержимого 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");
    }
}

Конвертация 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");
    }
}