在.NET中将HTML转换为PDF

我想通过将HTML内容传递给函数来生成PDF。我已经为此使用了iTextSharp,但是当它遇到表格并且布局变得凌乱时,它的表现并不理想。

有没有更好的办法?

Stafan凯2020/03/22 20:17:46

好的,使用这项技术。

src可以从这里下载,需要nant

2020/03/22 20:17:46

使用Winnovative HTML到PDF转换器,您可以在一行中转换HTML字符串

byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);

基本URL用于解析HTML字符串中相对URL引用的图像。另外,您可以在HTML中使用完整的URL或使用src =“ data:image / png”嵌入图像作为图像标签。

为了回答有关Winnovative转换器的“ fubaar”用户评论,必须进行更正。该转换器不使用IE作为渲染引擎。它实际上不依赖于任何已安装的软件,并且呈现与WebKit引擎兼容。

2020/03/22 20:17:46

到目前为止,似乎最好的免费 .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位版本。

确保阅读多线程环境的说明,因为每个应用程序生命周期只需初始化一次,因此您需要将其放在单个实例中。

DavaidTony宝儿2020/03/22 20:17:46

尝试使用此PDF Duo .Net转换组件,无需使用其他dll即可HTML从ASP.NET应用程序转换为PDF

您可以传递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

路易Near番长2020/03/22 20:17:46

作为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的更详细的示例

神乐阿飞Itachi2020/03/22 20:17:46

这是pruiz的wkhtmltopdf.dll 的包装器

还有Codaxy的wkhtmltopdf.exe 的包装器
-也在nuget上

蛋蛋2020/03/22 20:17:46

这是一个免费的库,非常容易工作: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
GOItachi老丝2020/03/22 20:17:46

我发现并用于生成javascript和样式的PDF(呈现视图或html页面)的PDF的最佳工具是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;
}
小胖2020/03/22 20:17:46

如果您需要以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文档直接保存到磁盘上的文件流中。

神无樱2020/03/22 20:17:46

我是Rotativa软件包的作者。它允许直接从剃刀视图创建PDF文件:

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

使用起来很简单,并且可以完全控制布局,因为可以将剃刀视图与来自Model和ViewBag容器的数据一起使用。

我在Azure上开发了SaaS版本。它使从WebApi或任何.Net应用程序,服务,Azure网站,Azure Webjob(无论运行什么.Net)中使用它变得更加容易。

http://www.rotativahq.com/

免费帐户可用。

LGil2020/03/22 20:17:46

不久前我也在寻找这个。我遇到了HTMLDOC http://www.easysw.com/htmldoc/,这是一个免费的开源命令行应用程序,它以HTML文件作为参数,并从中弹出PDF。对于我的辅助项目,它对我来说效果很好,但这完全取决于您的实际需求。

该公司出售已编译的二进制文件,但您可以从源代码中免费下载和编译并免费使用。我设法编译了一个最新的修订版(适用于1.9版),我打算在几天内为其发布一个二进制安装程序,因此,如果您有兴趣,我可以在发布它后立即提供一个链接。

编辑(2014年2月25日):似乎文档和网站已移至http://www.msweet.org/projects.php?Z1

猴子2020/03/22 20:17:46

我发现以下库在将html转换为pdf时更有效。
nugethttps : //www.nuget.org/packages/Select.HtmlToPdf/

伽罗2020/03/22 20:17:46

PDF Vision很好。但是,您必须具有“完全信任”才能使用它。我已经通过电子邮件发送了询问,为什么我的HTML不能在服务器上进行转换,但是在localhost上运行良好。

乐Mandy2020/03/22 20:17:46

以下是使用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();
}
小宇宙2020/03/22 20:17:46

这取决于您有任何其他要求。

一个真正简单但不容易部署的解决方案是使用WebBrowser控件加载HTML,然后使用Print方法打印到本地安装的PDF打印机。有几种免费的PDF打印机可用,并且WebBrowser控件是.Net框架的一部分。

编辑:如果您的HTML是XHTML,则可以使用PDFizer来完成这项工作。

GOL2020/03/22 20:17:46

您可以从无头模式使用Google Chrome打印到pdf功能。我发现这是最简单但最可靠的方法。

var url = "https://stackoverflow.com/questions/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();
    }

Sam樱2020/03/22 20:17:45

2018年更新,让我们使用标准的HTML + CSS = PDF公式!

对于HTML到PDF的需求有个好消息。该答案所示W3C标准css-break-3将解决问题 ……这是一个候选建议,计划在经过测试后在2017年或2018年转变为最终建议。

作为非标准的解决方案,有一些针对C#的插件,如print-css.rocks所示

老丝Sam2020/03/22 20:17:45

还有一个新的基于Web的文档生成应用程序DocRaptor.com似乎易于使用,并且有一个免费选项。

樱小胖Mandy2020/03/22 20:17:45

我使用了ExpertPDF Html到Pdf转换器做一个体面的工作。不幸的是,它不是免费的。

米亚樱2020/03/22 20:17:45

如果您真的不需要真正的.Net PDF库,则有许多免费的HTML到PDF工具,其中许多都可以从命令行运行。

一种解决方案是选择其中一个,然后用C#编写一个薄包装纸。例如,如本教程中所述

Mandy村村2020/03/22 20:17:45

基本PDF可用于将HTML转换为PDFC#示例链接到此处的示例是基于ASP.NET的,但是可以从Windows Forms,WPF,ASP.NET Webforms和ASP.NET MVC中使用该库。该库提供使用不同HTML呈现引擎的选项:Internet Explorer(默认)和WebKit(最佳输出)。

如果您有资格,则可以通过社区许可计划免费获得整套控件(也包括商业应用程序)社区许可证是完整的产品,没有任何限制或水印。

注意:我为Syncfusion工作。

Itachi阿飞2020/03/22 20:17:45

上次更新时间:2020年3月

这是我汇总的.NET中HTML到PDF转换的选项列表(有些是免费的,有些是付费的)

如果以上选项均无济于事,您可以随时搜索NuGet软件包 https://www.nuget.org/packages?q=html+pdf

斯丁Sam2020/03/22 20:17:45

Winnovative提供了一个支持HTML输入的.Net PDF库。他们提供无限的免费试用根据您希望如何部署项目,这可能就足够了。

2020/03/22 20:17:45

大多数HTML到PDF转换器都依靠IE来进行HTML解析和渲染。当用户更新其IE时,这可能会中断。是不依赖IE的一种。

代码是这样的:

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

像许多其他转换器一样,您可以传递文本,文件名或网址。结果可以保存到文件或流中。

2020/03/22 20:17:45

我强烈建议NReco认真对待。它具有免费和付费版本,非常值得。它在后台使用wkhtmtopdf,但是您只需要一个程序集。太棒了

使用示例:

通过NuGet安装

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

免责声明:我不是开发人员,只是该项目的支持者:)

凯西里2020/03/22 20:17:45

我最近进行了关于HTML到PDF转换的PoC,并希望分享我的结果。

到目前为止,我最喜欢的是OpenHtmlToPdf

该工具的优点:

  • 很好的HTML兼容性(例如,这是我的示例中唯一的工具,当一个表跨越多个页面时,它可以正确地重复表头)
  • 流利的API
  • 免费和开源(Creative Commons Attribution 3.0许可证
  • 可通过NuGet获得

其他测试工具:

斯丁前端2020/03/22 20:17:45

更新:现在我推荐在wkhtmltopdf上使用PupeteerSharp。

尝试wkhtmtopdf这是到目前为止我发现的最好的工具。

对于.NET,您可以使用此小型库轻松调用wkhtmtopdf命令行实用程序。