Перетворити HTML в PDF у .NET


425

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

Чи є кращий спосіб?


Ви можете використовувати для цього GemBox.Document . Також тут можна знайти зразок коду для перетворення HTML-файлу у PDF-файл.
Mario Z

Якою версією iTextSharp ви користуєтесь і чи можете ви поділитися своїм html?
Амедей Ван Гассе

Все ще немає відповіді на мій запит на отримання додаткової інформації. Будь ласка, додайте, якщо ви використовуєте HTMLWorker або XMLWorker.
Амедей Ван Гассе

Що з ядром .net?
П'єро Альберто

SEPT 2019: Я додав нову відповідь, деякі з перелічених варіантів є безкоштовними, інші - платними, а деякі доступні як .net core stackoverflow.com/questions/564650/…
Mauricio Gracia Gutierrez

Відповіді:


198

РЕДАКТУВАННЯ: Новий HTML-рендер пропозиції для PDF за допомогою PdfSharp

(Спробувавши wkhtmltopdf та запропонувавши його уникати)

HtmlRenderer.PdfSharp - це 100% повністю керований C # код , простий у використанні, безпечний для потоків і найголовніше БЕЗКОШТОВНЕ ( нову ліцензію BSD ) .

Використання

  1. Завантажити HtmlRenderer.PdfSharp NuGet пакет.
  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 (насправді неможливо з лазурним режимом, як згадував автор TuesPenchin ), Elastic Beanstalk тощо), це кошмар налаштувати це середовище лише для того, щоб wkhtmltopdf працював.
  3. wkhtmltopdf створює файли на вашому сервері, тому вам доведеться керувати правами користувача та надавати доступ "запису" до місця роботи wkhtmltopdf.
  4. Wkhtmltopdf працює як окремий додаток, тому його не керує пул додатків IIS . Тож вам доведеться або розмістити його як послугу на іншій машині, або ви відчуєте обробку шипів і споживання пам’яті на виробничому сервері.
  5. Він використовує тимчасові файли для генерування файлу pdf, а у випадках, як AWS EC2, який має дуже повільний введення / виведення диска, це велика проблема з продуктивністю.
  6. Найбільш ненависна помилка "Не вдається завантажити DLL 'wkhtmltox.dll'", про яку повідомляють багато користувачів.

--- PRE Редагувати розділ ---

Для всіх, хто хоче генерувати pdf з html у більш простих програмах / середовищах, я залишаю свою стару посаду як пропозицію.

ВтПечкін

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

або Особливо для веб-додатків MVC (але я думаю, ви можете використовувати його в будь-якій програмі .net)

Ротатива

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

Вони обидва використовують бінарний файл wkhtmtopdf для перетворення HTML у pdf. Котрий використовує двигун webkit для візуалізації сторінок, щоб він також міг аналізувати таблиці стилів css .

Вони забезпечують зручну інтеграцію з C #.

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

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


2
Дякуємо за оновлення своєї публікації. Я спробую спробувати PdfSharp. Ви зекономили мені багато часу.
Джон Генкель

1
PdfSharp хороший з точки зору продуктивності, але для мене він не плаває належним чином. На щастя, я міг змінити розмітку, щоб використовувати старі добрі таблиці, PdfSharp обробляє їх добре.
Гебб

3
Ми спробували HtmlRenderer. Це було дуже швидко, не завантажуючи жодного CSS. Але коли ми намагалися застосувати CSS (Bootstrap плюс деякі замовлення), розбір CSS зайняв деякий час (який ми могли, ймовірно, пом'якшити), і візуалізація була зовсім іншою для веб-сторінки.
Видатний

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

3
BS. Це створює зображення HTML і додає зображення у файл pdf. Це зовсім не справжній PDF. Крім того, PDF - це векторний графічний формат - ви можете прокручувати поблизу нескінченно - звичайно, за винятком випадків, якщо PDF складається з растрової графіки, що і створює ця бібліотека.
Стефан Штайгер

191

Оновлення: я б зараз рекомендував PupeteerSharp над wkhtmltopdf.

Спробуйте wkhtmtopdf . Це найкращий інструмент, який я знайшов досі.

Для .NET ви можете використовувати цю невелику бібліотеку, щоб легко викликати утиліту командного рядка wkhtmtopdf.


17
підтримує .NET ??
Кікенет

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

46
@bamccaig Я це вже отримав =) github.com/gmanny/Pechkin Він відкриває всі корисні функції бібліотеки, а також має обгортку для використання в декількох потоках . І це на NuGet.
Гман

7
Щоб використовувати це в C # stackoverflow.com/questions/4651373/…
Даніель Літтл

7
@ AdamMoszczyński: З Вікіпедії : LGPL дозволяє розробникам та компаніям використовувати та інтегрувати програмне забезпечення LGPL у власне (навіть власне) програмне забезпечення, не вимагаючи (за умовами сильного копілефта) звільнення вихідного коду власних програмних частин.
Олівер

34

Нещодавно я виконав PoC щодо перетворення HTML у PDF і хотів поділитися своїми результатами.

Мій улюблений на сьогоднішній день - OpenHtmlToPdf

Переваги цього інструменту:

  • Дуже хороша сумісність HTML (наприклад, це був єдиний інструмент у моєму прикладі, який правильно повторював заголовки таблиці, коли таблиця охоплювала кілька сторінок)
  • Вільний API
  • Безкоштовно та OpenSource ( ліцензія 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.
saygley

30

Останнє оновлення: березень 2020 року

Це перелік варіантів перетворення HTML у PDF у .NET, які я склав (деякі безкоштовні, деякі оплачені)

Якщо жоден із наведених вище варіантів не допоможе, ви завжди можете шукати пакети NuGet https://www.nuget.org/packages?q=html+pdf


1
Ви перевірили будь-яку на продуктивність? ми прагнемо покращити поточний час конверсії та вивчаємо інші бібліотеки для цих переваг продуктивності
frno

Я не робив жодного порівняння продуктивності, особливо тому, що такий довгий список - можливо, там хтось уже зробив "огляд продуктивності бібліотек у форматі PDF .net" чи подібне
Mauricio Gracia Gutierrez

28

Більшість HTML в PDF конвертер покладається на IE, щоб зробити аналіз HTML і рендерінг. Це може зламатися, коли користувач оновлює свій IE. Ось такий, який не покладається на IE.

Код приблизно такий:

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

Як і багато інших перетворювачів, ви можете передавати текст, ім'я файлу або URL. Результат можна зберегти у файл або потік.


35
це не корисно, оскільки ви повинні придбати бібліотеку
d1jhoni1b

47
d1jhoni1b, як це робить його не корисним? Якщо це інструмент оплати, то, можливо, це може бути дорогим, але не марним лише за цими критеріями.
Дон Ролінг

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

1
Він не підтримує media = "print", що дуже боляче.
Марат Фасхієв

15
Єдина ліцензія для розробника за 650 доларів. Це дорого.
Abhijeet Nagre

25

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

Приклад використання:

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

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

Відмова: Я не розробник, просто фанат проекту :)


3
Виглядає насправді досить корисно. Варто зазначити, що станом на сьогодні (05.10.2015) це найбільш завантажена .Net обгортка для wkhtmtopdf (як пакет Nuget).
ken2k

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

Ця бібліотека прекрасно працює, коли я запускаю її локально на своїй машині, але на сервері хостингу я випадково бачу таку помилку. Pdf створюється іноді, але іноді видає таку помилку. "Помилка. Під час обробки вашого запиту сталася помилка. Неможливо створити PDF: (код виходу: 1)"
користувач2347528

wkhtmtopdf залежить від GDI + або x-сервера, якщо ви працюєте на Mono / Linux. Тож це не корисно для серверного середовища ...
nuzzolilo

Її хороша та працює як очікувалося, але трохи якість, яку я бачу у своєму PDF, чи можемо ми покращити це?
Бхарат

13

Вигідна пропозиція .Net PDF-бібліотека, яка підтримує введення HTML. Вони пропонують необмежену безкоштовну пробну версію . Залежно від способу розгортання проекту, цього може бути достатньо.


4
Майте на увазі, що коли ми востаннє перевіряли, виграшність несумісна з IE9 (оскільки вони використовували двигун візуалізації IE GDI, який був видалений у IE9). Отже, якщо у вас встановлений IE9 на машині, якою ви його використовуєте, конверсія не буде працювати. Вони, можливо, виправили це до того моменту, коли ви це прочитали, але багато комерційних компонентів використовували IE-рендерінг і відклеювали його IE9, тому це варто перевірити.
fubaar

Інноваційний спосіб було найпростішим у налаштуванні, і він просто вийшов з коробки. Але: 1. НЕ ПРАЦЮЄ на веб-сайтах Azure, а лише CloudApp. 2. це повільно, для створення простого PDF-файлу в VM Azure D1
потрібно

Підтвердіть. Це дійсно повільно. Я порівнював з wkhtmltopdf.
Марат Фасхієв

Інноваційна бібліотека коштує дуже дорого. Деякі 650 доларів за ліцензію розробника та 1200 доларів за іншу ліцензію.
Abhijeet Nagre

Winnovative HTML to 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 можливість маркування води документами?
користувач1799214

@ user1799214 - Так, ExpertPDF підтримує водяні знаки. Дивіться тут зразок коду. Я успішно використовував його з водяними знаками на одному з моїх веб-сайтів.
Теофіл

Це працює досить добре, але вони не відповідають на запитання підтримки.
Майкл Фрейджім

7

Також є новий веб-додаток для генерації документів - DocRaptor.com . Здається, проста у використанні, і є безкоштовний варіант.


7

Оновлення 2018 року, і давайте використовувати стандартне HTML + CSS = PDF рівняння!

Є гарні новини для запитів HTML-PDF. Як показала ця відповідь , стандарт WDC css-break-3 вирішить проблему ... Це Рекомендація щодо кандидата, яка планує після тестів перетворитись на остаточну Рекомендацію у 2017 або 2018 роках.

Як не стандартні є рішення з плагінами для C #, як показали print-css.rocks .


1
Рішення, пов’язані з print-css.rocks, коштували 2950,00 доларів для PDFreactor, 3800 доларів для принца та 5000 доларів для формату антенного будинку V7. І Weasyprint, здається, призначений для Python.
MDave

6

Ви можете використовувати функцію Google Chrome для друку до 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 Ні, це не так. Для створення файлу PDF він використовує wkhtmltopdf.exe. Ліцензія не потрібна.
Джорджіо Боціо

@MicahArmantrout, Чи не iTextSharp також GNU GPL? gnu.org/licenses/agpl.html
Сінгх

Ми не радимо використовувати версії до iText (Sharp) 5 як з технічних, так і з юридичних причин. stackoverflow.com/questions/8517776/itexsharp-license
Михей Armantrout

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 не стали.
Дикун

3

Це залежить від будь-яких інших ваших вимог.

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

EDIT: Якщо 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 спасибі
користувач287745

static.persistedthoughts.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 документ у файл Stream на диску.


Вам не доведеться використовувати комерційну бібліотеку, якщо вам потрібен ідеальний HTML-рендерінг у pdf
obayhan

Я починаю вірити в це. Я спробував 5 халяв, і всі вони мають одне, що для мене це руйнує. Від задухи до сторінки, яка виходить за рамки простого привітного світу, до жахливого вигляду - я думаю, що мені доведеться кашляти трохи грошей за справжній конвертер. Зразки кожного комерційного продукту насправді працюють так, як ви очікували, що вийде у форматі PDF.
Herb Meehan

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

@PeterWone вгорі є багато альтернатив з відкритим кодом, як ви легко бачите. Попросити когось поділитися одними і тими ж речами - це просто вкрасти час. Але якщо ви спробували їх усіх і незадоволили, я сподіваюся, що ви поділитесь своїми коментарями під ними про те, що вас не влаштовує, і, можливо, це допоможе розширити знання.
obayhan

@obayhan - Навіщо повторювати те, що вже зробили інші? Вони поділяються на три категорії: не дуже вільні, неприйнятні залежності, наприклад wkhtmltopdf або IE9, та HTML Renderer для PDFSharp. HR для PDF # є єдиним у чистому C #, і він робить жахливу роботу з пагітування - він робить одну довгу сторінку і скорочує її, часто пробиваючи рядки тексту. Якщо я можу знайти час повністю переписати рендерінг, HR для 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 є бібліотека TuesPechkin, яка є обгорткою навколо рідної бібліотеки wkhtmltopdf .

Зараз я використовував однопоточну версію для перетворення декількох тисяч рядків HTML у PDF-файли, і це, здається, працює чудово. Він також повинен працювати в багатопотокових середовищах (наприклад, IIS), але я цього не перевіряв.

Крім того, оскільки я хотів використати останню версію wkhtmltopdf (0.12.5 на момент написання), я завантажив DLL з офіційного веб-сайту, скопіював його у свій корінь проекту, встановив копію для виведення в 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 .


Будь-які документи чи підручники, як ними користуватися? там є лише вихідний код без будь-якої документації
Буржуа

1
Завантажте код і подивіться одиничні тести. Це повинно дати вам добрі зразки використання.
Гарфілд

Насправді це не допомагає, адже я навіть не можу зробити тести на рішення пруїзу для роботи. Каже, No tests are run because no tests are loaded or the selected tests are disabledгуглінг також не допомагає
Буржуа

@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 навіть не є правильними, наприклад, ігнорування жирних шрифтів.
Дикун

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

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

1

Як представник програмного забезпечення HiQPdf, я вважаю, що найкращим рішенням є HiQPdf HTML в PDF конвертер для .NET . Він містить найсучасніші HTML5, CSS3, SVG та двигун надання JavaScript на ринку. Існує також безкоштовна версія бібліотеки HTML в 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 в сховищі прикладів HTMLQ в PDF в форматі HiQPdf HTML в PDF Converter .


1
Дає гідні результати, але, як і SelectPdf, він може мати великі враження щодо часу складання та розміщення пакету. Це майже подвоїло час мого побудови Visual Studio. У мене також було важко отримати його для заповнення моєї сторінки - html був занадто малим посередині - у цьому відношенні SelectPdf зробив кращу роботу.
Дикун

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

1
Немає підтримки .NET Core.
Тейлор

1

Цілком ймовірно, що більшість проектів припадуть на C / C ++ Engine, а не реалізують рішення C # з нуля. Спробуйте Project Gotenberg .

Щоб перевірити це

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

Приклад завитка

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

Приклади інформації + 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. Усі ваші відповіді були про ABCpdf
jgauffin

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

На захисті плакатів веб-сайт робить продукт досить гарним.
Тома Зима,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.