Я хочу створити PDF, передавши вміст HTML функції. Я використав для цього iTextSharp, але він не працює добре, коли стикається з таблицями, а макет просто стає безладним.
Чи є кращий спосіб?
Я хочу створити PDF, передавши вміст HTML функції. Я використав для цього iTextSharp, але він не працює добре, коли стикається з таблицями, а макет просто стає безладним.
Чи є кращий спосіб?
Відповіді:
РЕДАКТУВАННЯ: Новий HTML-рендер пропозиції для PDF за допомогою PdfSharp
(Спробувавши wkhtmltopdf та запропонувавши його уникати)
HtmlRenderer.PdfSharp - це 100% повністю керований C # код , простий у використанні, безпечний для потоків і найголовніше БЕЗКОШТОВНЕ ( нову ліцензію BSD ) .
Використання
Використовуйте приклад методу.
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 з наступних причин.
--- 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 .
Крім того, для веб-додатків у реальному світі вони також управляють безпекою потоків тощо ...
Оновлення: я б зараз рекомендував PupeteerSharp над wkhtmltopdf.
Спробуйте wkhtmtopdf . Це найкращий інструмент, який я знайшов досі.
Для .NET ви можете використовувати цю невелику бібліотеку, щоб легко викликати утиліту командного рядка wkhtmtopdf.
Нещодавно я виконав PoC щодо перетворення HTML у PDF і хотів поділитися своїми результатами.
Мій улюблений на сьогоднішній день - OpenHtmlToPdf
Переваги цього інструменту:
Інші перевірені інструменти:
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");
background-color
. OpenHtmlToPdf ідеально працює безкоштовно.
Останнє оновлення: березень 2020 року
Це перелік варіантів перетворення HTML у PDF у .NET, які я склав (деякі безкоштовні, деякі оплачені)
GemBox.Document
PDF Метаморфоза .Net
HtmlRenderer.PdfSharp
PuppeteerSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Безкоштовний Spire.PDF для .NET (версія спільноти)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
ВиберітьPDF
Якщо жоден із наведених вище варіантів не допоможе, ви завжди можете шукати пакети NuGet https://www.nuget.org/packages?q=html+pdf
Більшість HTML в PDF конвертер покладається на IE, щоб зробити аналіз HTML і рендерінг. Це може зламатися, коли користувач оновлює свій IE. Ось такий, який не покладається на IE.
Код приблизно такий:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
Як і багато інших перетворювачів, ви можете передавати текст, ім'я файлу або URL. Результат можна зберегти у файл або потік.
Я дуже рекомендую NReco , серйозно. Він має безкоштовну і платну версію, і дійсно того варто. Він використовує wkhtmtopdf у фоновому режимі, але вам потрібна лише одна збірка. Фантастичний.
Приклад використання:
Встановити через NuGet .
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
Відмова: Я не розробник, просто фанат проекту :)
Вигідна пропозиція .Net PDF-бібліотека, яка підтримує введення HTML. Вони пропонують необмежену безкоштовну пробну версію . Залежно від способу розгортання проекту, цього може бути достатньо.
Основні PDF-файли можна використовувати для перетворення HTML у PDF : зразок C # . Зразок, зв'язаний тут, заснований на ASP.NET, але бібліотеку можна використовувати з Windows Forms, WPF, ASP.NET Webforms та ASP.NET MVC. Бібліотека пропонує можливість використання різних механізмів візуалізації HTML: Internet Explorer (за замовчуванням) та WebKit (найкращий вихід).
Весь набір елементів керування доступний безкоштовно (також комерційні програми) через ліцензійну програму громади, якщо Ви маєте право. Ліцензія громади - це повний продукт без обмежень та водяних знаків.
Примітка: я працюю для Syncfusion.
Якщо вам справді не потрібна справжня бібліотека .Net PDF, існує безліч безкоштовних інструментів HTML до PDF , багато з яких можуть працювати з командного рядка.
Одним із рішень було б вибрати один із них, а потім написати тонку обгортку навколо цього в C #. Наприклад, як це зроблено в цьому підручнику .
Я використовував ExpertPDF Html To Pdf Converter . Робить гідну роботу. На жаль, це не безкоштовно.
Також є новий веб-додаток для генерації документів - DocRaptor.com . Здається, проста у використанні, і є безкоштовний варіант.
Є гарні новини для запитів HTML-PDF. Як показала ця відповідь , стандарт WDC css-break-3 вирішить проблему ... Це Рекомендація щодо кандидата, яка планує після тестів перетворитись на остаточну Рекомендацію у 2017 або 2018 роках.
Як не стандартні є рішення з плагінами для C #, як показали print-css.rocks .
Ви можете використовувати функцію 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();
}
ABCpdf.NET (http://www.websupergoo.com/abcpdf-5.htm)
Ми використовуємо та рекомендуємо.
Дуже хороший компонент, він не тільки конвертує веб-сторінку в PDF, як зображення, але реально конвертує текст, зображення, форматування тощо ...
Це не безкоштовно, але це дешево.
Я автор пакета Rotativa. Це дозволяє створювати PDF-файли безпосередньо з представлень бритви:
https://www.nuget.org/packages/Rotativa/
Тривіальне для використання, і ви маєте повний контроль над компонуванням, оскільки ви можете використовувати представлення бритви з даними з вашого контейнера Model і ViewBag.
Я розробив версію SaaS на Azure. Це робить його ще простіше використовувати його з WebApi або будь-якого додатка .Net, сервісу, веб-сайту Azure, веб-роботи Azure, що б не працювало. Net.
Безкоштовні акаунти доступні.
Нижче наведено приклад перетворення 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();
}
Це залежить від будь-яких інших ваших вимог.
По-справжньому просте, але не просто розгорнуте рішення - використовувати керування WebBrowser для завантаження Html, а потім за допомогою методу друку друку на локально встановлений принтер PDF. Доступно декілька безкоштовних принтерів PDF, а управління WebBrowser є частиною .Net.
EDIT: Якщо Html - це XHtml, ви можете використовувати PDFizer для виконання цієї роботи.
PDF Vision - це добре. Однак, ви повинні мати повний трест, щоб користуватися ним. Я вже надіслав електронною поштою і запитав, чому мій HTML не конвертується на сервері, але він добре працює на localhost.
Я знайшов наступну бібліотеку більш ефективною в перетворенні HTML в pdf.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
Я також шукав це деякий час назад. Я наткнувся на HTMLDOC http://www.easysw.com/htmldoc/ , це безкоштовний додаток командного рядка з відкритим кодом, який приймає файл HTML як аргумент і випиває з нього PDF. Для мене це добре працює для мого побічного проекту, але все залежить від того, що вам насправді потрібно.
Компанія, яка її виготовляє, продає складені бінарні файли, але ви можете безкоштовно завантажити та компілювати з джерела та використовувати їх безкоштовно. Мені вдалося скласти досить недавню версію (для версії 1.9), і я маю намір випустити бінарний інсталятор для неї за кілька днів, тому, якщо вам цікаво, я можу надати посилання на нього, як тільки я опублікую його.
Редагувати (25.02.2014): схоже, що документи та веб-сайт переміщені на http://www.msweet.org/projects.php?Z1
Вам потрібно використовувати комерційну бібліотеку, якщо вам потрібно ідеальне відображення 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 на диску.
Це безкоштовна бібліотека і працює дуже легко: 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
Начебто найкращим безкоштовним рішенням .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.
Переконайтеся, що ви прочитали інструкції для багатопотокових середовищ, оскільки вам доведеться ініціалізувати її лише один раз за життєвий цикл програми, тож вам потрібно буде помістити її в синглтон чи щось.
Ось обгортка для wkhtmltopdf.dll від pruiz
No tests are run because no tests are loaded or the selected tests are disabled
гуглінг також не допомагає
Найкращий інструмент, який я знайшов і використовував для створення 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;
}
Ви також можете перевірити 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 #
Як представник програмного забезпечення 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 .
Цілком ймовірно, що більшість проектів припадуть на 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
Спробуйте цей компонент для перетворення 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
Для перетворення 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 - комерційне найменування програмного забезпечення, проте стандартне видання часто можна отримати безкоштовно за спеціальною пропозицією.
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