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

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

Есть ли лучший способ?

Ответ 1

Обновление: Теперь я рекомендую PupeteerSharp вместо wkhtmltopdf.

Попробуйте wkhtmtopdf. Это лучший инструмент, который я когда-либо нашел.

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

Ответ 2

РЕДАКТИРОВАТЬ: Новое предложение HTML Renderer для PDF с использованием PdfSharp

(Попробовав wkhtmltopdf и предложив избежать этого)

HtmlRenderer.PdfSharp - это полностью управляемый на С# код, простой в использовании, поточно-ориентированный и, что наиболее важно, БЕСПЛАТНЫЙ (Новая лицензия BSD).

использование

  1. Загрузите пакет Nuget для HtmlRenderer.PdfSharp.
  2. Используйте пример метода.

    public static Byte[] PdfSharpConvert(String html)
    {
        Byte[] res = null;
        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }
        return res;
    }
    

Очень хорошая альтернатива - бесплатная версия iTextSharp

До версии 4.1.6 iTextSharp была лицензирована по лицензии LGPL, а версии до 4.16 (или могут быть также вилки) доступны в виде пакетов и могут свободно использоваться. Конечно, кто-то может использовать платную версию 5+.

Я попытался интегрировать решения wkhtmltopdf в свой проект, и у меня было много препятствий.

Лично я бы не использовал решения на основе wkhtmltopdf в приложениях Hosted Enterprise по следующим причинам.

  1. Во-первых, wkhtmltopdf реализован C++ не на С#, и вы столкнетесь с различными проблемами при его внедрении в код С#, особенно при переключении между 32-битными и 64-битными сборками вашего проекта. Пришлось попробовать несколько обходных путей, включая условное построение проекта и т.д., Чтобы избежать "недопустимых исключений формата" на разных машинах.
  2. Если вы управляете своей собственной виртуальной машиной, все в порядке. Но если ваш проект выполняется в ограниченной среде, такой как (Azure (на самом деле это невозможно с помощью Azure, как было упомянуто автором ВтПенчина), Elastic Beanstalk и т.д.), Это кошмар, чтобы настроить эту среду только для работы wkhtmltopdf.
  3. wkhtmltopdf создает файлы на вашем сервере, поэтому вам нужно управлять правами пользователей и предоставлять доступ на запись к тому месту, где работает wkhtmltopdf.
  4. Wkhtmltopdf работает как отдельное приложение, поэтому не управляется вашим пулом приложений IIS. Таким образом, вы должны либо разместить его в качестве службы на другом компьютере, либо у вас возникнут пики обработки и потребление памяти на рабочем сервере.
  5. Он использует временные файлы для генерации PDF, и в таких случаях, как AWS EC2 с очень медленным дисковым вводом/выводом, это большая проблема с производительностью.
  6. Наиболее ненавистная ошибка "Не удается загрузить DLL 'wkhtmltox.dll'", о которой сообщают многие пользователи.

--- PRE Редактировать раздел ---

Для тех, кто хочет создавать PDF из HTML в более простых приложениях/средах, я оставляю свой старый пост в качестве предложения.

TuesPechkin

https://www.nuget.org/packages/TuesPechkin/

или особенно для веб-приложений MVC (но я думаю, что вы можете использовать его в любом приложении .net)

Rotativa

https://www.nuget.org/packages/Rotativa/

Они оба используют двоичный файл wkhtmtopdf для преобразования html в pdf. Который использует движок webkit для рендеринга страниц, поэтому он также может анализировать таблицы стилей CSS.

Они обеспечивают простую в использовании бесшовную интеграцию с С#.

Rotativa также может создавать PDF файлы напрямую из любого Razor View.

Кроме того, для реальных веб-приложений они также управляют безопасностью потоков и т.д.

Ответ 3

Большинство конвертеров HTML в PDF полагаются на IE для обработки и рендеринга HTML. Это может сломаться, когда пользователь обновляет свой IE. Здесь - это тот, который не полагается на IE.

Код выглядит примерно так:

EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);

Как и многие другие преобразователи, вы можете передавать текст, имя файла или URL. Результат можно сохранить в файл или поток.

Ответ 4

Недавно я выполнил PoC в отношении преобразования HTML в PDF и хотел поделиться своими результатами.

Мой любимый на сегодняшний день - OpenHtmlToPdf

Преимущества этого инструмента:

  • Очень хорошая совместимость с HTML (например, это был единственный инструмент в моем примере, который правильно повторял заголовки таблицы, когда таблица охватывала несколько страниц).
  • Свободный API
  • Бесплатный и OpenSource (Лицензия Creative Commons Attribution 3.0)
  • Доступно через NuGet

Другие тестируемые инструменты:

Ответ 5

Я очень рекомендую NReco, серьезно. Он имеет бесплатную и платную версию и действительно стоит того. Он использует wkhtmtopdf в фоновом режиме, но вам просто нужна одна сборка. Фантастическая.

Пример использования:

Установите через NuGet.

var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);

Отказ от ответственности: я не разработчик, просто поклонник проекта:)

Ответ 6

Winnovative предлагает библиотеку .Net PDF, которая поддерживает ввод HTML. Они предлагают неограниченную бесплатную пробную версию. В зависимости от того, как вы хотите развернуть свой проект, этого может быть достаточно.

Ответ 7

Основные PDF могут быть использованы для преобразования HTML в PDF: С# образец. Приведенный здесь пример основан на ASP.NET, но библиотеку можно использовать из Windows Forms, WPF, ASP.NET Webforms и ASP.NET MVC. Библиотека предлагает возможность использования различных механизмов рендеринга HTML: Internet Explorer (по умолчанию) и WebKit (лучший вывод).

Весь набор элементов управления доступен бесплатно (коммерческие приложения также) через лицензионную программу сообщества, если вы подходите. Лицензия сообщества является полным продуктом без ограничений и водяных знаков.

Примечание: я работаю на Syncfusion.

Ответ 8

Я использовал ExpertPDF Html To Pdf Converter. Делает приличную работу. К несчастью, это не бесплатно.

Ответ 9

Также появилось новое приложение для создания веб-приложений - DocRaptor.com. Кажется простым в использовании, и там есть бесплатный вариант.

Ответ 10

Если вам действительно не нужна настоящая библиотека .Net PDF, существует множество бесплатных инструментов HTML для PDF, многие из которых могут запускаться из командной строки.

Одним из решений было бы выбрать один из них, а затем написать тонкую оболочку вокруг С#. Например, как это сделано в этот учебник.

Ответ 11

2018 обновление, и пусть использовать стандартное уравнение HTML + CSS = PDF!

Есть хорошие новости для требований HTML-PDF. Как показал этот ответ, стандарт W3C css-break-3 решит проблему... Это рекомендация кандидата, которая после испытаний должна превратиться в окончательную рекомендацию в 2017 или 2018 году.

В качестве нестандартных решений существуют плагины для С#, как показано в print-css.rocks.

Ответ 12

ABCpdf.NET(http://www.websupergoo.com/abcpdf-5.htm)

Мы используем и рекомендуем.

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

Это не бесплатно, но это дешево.

Ответ 13

Ниже приведен пример преобразования html + css в PDF с помощью iTextSharp (iTextSharp + itextsharp.xmlworker)

using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;


byte[] pdf; // result will be here

var cssText = File.ReadAllText(MapPath("~/css/test.css"));
var html = File.ReadAllText(MapPath("~/css/test.html"));

using (var memoryStream = new MemoryStream())
{
        var document = new Document(PageSize.A4, 50, 50, 60, 60);
        var writer = PdfWriter.GetInstance(document, memoryStream);
        document.Open();

        using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
        {
            using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
            {
                XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlMemoryStream, cssMemoryStream);
            }
        }

        document.Close();

        pdf = memoryStream.ToArray();
}

Ответ 14

Это зависит от любых других требований, которые у вас есть.

На самом деле простое, но не просто развертываемое решение - использовать элемент управления WebBrowser для загрузки Html, а затем использовать печать метода печати на локально установленный PDF-принтер. Доступно несколько бесплатных PDF-принтеров, а элемент управления WebBrowser является частью среды .NET.

EDIT: Если вы используете Html XHtml, вы можете использовать PDFizer для выполнения задания.

Ответ 15

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

Ответ 17

Последнее обновление: сентябрь 2019 г.

Это список вариантов преобразования HTML в PDF в .NET, которые я собрал (некоторые бесплатные, некоторые платные)

Если ни один из перечисленных выше вариантов не поможет вам, вы всегда можете выполнить поиск пакеты NuGethttps://www.nuget.org/packages?q=html+pdf

Ответ 18

Я тоже искал это некоторое время назад. Я столкнулся с HTMLDOC http://www.easysw.com/htmldoc/, который является бесплатным приложением командной строки с открытым исходным кодом, которое принимает файл HTML в качестве аргумента и выплевывает PDF из Это. Это сработало для меня очень хорошо для моего побочного проекта, но все зависит от того, что вам действительно нужно.

Компания, которая продает скомпилированные двоичные файлы, но вы можете бесплатно скачать и скомпилировать их из источника и использовать ее бесплатно. Мне удалось собрать довольно недавнюю ревизию (для версии 1.9), и я намерен освободить для нее двоичный установщик за несколько дней, поэтому, если вам интересно, я могу предоставить ссылку на нее, как только опубликую ее.

Изменить (25.02.2014): похоже, что документы и сайт перемещены в http://www.msweet.org/projects.php?Z1

Ответ 19

Вам нужно использовать коммерческую библиотеку, если вам нужен идеальный html-рендеринг в формате pdf.

ExpertPdf Html To Pdf Converter очень прост в использовании и поддерживает новейшие html5/css3, Вы можете преобразовать весь URL-адрес в pdf:

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);

или строка html:

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);

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

Ответ 20

Я являюсь автором пакета Rotativa. Это позволяет создавать PDF файлы непосредственно из просмотров бритвы:

https://www.nuget.org/packages/Rotativa/

Тривиально использовать, и вы полностью контролируете макет, так как вы можете использовать виды бритвы с данными из вашего контейнера Model и ViewBag.

Я разработал версию SaaS на Azure. Это упрощает использование WebApi или любого приложения .Net, сервиса, веб-сайта Azure, веб-сайта Azure, независимо от того, что работает .Net.

http://www.rotativahq.com/

Бесплатные учетные записи.

Ответ 22

Лучший инструмент, который я нашел и использовал для создания PDF файлов javascript и стилей, отображаемых в виде представлений или html-страниц, - phantomJS.

Загрузите файл .exe с помощью функции rasterize.js, найденной в корневой папке exe из примера папки и помещенной внутри решения.

It Even позволяет загружать файл в любой код без открытия этого файла, а также позволяет загружать файл, когда применяются стили и специально jquery.

Следующий код сгенерирует PDF файл:

public ActionResult DownloadHighChartHtml()
{
    string serverPath = Server.MapPath("~/phantomjs/");
    string filename = DateTime.Now.ToString("ddMMyyyy_hhmmss") + ".pdf";
    string Url = "http://wwwabc.com";

    new Thread(new ParameterizedThreadStart(x =>
    {
        ExecuteCommand(string.Format("cd {0} & E: & phantomjs rasterize.js {1} {2} \"A4\"", serverPath, Url, filename));
                           //E: is the drive for server.mappath
    })).Start();

    var filePath = Path.Combine(Server.MapPath("~/phantomjs/"), filename);

    var stream = new MemoryStream();
    byte[] bytes = DoWhile(filePath);

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=Image.pdf");
    Response.OutputStream.Write(bytes, 0, bytes.Length);
    Response.End();
    return RedirectToAction("HighChart");
}



private void ExecuteCommand(string Command)
{
    try
    {
        ProcessStartInfo ProcessInfo;
        Process Process;

        ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);

        ProcessInfo.CreateNoWindow = true;
        ProcessInfo.UseShellExecute = false;

        Process = Process.Start(ProcessInfo);
    }
    catch { }
}


private byte[] DoWhile(string filePath)
{
    byte[] bytes = new byte[0];
    bool fail = true;

    while (fail)
    {
        try
        {
            using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                bytes = new byte[file.Length];
                file.Read(bytes, 0, (int)file.Length);
            }

            fail = false;
        }
        catch
        {
            Thread.Sleep(1000);
        }
    }

    System.IO.File.Delete(filePath);
    return bytes;
}

Ответ 23

Являясь представителем программного обеспечения HiQPdf, я считаю, что лучшим решением является HiQPdf конвертер HTML в PDF для .NET. Он содержит самые продвинутые HTML5, CSS3, SVG и JavaScript-рендеринг на рынке. Существует также бесплатная версия библиотеки HTML в PDF, которую вы можете использовать для бесплатного создания до трех страниц PDF. Минимальный код С# для создания PDF файла в виде байта [] с HTML-страницы:

HtmlToPdf htmlToPdfConverter = new HtmlToPdf();

// set PDF page size, orientation and margins
htmlToPdfConverter.Document.PageSize = PdfPageSize.A4;
htmlToPdfConverter.Document.PageOrientation = PdfPageOrientation.Portrait;
htmlToPdfConverter.Document.Margins = new PdfMargins(0);

// convert HTML to PDF 
byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory(url);

Вы можете найти более подробные примеры как для ASP.NET, так и для MVC в Хранилище примеров PDF в PDF-формате HiQPdf.

Ответ 24

GrabzIt также предоставляет бесплатный .NET API для преобразования HTML в PDF. Это просто использовать, просто передать HTML, который вы хотите преобразовать, вместе с любым CSS и JavaScript и т.д. В функцию, и он будет отображаться, а PDF - возвращен. Помните, что любые внешние файлы CSS или JavaScript должны быть разрешены к общедоступному URL-адресу или быть встроенными в HTML.

GrabzItClient grabzIt = new GrabzItClient("APPLICATION KEY", "APPLICATION SECRET");
grabzIt.HTMLToPDF("<html><body><h1>Hello World!</h1></body></html>"); 
grabzIt.SaveTo("test.pdf");

Ответ 25

Это бесплатная библиотека, которая работает очень легко: OpenHtmlToPdf

string timeStampForPdfName = DateTime.Now.ToString("yyMMddHHmmssff");

string serverPath = System.Web.Hosting.HostingEnvironment.MapPath("~/FolderName");
string pdfSavePath = Path.Combine(@serverPath, "FileName" + timeStampForPdfName + ".FileExtension");


//OpenHtmlToPdf Library used for Performing PDF Conversion
var pdf = Pdf.From(HTML_String).Content();

//FOr writing to file from a ByteArray
 File.WriteAllBytes(pdfSavePath, pdf.ToArray()); // Requires System.Linq

Ответ 26

Попробуйте преобразовать компонент PDF Duo.Net для преобразования HTML в PDF из приложения ASP.NET без использования дополнительные DLL.

Вы можете передать строку или файл HTML или поток для создания PDF файла. Используйте приведенный ниже код (пример С#):

string file_html = @"K:\hdoc.html";   
string file_pdf = @"K:\new.pdf";   
try   
{   
    DuoDimension.HtmlToPdf conv = new DuoDimension.HtmlToPdf();   
    conv.OpenHTML(file_html);   
    conv.SavePDF(file_pdf);   
    textBox4.Text = "C# Example: Converting succeeded";   
}   

Информация + С#/VB примеры вы можете найти по адресу: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

Ответ 28

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

Вот код, как получить Bitmap URL. Я нашел его где-то здесь, на SO, если я найду источник, я его свяжу.

public System.Drawing.Bitmap HTMLToImage(String strHTML)
{
    System.Drawing.Bitmap myBitmap = null;

    System.Threading.Thread myThread = new System.Threading.Thread(delegate()
    {
        // create a hidden web browser, which will navigate to the page
        System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser();
        // we don't want scrollbars on our image
        myWebBrowser.ScrollBarsEnabled = false;
        // don't let any errors shine through
        myWebBrowser.ScriptErrorsSuppressed = true;
        // let load up that page!    
        myWebBrowser.Navigate("about:blank");

        // wait until the page is fully loaded
        while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
            System.Windows.Forms.Application.DoEvents();

        myWebBrowser.Document.Body.InnerHtml = strHTML;

        // set the size of our web browser to be the same size as the page
        int intScrollPadding = 20;
        int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding;
        int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding;
        myWebBrowser.Width = intDocumentWidth;
        myWebBrowser.Height = intDocumentHeight;
        // a bitmap that we will draw to
        myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding);
        // draw the web browser to the bitmap
        myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding));
    });
    myThread.SetApartmentState(System.Threading.ApartmentState.STA);
    myThread.Start();
    myThread.Join();

    return myBitmap;
}

Ответ 29

С конвертер Winnovative HTML to PDF вы можете преобразовать строку HTML в одну строку

byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);

Основной URL-адрес используется для разрешения изображений, на которые ссылаются относительные URL-адреса в строке HTML. Кроме того, вы можете использовать полные URL-адреса в HTML или встраивать изображения, используя src= "data: image/png" для тега изображения.

В ответ на комментарий пользователя fubar о Winnovative конверторе необходима коррекция. Конвертер не использует IE в качестве механизма рендеринга. Это фактически не зависит от какого-либо установленного программного обеспечения, и рендеринг совместим с движком WebKit.

Ответ 30

Если вы хотите, чтобы пользователь загружал pdf-версию страницы в браузере, самое легкое решение этой проблемы -

window.print(); 

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

<link rel="stylesheet" type="text/css" href="print.css" media="print">

print.css применяется к html во время печати. ​​

Ограничение

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