Конвертировать HTML в PDF в .NET


425

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

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


Вы можете использовать GemBox.Document для этого. Также здесь вы можете найти пример кода для преобразования файла HTML в файл PDF.
Марио Z

Какую версию iTextSharp вы используете и можете поделиться своим HTML?
Амеди Ван Гасс

До сих пор нет ответа на мой запрос о дополнительной информации. Также добавьте, если вы используете HTMLWorker или XMLWorker.
Амеди Ван Гасс

Как насчет ядра .net?
Пьеро Альберто

SEPT 2019: я добавил новый ответ, некоторые из перечисленных опций являются бесплатными, другие оплачены, и некоторые из них доступны как .net core stackoverflow.com/questions/564650/…
Маурисио Грасия Гутьеррес

Ответы:


198

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

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

HtmlRenderer.PdfSharp - это полностью управляемый на C # код , простой в использовании, поточно-ориентированный и, что наиболее важно, БЕСПЛАТНЫЙ ( Новая лицензия 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;
    }

Очень хороший Alternate Есть бесплатная версия из iTextSharp

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

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

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

  1. Прежде всего, wkhtmltopdf - это C ++, а не C #, и вы столкнетесь с различными проблемами при его внедрении в код C #, особенно при переключении между 32-битными и 64-битными сборками вашего проекта. Пришлось попробовать несколько обходных путей, включая условное построение проекта и т. Д., Чтобы избежать «недопустимых исключений формата» на разных машинах.
  2. Если вы управляете своей собственной виртуальной машиной, все в порядке. Но если ваш проект выполняется в ограниченной среде, такой как ( Azure (на самом деле это невозможно с помощью Azure, как было упомянуто автором TWPenchin ), 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 .

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

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

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


2
Спасибо за обновление вашего поста. Я собираюсь дать PdfSharp попробовать. Вы сэкономили мне много времени.
Джон Хенкель

1
PdfSharp хорош с точки зрения производительности, но он не отображал плавающие объекты для меня должным образом. К счастью, я мог изменить разметку, чтобы использовать старые добрые таблицы, PdfSharp хорошо с ними справляется.
Гебб

3
Мы попробовали HtmlRenderer. Это было действительно быстро, когда не загружалось никакого CSS. Но когда мы попытались применить CSS (Bootstrap плюс некоторые сделанные на заказ), разбор CSS занял некоторое время (что мы, вероятно, могли бы смягчить), и рендеринг полностью отличался от веб-страницы.
Выдающийся

1
@ user2347528 - глядя на источник для HtmlRenderer.PdfSharp, нет никакого способа это исправить - он просто берет общую высоту страницы и клипы на каждую страницу PDF, что очень прискорбно - это означает, что многостраничные PDF-файлы с этой библиотекой действительно могут ' это будет сделано.
Мистер Бангла

3
BS. Это создает изображение HTML и добавляет изображение в файл PDF. Это не настоящий PDF вообще. Кроме того, PDF является векторным графическим форматом - вы можете прокручивать почти бесконечно - конечно, за исключением случаев, когда PDF состоит из растрового изображения, которое и создает эта библиотека.
Stefan Steiger

191

Обновление: я бы порекомендовал PupeteerSharp поверх wkhtmltopdf.

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

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


17
поддерживает .NET ??
Kiquenet

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

46
@bamccaig У меня это уже есть =) github.com/gmanny/Pechkin Он предоставляет все полезные функции библиотеки, а также имеет оболочку для использования в нескольких потоках. И это на NuGet.
Человек

7
Чтобы использовать это в C # stackoverflow.com/questions/4651373/…
Daniel Little

7
@ AdamMoszczyński: из Википедии : LGPL позволяет разработчикам и компаниям использовать и интегрировать программное обеспечение LGPL в свое собственное (даже проприетарное) программное обеспечение без необходимости (по условиям сильного авторского права) выпускать исходный код своих собственных частей программного обеспечения.
Оливер

34

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

Мой любимый на данный момент OpenHtmlToPdf

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

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

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


+1 для этого я протестировал HtmlRenderer для PdfSharp, но столкнулся со слишком многими проблемами с разрывами страниц. Я могу жить с зависимостью от wkHtmlToPdf в этом проекте, поэтому это решение было великолепным - оно прекрасно отображает HTML.
jmdon

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

Стефани из IronPDF здесь. Вот пример кода о том, как использовать IronPDF для преобразования HTML в PDF в C #. Больше можно найти в нашем html to pdf учебнике на нашем сайте. using IronPdf; IronPdf.HtmlToPdf Renderer = new IronPdf.HtmlToPdf(); // Render an HTML document or snippet as a string Renderer.RenderHtmlAsPdf("<h1>Hello World</h1>").SaveAs("html-string.pdf");
Стефани

Я использовал iText pdfHtml, но он не поддерживает background-color. OpenHtmlToPdf отлично работает бесплатно.
Hp93

Я согласен с превосходством OpenHtmlToPdf. Также поддерживается слияние .exe и .dll с ILMerge.
Сэйгли

30

Последнее обновление: март 2020

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

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


1
Вы проверяли на производительность? мы хотим, чтобы улучшить текущее время преобразования и изучаем другие библиотеки для этих преимуществ в производительности
frno

Я не проводил никакого сравнения производительности, особенно потому, что этот длинный список - возможно, кто-то уже проводил «обзор производительности .net-библиотек в формате PDF» или аналогичный
Маурисио Грасия Гутьеррес

28

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

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

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

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


35
это бесполезно, потому что вы должны приобрести библиотеку
d1jhoni1b

47
d1jhoni1b, как это делает его бесполезным? Если это инструмент оплаты, то можно сказать, что он дорогой, но не бесполезный только по этим критериям.
Дон Роллинг

3
Это правда, что EO.Pdf не использует IE. Но он, кажется, порождает 32-битные экземпляры браузера webkit в фоновом режиме. Проверьте список процессов, и вы увидите их как экземпляры rundll32.exe, указывающие на dll EO.PDF. Так что, на мой взгляд, он все еще немного хакерский.
Мэтт

1
Он не поддерживает media = "print", что очень больно.
Марат Фасхиев

15
Одна лицензия разработчика за 650 долларов. Это дорого
Абхиджит Нагре

25

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

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

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

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

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


3
Выглядит действительно довольно полезно. Стоит отметить, что на сегодняшний день (10.05.15) это самая загружаемая оболочка .Net для wkhtmtopdf (в виде пакета Nuget).
ken2k

3
Пробовал, к сожалению, я не смог заставить его работать на веб-страницах лазурного.
gabriel14

Эта библиотека прекрасно работает, когда я запускаю ее локально на своем компьютере, но на хост-сервере я случайно вижу следующую ошибку. Иногда создается PDF, но иногда выдается следующая ошибка. «Ошибка. Произошла ошибка при обработке вашего запроса. Невозможно сгенерировать PDF: (код выхода: 1)»
user2347528

wkhtmtopdf зависит от GDI + или x-сервера, если вы работаете в Mono / Linux. Так что это не полезно для серверных сред ...
nuzzolilo

Это хорошо и работает, как и ожидалось, но немного проблем с качеством, я вижу в моем PDF, мы можем улучшить это?
Бхарат

13

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


4
Имейте в виду, что когда мы в последний раз проверяли winnovative, он был несовместим с IE9 (поскольку они использовали механизм рендеринга IE GDI, который был удален в IE9). Так что, если на вашей машине установлен IE9, преобразование не будет работать. Возможно, они исправили это к тому времени, когда вы прочитали это, но многие из коммерческих компонентов использовали движок рендеринга IE и открепились с IE9, так что стоит проверить.
Фубаар

Winnovative был самым простым в настройке, и он работал из коробки. Но: 1. это НЕ РАБОТАЕТ на веб-сайтах Azure, только CloudApp. 2. это медленно, для создания простого PDF на виртуальной
машине

Confirm. Это действительно медленно. Я сравнил с wkhtmltopdf.
Марат Фасхиев

Винновативная библиотека очень дорогая. Около 650 долларов за лицензию разработчика и 1200 долларов за другую лицензию.
Абхиджит Нагре

Winnovative HTML в PDF Converter работает на веб-сайтах Azure и не зависит от IE, как это было предложено в комментарии. Пожалуйста, проверьте решение Winnovative HTML в PDF для Azure на веб-сайте: winnovative-software.com/html-to-pdf-converter-azure.aspx . Чтобы улучшить время преобразования, установите HtmlToPdf.ConversionDelay = 0. Преобразователь использует задержку по умолчанию для работы со страницами HTML, которые обновляют свое содержимое после загрузки страницы.
EvoPdf

9

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

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

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


8

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

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


Учебное пособие использует компонент с веб-сайта, который больше не существует.
Том Винтер

7

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


есть ли в ExpertPDf возможность маркировки документов водой?
user1799214

@ user1799214 - Да, ExpertPDF поддерживает водяные знаки. Смотрите здесь для примера кода. Я успешно использовал его с водяными знаками на одном из моих сайтов.
Феофил

Это работает довольно хорошо, но они не отвечают на вопросы поддержки.
Майкл Фрейдгейм

7

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


7

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

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

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


1
Решения, связанные с print-css.rocks, стоят 2 950 долларов США для PDFreactor, 3800 долларов США для Prince и 5 000 долларов США для Antenna House Formatter V7. И Weasyprint, кажется, для Python.
MDave

6

Вы можете использовать функцию Google Chrome print-to-pdf в режиме без головы. Я обнаружил, что это самый простой, но самый надежный метод.

var url = "/programming/564650/convert-html-to-pdf-in-net";
var chromePath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";
var output = Path.Combine(Environment.CurrentDirectory, "printout.pdf");
using (var p = new Process())
    {
        p.StartInfo.FileName = chromePath;
        p.StartInfo.Arguments = $"--headless --disable-gpu --print-to-pdf={output} {url}";
        p.Start();
        p.WaitForExit();
    }

Эй, это действительно круто для собственного сервера и VPS. Спасибо, что поделился.
MJB

Чтобы разрешить ASP.NET в IIS запускать внешнюю программу с разрешением на запись, пул приложений> предварительные настройки> идентификатор> установлен на «LocalSystem»
mjb

4

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

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

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

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


10
Мы использовали это в течение пары лет и обнаружили, что это довольно болезненно использовать. Плохая поддержка, очень привередливая из-за его обертки вокруг движка рендеринга IE, низкого качества изображения и сжатия, ограниченной способности настраивать запрос для обработки некоторых более сложных сценариев использования (таких как предоставление файлов cookie и заголовков запросов). Я полагаю, насколько хорошо это работает, зависит от того, что вам нужно сделать.
moribvndvs

3
+1 для ABCPdf. Предыдущий комментатор, должно быть, не разговаривал с теми же людьми поддержки, что и я, - они всегда писали мне обратно и всегда имели решение для любых проблем, которые у нас были. Теперь они поддерживают использование Gecko в качестве движка рендеринга вместо IE. Вы можете выбрать тот, который вы хотите во время выполнения. ABC позволяет делать буквально все, что позволяет PDF.
Стив

12
слишком дорогая и плохая поддержка. Я не рекомендую abcPDF вообще.
Вивек

Я тоже использовал его в течение последних 6 лет, и, честно говоря, он нам хорошо послужил.
toepoke.co.uk

Разве этот ответ не является еще одним повторением stackoverflow.com/a/2182212/471213 ? Я имею в виду, что другой парень, который связан с программой, по крайней мере, предоставил несколько строк примера кода
usr-local-ΕΨΗΕΛΩΝ

4

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

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

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

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

http://www.rotativahq.com/

Доступны бесплатные аккаунты.


Это полагается на Itextsharp, и поэтому вам нужно иметь лицензию на использование Itextsharp?
Мика Армантроут

2
@MicahArmantrout Нет, это не так. Он использует wkhtmltopdf.exe для создания файла PDF. Лицензия не требуется.
Джорджио Божио

@MicahArmantrout, разве iTextSharp также не является GNU GPL? gnu.org/licenses/agpl.html
Pranav Сингх

Мы не рекомендуем использовать версии до iText (Sharp) 5 по техническим и юридическим причинам. stackoverflow.com/questions/8517776/itexsharp-license
Мика Армантроут

4

Ниже приведен пример преобразования 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();
}

Обратите внимание, что iTextSharp работает с XHtml и довольно чувствителен к качеству вашего HTML. Это сломалось бы, где SelectPdf и HiqPdf не будут.
Savage

3

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

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

РЕДАКТИРОВАТЬ: Если ваш HTML является XHtml, вы можете использовать PDFizer, чтобы сделать работу.


3

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



2

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

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

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


привет, можете ли вы предоставить ссылку, а также руководство о том, как использовать ее с c # asp.net спасибо
user287745

static.persistedoughtts.com/htmldoc_1.9.1586-setup.exe Помните, что это программа командной строки. Вы должны выполнить его из своего приложения, чтобы заставить его работать. Вы можете найти документацию для своих аргументов и предостережений из главы 4: easysw.com/htmldoc/documentation.php
enriquein

Я не уверен , насколько это полезно было бы в настоящее время, но если это поможет вам: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein

Сайт больше не работает.
Том Винтер

2

Вам нужно использовать коммерческую библиотеку, если вам нужен отличный рендеринг 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-файл в файл потока на диске.


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

Я начинаю в это верить. Я перепробовал 5 бесплатных, и у них у всех есть одна вещь, которая разрушает это для меня. От удушья до страницы, которая выходит за рамки простого привета, до ужасного вида - я думаю, мне придется потратить немного денег на настоящего конвертера. Образцы каждого из коммерческих продуктов на самом деле работают так, как вы ожидаете получить PDF.
Херб Михан

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

@PeterWone на вершине есть много альтернатив с открытым исходным кодом, как вы можете легко увидеть. Просить кого-то поделиться такими же вещами - это просто воровать время. Но если вы попробовали все из них и остались неудовлетворенными, я надеюсь, что вы поделитесь своими комментариями под ними о том, что вас не устраивает, и, возможно, тогда это поможет расширить знания.
обайхан

@obayhan - Зачем повторять то, что уже сделали другие? Они делятся на три категории: не совсем бесплатные, недопустимые зависимости, такие как wkhtmltopdf или IE9, и HTML-рендерер для PDFSharp. HR для PDF # - единственный в чистом C #, и он выполняет ужасную работу по разбиению на страницы - он рендерит одну длинную страницу и разрезает ее, часто обрезая строки текста. Если бы я нашел время полностью переписать рендер, HR for PDF # выиграл бы: он быстрый, бесплатный и не имеет зависимостей. Боюсь, это был бы совершенно новый рендер.
Питер Воне

2

Это бесплатная библиотека, которая работает очень легко: 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


2

Похоже, что лучшим бесплатным решением для .NET является библиотека ВтПечкин, которая является оболочкой для собственной библиотеки wkhtmltopdf .

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

Кроме того, поскольку я хотел использовать последнюю версию wkhtmltopdf (0.12.5 на момент написания), я загрузил DLL с официального сайта, скопировал ее в корневой каталог своего проекта, установил для параметра copy значение true и инициализировал библиотеку следующим образом: так:

var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));

Приведенный выше код будет искать именно «wkhtmltox.dll», поэтому не переименовывайте файл. Я использовал 64-битную версию DLL.

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


1

Вот обертка для wkhtmltopdf.dll от pruiz

И обертка для wkhtmltopdf.exe от Codaxy
- тоже на nuget .


Любые документы или учебные пособия, как их использовать? там есть только исходный код без какой-либо документации
Burjua

1
Загрузите код и посмотрите на модульные тесты. Это должно дать вам несколько хороших примеров использования.
Гарфилд

Не очень помогает, на самом деле я даже не могу заставить тесты решения pruiz работать, он говорит, что No tests are run because no tests are loaded or the selected tests are disabledпоиск в Google тоже не помогает
Burjua

@ Буржуа это обычно связано с версией бегуна, которую вы используете. Тем не менее, попробуйте открыть вопрос на сайте проекта моего github, и я постараюсь вам помочь ...
Пабло Руис Гарсия

Привет, эта оболочка работает нормально, но не отображает мои круговые диаграммы Google. Поэтому, пока я не смогу решить эту проблему, мне придется найти другое решение.
Андре Ломбард

1

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

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

Он даже позволяет загружать файл в любом коде, не открывая этот файл, а также позволяет загружать файл, когда применяются стили и особенно 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;
}

Можете ли вы поделиться своим полным исходным кодом? Я новичок в C #, поэтому я застреваю даже на импорт.
Сиби Джон

1

Вы также можете проверить Spire , он позволяет создавать HTML to PDFс помощью этого простого куска кода

 string htmlCode = "<p>This is a p tag</p>";

//use single thread to generate the pdf from above html code
Thread thread = new Thread(() =>
{ pdf.LoadFromHTML(htmlCode, false, setting, htmlLayoutFormat); });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();

// Save the file to PDF and preview it.
pdf.SaveToFile("output.pdf");
System.Diagnostics.Process.Start("output.pdf");

Подробная статья: Как конвертировать HTML в PDF в asp.net C #


Spire создает PDF-файл, который является просто изображением. Некоторые из CSS даже не правильно, например, игнорирование жирных шрифтов.
Savage

Смотрите ответ на мой вопрос о создании PDF-файлов в виде изображения: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage,

Spire - четвертый, который я пробовал на этой странице, и я думаю, что он лучший, спасибо.
MDave

1

Как представитель HiQPdf Software, я считаю, что лучшим решением является HiQPdf HTML в PDF конвертер для .NET . Он содержит самый продвинутый движок рендеринга HTML5, CSS3, SVG и JavaScript на рынке. Существует также бесплатная версия библиотеки HTML to PDF, которую вы можете бесплатно использовать для создания до 3 страниц PDF. Минимальный код C # для создания 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, можно найти в репозитории примеров конвертера HTML в PDF HiQPdf .


1
Дает приличные результаты, но, как и SelectPdf, он может сильно повлиять на время сборки и размер пакета развертывания. Это почти удвоило время моей сборки Visual Studio. Мне также было трудно заставить его заполнить мою страницу - html был слишком мал посередине - в этом отношении SelectPdf работал лучше.
Savage

1
заполнение страницы содержимым HTML зависит от свойства HtmlToPdf.BrowserWidth. По умолчанию это 1200 пикселей, но вы можете установить его на 800 пикселей, и HTML должен очень хорошо заполнить всю страницу PDF. Вы можете найти живую демонстрацию и пример кода для этого по адресу hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf

1
Нет .NET Core поддержки тоже.
Тейлор Бьюкенен

1

Вполне вероятно, что большинство проектов будут использовать C / C ++ Engine, а не реализовывать решение C # с нуля. Попробуйте проект Gotenberg .

Чтобы проверить это

docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6

Пример Curl

curl --request POST \
    --url http://localhost:3000/convert/url \
    --header 'Content-Type: multipart/form-data' \
    --form remoteURL=https://brave.com \
    --form marginTop=0 \
    --form marginBottom=0 \
    --form marginLeft=0 \
    --form marginRight=0 \
    -o result.pdf

C # sample.cs

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
using static System.Console;

namespace HelloWorld
{
    class Program
    {
        public static async Task Main(string[] args)
        {
            try
            {
                var client = new HttpClient();            
                var formContent = new MultipartFormDataContent
                    {
                        {new StringContent("https://duckduckgo.com/"), "remoteURL"},
                        {new StringContent("0"), "marginTop" }
                    };
                var result = await client.PostAsync(new Uri("http://localhost:3000/convert/url"), formContent);
                await File.WriteAllBytesAsync("duckduck.com.pdf", await result.Content.ReadAsByteArrayAsync());
            }
            catch (Exception ex)
            {
                WriteLine(ex);
            }
        }
    }
}

Компилировать

csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe

0

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

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

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";   
}   

Примеры Info + C # / VB вы можете найти по адресу: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx


1
BitDefender сообщает: «Обнаружено вредоносное ПО! Доступ к этой странице заблокирован». У меня нет мнения о том, является ли этот отчет подлинным или ложным.
GeoffM

0

Для преобразования HTML в PDF в C # используйте ABCpdf .

ABCpdf может использовать механизмы рендеринга Gecko или Trident, поэтому ваша HTML-таблица будет выглядеть так же, как в FireFox и Internet Explorer.

На сайте www.abcpdfeditor.com размещена демонстрационная версия ABCpdf. Вы можете использовать это, чтобы проверить, как ваши таблицы будут отображаться первыми, без необходимости загружать и устанавливать программное обеспечение.

Для рендеринга целых веб-страниц вам понадобятся функции AddImageUrl или AddImageHtml. Но если все, что вам нужно, это просто добавить текст в стиле HTML, тогда вы можете попробовать функцию AddHtml, как показано ниже:

Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();

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


91
Вы должны действительно написать во всех своих ответах, что вы работаете на websupergoo. От However, you must disclose your affiliation with the product in your answers. Also, if a huge percentage of your posts include a mention of your product, you're clearly here for the wrong reasons. часто задаваемых
вопросов

12
Ой! Я предложил ABCpdf, потому что это компонент, с которым я знаком. Если большой процент моих сообщений относится к PDF-файлам, то это только потому, что я воздерживаюсь от участия в темах, которые меня не интересуют. Извиняюсь.
AffineMesh

В защиту постеров, сайт показывает, что продукт довольно хорош.
Том Винтер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.