我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但是当它遇到表格并且布局变得凌乱时,它的表现不佳。
有没有更好的办法?
我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但是当它遇到表格并且布局变得凌乱时,它的表现不佳。
有没有更好的办法?
Answers:
编辑: 使用PdfSharp的PDF 新建议HTML渲染器
(尝试过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;
}
一个非常好的替代品是一个免费版本的iTextSharp的
在4.1.6版之前,iTextSharp已获得LGPL许可证的许可,在4.16版之前(或可能还有叉子),它们可以作为软件包使用并可以免费使用。当然,有人可以使用续订的5+ 付费版本。
我试图整合 wkhtmltopdf解决方案到我的项目中,但遇到了很多障碍。
我个人会避免使用 由于以下原因,在Hosted Enterprise应用程序上基于wkhtmltopdf的解决方案。
--- PRE编辑部分---
对于想在更简单的应用程序/环境中从html生成pdf的任何人,我都保留我的旧帖子作为建议。
https://www.nuget.org/packages/TuesPechkin/
或特别是对于MVC Web应用程序 (但我认为您可以在任何.net应用程序中使用它)
https://www.nuget.org/packages/Rotativa/
他们都利用 wkhtmtopdf二进制文件将html转换为pdf。它使用webkit引擎呈现页面,因此它也可以解析CSS样式表。
它们提供了易于使用的C#无缝集成。
Rotativa还可以直接从任何Razor生成PDF。 View。
此外,对于现实世界的Web应用程序,它们还管理线程安全性等。
更新:我现在推荐PupeteerSharp上使用PupeteerSharp。
尝试wkhtmtopdf。这是到目前为止我发现的最好的工具。
对于.NET,您可以使用此小型库轻松调用wkhtmtopdf命令行实用程序。
我最近进行了关于HTML到PDF转换的PoC,并希望分享我的结果。
到目前为止,我最喜欢的是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年3月
这是我汇总的.NET中HTML到PDF转换的选项列表(有些是免费的,有些是付费的)
GemBox.Document
PDF变形.Net
HtmlRenderer.PdfSharp
木偶夏普
环氧乙烷
WnvHtmlToPdf_x64
铁Pdf
尖顶PDF
NET的免费Spire.PDF(社区版本)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
邮编
PDFtron
WkHtmlToXSharp
选择PDF
如果以上选项均无济于事,您可以随时搜索NuGet软件包 https://www.nuget.org/packages?q=html+pdf
大多数HTML到PDF转换器都依靠IE来进行HTML解析和渲染。当用户更新其IE时,这可能会中断。这里是不依赖IE的一种。
代码是这样的:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
像许多其他转换器一样,您可以传递文本,文件名或网址。结果可以保存到文件或流中。
我强烈建议NReco。它具有免费和付费版本,非常值得。它在后台使用wkhtmtopdf,但是您只需要一个程序集。太棒了
使用示例:
通过NuGet安装。
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
免责声明:我不是开发人员,只是该项目的支持者:)
Winnovative提供了一个支持HTML输入的.Net PDF库。他们提供了无限的免费试用。根据您希望如何部署项目,这可能就足够了。
如果您真的不需要真正的.Net PDF库,则有许多免费的HTML到PDF工具,其中许多都可以从命令行运行。
一种解决方案是选择其中一个,然后用C#编写一个薄包装纸。例如,如本教程中所述。
我使用了ExpertPDF Html到Pdf转换器。做一个体面的工作。不幸的是,它不是免费的。
还有一个新的基于Web的文档生成应用程序DocRaptor.com。似乎易于使用,并且有一个免费选项。
对于HTML到PDF的需求有个好消息。如该答案所示,W3C标准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容器的数据一起使用。
我在Azure上开发了SaaS版本。它使从WebApi或任何.Net应用程序,服务,Azure网站,Azure Webjob(无论运行什么.Net)中使用它变得更加容易。
免费帐户可用。
以下是使用iTextSharp(iTextSharp + itextsharp.xmlworker)将html + css转换为PDF的示例
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();
}
PDF Vision很好。但是,您必须具有“完全信任”才能使用它。我已经通过电子邮件发送了询问,为什么我的HTML不能在服务器上转换,但是在localhost上可以正常工作。
我发现以下库在将html转换为pdf时更有效。
nuget:https : //www.nuget.org/packages/Select.HtmlToPdf/
不久前我也在寻找这个。我遇到了HTMLDOC http://www.easysw.com/htmldoc/,这是一个免费的开源命令行应用程序,它以HTML文件为参数并从中弹出PDF。对于我的副项目来说,这对我来说效果很好,但这完全取决于您的实际需求。
该公司出售已编译的二进制文件,但您可以从源代码中免费下载和编译并免费使用。我设法编译了一个最新的修订版(适用于1.9版),并且打算在几天内为其发布一个二进制安装程序,因此,如果您有兴趣,我可以在发布该链接后立即提供指向该链接的链接。
编辑(2014年2月25日):似乎文档和网站已移至http://www.msweet.org/projects.php?Z1
如果您需要以pdf格式完美呈现html,则需要使用商业库。
ExpertPdf HTML到Pdf转换器非常易于使用,并且支持最新的html5 / css3。您可以将整个网址转换为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解决方案是TuesPechkin库,它是wkhtmltopdf本机库的包装。
现在,我已经使用单线程版本将数千个HTML字符串转换为PDF文件,并且看起来效果很好。它应该也可以在多线程环境(例如IIS)中工作,但是我还没有对此进行测试。
另外,由于我想使用最新版本的wkhtmltopdf(在撰写本文时为0.12.5),因此我从官方网站下载了DLL,将其复制到我的项目根目录,将copy设置为output,然后将库初始化为所以:
var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));
上面的代码将完全查找 “ wkhtmltox.dll”,因此请不要重命名该文件。我使用了DLL的64位版本。
请确保您已阅读多线程环境的说明,因为每个应用程序生命周期只需初始化一次,因此您需要将其放在单个实例中。
No tests are run because no tests are loaded or the selected tests are disabled
谷歌搜索也没有帮助
我发现并用于生成javascript和样式的PDF渲染视图或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");
详细的文章: 如何在asp.net C#中将HTML转换为PDF
作为HiQPdf软件的代表,我相信最好的解决方案是HiQPdf HTML .NET的PDF到PDF转换器。它包含市场上最先进的HTML5,CSS3,SVG和JavaScript渲染引擎。还有一个免费版本的HTML to PDF库,您可以使用它免费生成多达3个PDF页面。从HTML页面生成PDF作为byte []的最小C#代码是:
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);
您可以在HiQPdf HTML to PDF Converter示例库中找到有关ASP.NET和MVC的更详细的示例。
大多数项目很可能会包装C / C ++引擎,而不是从头开始实现C#解决方案。尝试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从ASP.NET应用程序转换为PDF,而无需使用其他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
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