Как создать PDF из HTML с помощью wkhtmltopdf с C # в WinForms

Для веб-разработчиков гораздо проще создать PDF-файл из формата HTML, в основном потому, что он обеспечивает лучший вариант управления PDF-файлом. Для этой задачи веб-разработчики используют такие библиотеки, как wkhtmltopdf. wkhtmltopdf — это инструменты командной строки для рендеринга HTML в PDF с использованием движка рендеринга QT Webkit. Они работают полностью «без головы» и не требуют отображения или обслуживания дисплея.

В этой статье вы узнаете, как легко использовать wkhtmltopdf с C # в приложении Windows Forms.

Требования

  • Вам понадобится Visual Studio с диспетчером пакетов NuGet (> = 2010).

В нашем случае мы будем использовать сообщество Visual Studio, так что давайте начнем!

1. Установить Печкин

Для создания PDF из HTML-файла с C # в Windows Forms мы будем использовать Печкин, .NET Wrapper для wkhtmltopdf DLL, библиотека, которая использует движок Webkit для преобразования HTML-страниц в PDF. Печкин доступен в виде пакета NuGet, в большинстве случаев вам следует использовать SynchronizedPechkin, поскольку он защищает многопоточный код от сбоя библиотеки. Но для простого использования из одного потока, вы можете использовать SimplePechkin напрямую.

Заметка

Печкин включает в проект самую последнюю версию DLL-библиотеки wkhtmltox (и в пакете NuGet) вместе с ее зависимостями и копирует в папку сборки при сборке проекта. Поэтому нет необходимости устанавливать какие-либо предварительные условия перед использованием библиотеки на компьютере.

Установите пакет с помощью Visual Studio, открыв диспетчер пакетов NuGET. Делать щелкните правой кнопкой мыши ваш проект в обозревателе решений в правой верхней части Visual Studio и выберите Управление пакетами NuGet в выпадающем меню:

Пакеты Nuget обозревателя решений

Теперь из всплывающего окна найдите Pechkin.Synchronized пакет, выберите его и установите в своем проекте:

Печкин.Синхронизированный NuGET пакет визуальной студии

После завершения установки вы сможете использовать обертку в своем проекте.

2. Создать PDF

Convert Метод преобразует HTML-строку (или объект конфигурации) в PDF с заданными настройками и возвращает байтовые массивы, в которых хранятся двоичные данные PDF.

Заметка

Со всеми примерами pdfContent переменная воля генерировать только содержимое PDF, и вы ничего не увидите, поэтому не забудьте записать созданный контент в файл, выполнив шаг # 3.

А. Создать простой PDF из строки HTML

Вы можете быстро создать PDF с пустым глобальным объектом конфигурации. Импортируйте тип Печкина в свой класс:

using Pechkin;

А затем создайте содержимое PDF со следующим фрагментом:

byte[] pdfContent = new SimplePechkin(new GlobalConfig()).Convert("Hello world!");

Б. Создание PDF с веб-сайта

Вместо простой HTML-строки вы можете отобразить веб-сайт через его URL с помощью SetPageUri Метод в конфигурации. Импортировать Pechkin.Synchronized введите в верхней части вашего класса:

using Pechkin.Synchronized;

А затем используйте следующий код для создания PDF с веб-сайта:

// create global configuration object
GlobalConfig gc = new GlobalConfig();
// set it up using fluent notation
// Remember to import the following type:
//     using System.Drawing.Printing;
//
// a new instance of Margins with 1-inch margins.
gc.SetMargins(new Margins(100, 100, 100, 100))
.SetDocumentTitle("Test document")
.SetPaperSize(PaperKind.Letter)
// Set to landscape
//.SetPaperOrientation(true)
;
// Create converter
IPechkin pechkin = new SynchronizedPechkin(gc);
// Create document configuration object
ObjectConfig configuration = new ObjectConfig();
// and set it up using fluent notation too
configuration.SetCreateExternalLinks(false)
.SetFallbackEncoding(Encoding.ASCII)
.SetLoadImages(true)
.SetPageUri("http://site.com");
// Generate the PDF with the given configuration
// The Convert method will return a Byte Array with the content of the PDF
// You will need to use another method to save the PDF (mentioned on step #3)
byte[] pdfContent = pechkin.Convert(configuration);

C. Создание PDF из локального файла HTML

Чтобы создать PDF из локального HTML-файла, вы можете сделать это, указав локальный путь к файлу с помощью метода SetPageUri (так же, как вы делаете это с веб-сайтом), но в то же время разрешите использование локальных ресурсов. с SetAllowLocalContent метод (обратите внимание, что вам нужно добавить в качестве префикса file:/// в HTML-путь к файлу). Импортируйте синхронизированный тип Pechkin.Synchronized в верхней части вашего класса:

using Pechkin.Synchronized;

И используйте следующий код для создания PDF из локального файла HTML:

// create global configuration object
GlobalConfig gc = new GlobalConfig();
// set it up using fluent notation
// Remember to import the following type:
//     using System.Drawing.Printing;
//
// a new instance of Margins with 1-inch margins.
gc.SetMargins(new Margins(100, 100, 100, 100))
.SetDocumentTitle("Test document")
.SetPaperSize(PaperKind.Letter);
// Create converter
IPechkin pechkin = new SynchronizedPechkin(gc);
// Create document configuration object
ObjectConfig configuration = new ObjectConfig();
string HTML_FILEPATH = "C:/Users/sdkca/Desktop/example.html";
// and set it up using fluent notation too
configuration
.SetAllowLocalContent(true)
.SetPageUri(@"file:///" + HTML_FILEPATH);
// Generate the PDF with the given configuration
// The Convert method will return a Byte Array with the content of the PDF
// You will need to use another method to save the PDF (mentioned on step #3)
byte[] pdfContent = pechkin.Convert(configuration);

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

3. Сохраните PDF

Как упоминалось ранее, Печкин генерирует PDF и возвращает данные в виде байтового массива, это означает, что вам нужно как-то самостоятельно записать эти данные. Мы запишем PDF в файл, используя FileStream класс включен в сборку System.IO. С FileStream вы можете читать, записывать, открывать и закрывать файлы в файловой системе, а также манипулировать другими файловыми дескрипторами операционной системы, включая каналы, стандартный ввод и стандартный вывод. Перед его использованием импортируйте следующий тип с директивой using в верхней части вашего класса:

using System.IO;

А затем используйте класс для создания файла с возвращенным ByteArray в качестве содержимого. Вы можете использовать следующий метод, который ожидает в качестве первого параметра абсолютный путь к файлу и в качестве второго параметра данные для записи (содержимое pdf):

///
/// Writes a byte array (format returned by SimplePechkin) into a file
///
///
///
///
public bool ByteArrayToFile(string _FileName, byte[] _ByteArray)
{
try
{
// Open file for reading
FileStream _FileStream = new FileStream(_FileName, FileMode.Create, FileAccess.Write);
// Writes a block of bytes to this stream using data from  a byte array.
_FileStream.Write(_ByteArray, 0, _ByteArray.Length);
// Close file stream
_FileStream.Close();
return true;
}
catch (Exception _Exception)
{
Console.WriteLine("Exception caught in process while trying to save : {0}", _Exception.ToString());
}
return false;
}

Затем его можно использовать, как показано в следующем примере:

// Simple PDF from String
byte[] pdfBuffer = new SimplePechkin(new GlobalConfig()).Convert("Hello world!");
// Folder where the file will be created
string directory = "C:\\Users\\sdkca\\Desktop\\";
// Name of the PDF
string filename = "hello_world.pdf";
if (ByteArrayToFile(directory + filename, pdfBuffer))
{
Console.WriteLine("PDF Succesfully created");
}
else
{
Console.WriteLine("Cannot create PDF");
}
Ссылка на основную публикацию
Adblock
detector