Я хочу создать PDF, передав содержимое HTML в функцию. Я использовал iTextSharp для этого, но он не работает хорошо, когда он сталкивается с таблицами и макет просто становится грязным.
Есть ли способ лучше?
Я хочу создать PDF, передав содержимое HTML в функцию. Я использовал iTextSharp для этого, но он не работает хорошо, когда он сталкивается с таблицами и макет просто становится грязным.
Есть ли способ лучше?
Ответы:
РЕДАКТИРОВАТЬ: Новое предложение HTML Renderer для PDF с использованием PdfSharp
(Попробовав wkhtmltopdf и предложив избежать этого)
HtmlRenderer.PdfSharp - это полностью управляемый на 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 View.
Кроме того, для реальных веб-приложений они также управляют безопасностью потоков и т. Д.
Обновление: я бы порекомендовал 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
SelectPDF
Если ни один из перечисленных выше вариантов не поможет вам, вы всегда можете выполнить поиск пакетов 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);
Отказ от ответственности: я не разработчик, просто фанат проекта :)
Winnovative предлагает библиотеку .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. Как показал этот ответ , стандарт W3C css-break-3 решит проблему ... Это рекомендация кандидата, которая после испытаний должна превратиться в окончательную рекомендацию в 2017 или 2018 году.
В качестве нестандартных решений существуют плагины для C #, как показано в print-css.rocks .
Вы можете использовать функцию 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();
}
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, а затем использовать метод Print для печати на локально установленном PDF-принтере. Доступно несколько бесплатных PDF-принтеров, а элемент управления WebBrowser является частью .Net Framework.
РЕДАКТИРОВАТЬ: Если ваш 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-файл в файл потока на диске.
Это бесплатная библиотека, которая работает очень легко: 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 является библиотека ВтПечкин, которая является оболочкой для собственной библиотеки 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.
Обязательно прочитайте инструкции для многопоточных сред, так как вам придется инициализировать его только один раз за жизненный цикл приложения, поэтому вам нужно будет поместить его в одиночный файл или что-то в этом роде.
No tests are run because no tests are loaded or the selected tests are disabled
поиск в Google тоже не помогает
Лучший инструмент, который я нашел и использовал для генерации 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 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 .
Вполне вероятно, что большинство проектов будут использовать 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
Попробуйте этот компонент преобразования 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
Для преобразования 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.
часто задаваемых