在.NET中将HTML转换为PDF


425

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

有没有更好的办法?


您可以为此使用GemBox.Document。此外在这里你可以找到HTML文件转换成PDF文件中的示例代码。
Mario Z

您使用哪个版本的iTextSharp,可以共享html吗?
Amedee Van Gasse

仍然没有我对其他信息的要求的答案。如果您使用的是HTMLWorker或XMLWorker,也请添加。
Amedee Van Gasse

.net核心呢?
Piero Alberto

2019年9月:我添加了一个新的答案有些列出的选项都是免费他人支付和一些可作为.NET的核心stackoverflow.com/questions/564650/...
毛里西奥·格拉西亚·古铁雷斯

Answers:


198

编辑: 使用PdfSharp的PDF 新建议HTML渲染器

(尝试过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;
    }

一个非常好的替代品是一个免费版本iTextSharp的

在4.1.6版之前,iTextSharp已获得LGPL许可证的许可,在4.16版之前(或可能还有叉子),它们可以作为软件包使用并可以免费使用。当然,有人可以使用续订的5+ 付费版本

我试图整合 wkhtmltopdf解决方案到我的项目中,但遇到了很多障碍。

我个人会避免使用 由于以下原因,在Hosted Enterprise应用程序上基于wkhtmltopdf的解决方案。

  1. 首先wkhtmltopdf是C ++实现的,而不是C#实现的,您将遇到将其嵌入到C#代码中的各种问题,尤其是在项目的32位和64位版本之间切换时。为了避免在不同的机器上出现“无效的格式异常”,不得不尝试几种变通方法,包括条件项目构建等。
  2. 如果您管理自己的虚拟机就可以了。但是,如果您的项目在诸如(Azure (TuesPenchin作者提到过,天蓝色实际上是不可能的))等受限环境中运行的,则 Elastic Beanstalk等),那么仅配置该环境以使wkhtmltopdf正常工作是一场噩梦。
  3. wkhtmltopdf在服务器中创建文件,因此您必须管理用户权限并授予对wkhtmltopdf运行位置的“写入”访问权限。
  4. Wkhtmltopdf作为独立应用程序运行,因此它不受IIS应用程序池管理。因此,您必须将其作为服务托管在另一台计算机上,否则您将在生产服务器中遇到处理高峰和内存消耗问题。
  5. 它使用临时文件来生成pdf,在像AWS EC2这样磁盘I / O确实很慢的情况下,这是一个很大的性能问题。
  6. 许多用户报告的最讨厌的“无法加载DLL'wkhtmltox.dll'”错误。

--- 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应用程序,它们还管理线程安全性等。


2
感谢您更新您的帖子。我将尝试PdfSharp。你节省了我很多时间。
约翰·亨克尔

1
PdfSharp在性能方面表现不错,但对我来说却无法正确渲染浮点数。幸运的是,我可以更改标记以使用好的旧表,PdfSharp可以很好地处理它们。
Gebb

3
我们尝试了HtmlRenderer。不加载任何CSS时,这确实非常快。但是,当我们尝试应用CSS(Bootstrap加上一些定制)时,CSS解析花费了一段时间(我们可能可以缓解),并且渲染与网页完全不同。
OutstandingBill

1
@ user2347528-查看HtmlRenderer.PdfSharp的源代码,没有办法解决此问题-它仅将总页面高度和剪辑带入每个PDF页面,这确实很不幸-这意味着带有此库的多页PDF确实可以无法完成。
Bungle先生

3
BS。这将创建HTML图像,并将该图像添加到pdf文件中。这根本不是真正的PDF。此外,PDF是矢量图形格式-您可以无限滚动-当然,除非PDF由光栅图形组成(这是该库生成的)。
Stefan Steiger

191

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

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

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


17
支持.NET
Kiquenet

6
它是一个独立的可执行文件。您可以将其作为一个进程启动,将HTML文档的URL作为参数传递。
Marek

46
@bamccaig我已经知道了=)github.com/gmanny/Pechkin它公开了库的每个可用功能,并且还具有用于多个线程的包装器。它在NuGet上。
Gman 2012年


7
@AdamMoszczyński:来自Wikipedia:LGPL允许开发人员和公司使用LGPL软件并将其集成到他们自己的(甚至是专有的)软件中,而无需(按严格的copyleft的规定)发布他们自己的软件部分的源代码。
奥利弗

34

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

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

该工具的优点:

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

其他测试工具:


为此,我为此+1测试了HtmlRenderer for PdfSharp,但是遇到了太多的分页符问题。在这个项目中,我可以忍受对wkHtmlToPdf的依赖关系,因此该解决方案很棒-它可以完美呈现HTML。
jmdon

看起来很漂亮,但是哇,花了很长时间。30秒,带有引导主题等等,页面非常简单,但是仍然如此。
Nicholas Petersen

来自IronPDF的Stephanie在这里。这是有关如何使用IronPDF在C#中将html转换为PDF的代码示例。可以在我们网站上的html至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");
Stephanie

我使用了iText pdfHtml,但不支持background-color。OpenHtmlToPdf可以免费完美运行。
Hp93

我同意OpenHtmlToPdf的优势。此外,它支持与ILMerge合并的.exe和.dll。
saygley

30

上次更新时间:2020年3月

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

如果以上选项均无济于事,您可以随时搜索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);

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


35
它没有用,因为您必须购买该库
d1jhoni1b 2013年

47
d1jhoni1b,这怎么使它没有用?如果它是一种付费工具,那么它可能会很昂贵,但仅凭该标准并不是没有用的。
Don Rolling

3
确实是EO.Pdf不使用IE。但是它似乎确实在后台生成了Webkit浏览器的32位实例。检查您的进程列表,您将看到它们是指向EO.PDF dll的rundll32.exe实例。因此,我认为这仍然有些拙劣。
马特

1
它不支持media =“ print”,这确实很痛苦。
Marat Faskhiev

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
看起来确实非常有用。值得注意的是,截至今天(15/10/15),它是wkhtmtopdf(作为Nuget软件包)下载最多的.Net包装器。
ken2k 2015年

3
尝试过,很遗憾,我无法使其在azure的网页上运行。
gabriel14 2015年

当我在计算机上本地运行该库时,该库运行良好,但是在托管服务器上,我随机看到以下错误。Pdf有时会生成,但有时会引发以下错误。“错误。在处理您的请求时发生错误。无法生成PDF :(退出代码:1)”
user2347528,2016年

wkhtmtopdf取决于GDI +,如果您在Mono / Linux上运行,则取决于x服务器。因此,这对服务器环境没有用...
nuzzolilo

我在pdf中看到了它的良好效果,并按预期工作,但是质量有点问题,我们可以改善这一点吗?
巴拉特(Bharat)

13

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


4
请记住,当我们上次检查winnovative与IE9不兼容时(因为他们使用的是IE9中已删除的IE GDI渲染引擎)。因此,如果您在使用IE9的计算机上安装了IE9,则转换将无法进行。在您阅读本文时,他们可能已经修复了该问题,但是许多商业组件都使用IE渲染引擎,并且与IE9互不兼容,因此值得检查。
fubaar 2011年

Winnovative是最容易设置的,开箱即用。但是:1.它不适用于Azure网站,仅适用于CloudApp。2.速度很慢,在Azure D1 VM上生成简单的PDF需要8秒钟的时间
jsgoupil 2015年

确认。真的很慢。我与wkhtmltopdf进行了比较。
Marat Faskhiev

Winnovative库非常昂贵。开发人员许可约为650美元,其他许可约为1200美元。
Abhijeet Nagre

Winnovative HTML to PDF Converter可在Azure网站中使用,并且不依赖于IE中的注释。请在网站上检查Winnovative HTML to PDF for Azure解决方案,网址为:winnovative-software.com/html-to-pdf-converter-azure.aspx。为了缩短转换时间,请设置HtmlToPdf.ConversionDelay =0。转换器使用默认延迟来处理HTML页面,这些HTML页面在页面加载后会更新其内容。
EvoPdf

9

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

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

注意:我为Syncfusion工作。




7

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


7

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

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

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


1
由print-css.rocks链接的解决方案,PDFreactor的成本为$ 2,950.00,Prince的成本为$ 3800,Antenna House Formatter V7的成本为$ 5,000.00。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

为了允许IIS中的ASP.NET具有写访问权限运行外部程序,应用程序池>高级设置>身份>设置为“ LocalSystem”
mjb

4

ABCpdf.NET(http://www.websupergoo.com/abcpdf-5.htm)

我们使用并推荐。

很好的组件,它不仅可以像图像一样将网页转换为PDF,还可以真正转换文本,图像,格式等。

它不是免费的,但很便宜。


10
我们已经使用了两年,发现使用起来非常痛苦。支持不佳,由于围绕IE呈现引擎进行了包装,因此非常挑剔,图像质量和压缩性较差,自定义请求的能力有限,无法处理某些更高级的使用情况(例如提供cookie和请求标头)。我想它的效果取决于您需要它做什么。
moribvndvs 2012年

3
+1表示ABCPdf。前一位评论者一定没有与我提供过同样的支持,他们总是写信给我,并且总是为我们遇到的任何问题提供解决方案。他们现在支持使用Gecko代替IE作为渲染引擎。您可以在运行时选择一个。ABC使您可以做PDF可以做的任何事情。
史蒂夫

12
太昂贵,支持不佳。我根本不推荐abcPDF。
Vivek 2012年

在过去的六年中,我也使用过它,说实话,它为我们服务很好。
toepoke.co.uk 2014年

这个答案不是stackoverflow.com/a/2182212/471213的另一个重复吗?我的意思是,谁是其他人下属与程序至少没有提供的示例代码几行
USR-本地ΕΨΗΕΛΩΝ

4

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

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

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

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

http://www.rotativahq.com/

免费帐户可用。


这是否依赖于Itextsharp,因此您需要拥有itextsharp的许可证才能使用它?
米卡·阿曼特鲁特

2
@MicahArmantrout不,不是。它使用wkhtmltopdf.exe创建PDF文件。无需许可证。
Giorgio Bozio

@ MicahArmantrout,iTextSharp还是GNU GPL吗?gnu.org/licenses/agpl.html
Pranav Singh,

出于技术和法律原因,我们不建议使用iText(Sharp)5之前的版本。 stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout

4

以下是使用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();
}

请注意,iTextSharp可与XHtml一起使用,并且对html的质量非常敏感。它会中断,而SelectPdf和HiqPdf不会。
野人

3

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

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

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


3

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



2

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

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

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


嗨,您能提供一个链接以及有关如何在c#asp.net中使用它的指南
吗?

static.persistedthoughts.com/htmldoc_1.9.1586-setup.exe 请注意,这是一个命令行程序。您必须从应用程序内部执行它才能使其正常工作。您可以从以下内容的第4章中找到有关其自变量和注意事项的文档:easysw.com/htmldoc/documentation.php
enriquein 2010年

我不确定现在这有什么用,但是如果有帮助的话:dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein 2013年

该网站不再运营。
汤姆·温特

2

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


如果您需要pdf格式的完美html渲染,则不必使用商业库
obayhan 2015年

我开始相信这一点。我已经试过5个免费赠品,而且它们都有一件事对我不利。从窒息到超出简单的hello世界的页面,再到看起来糟糕透顶-我认为我将不得不为真正的转换器花些钱。每个商业产品的样本实际上都以您期望PDF出现的方式工作。
赫尔·米汉

@obayhan-我想相信你。也许您可以与我们分享指向您发现如此出色的任何工具的链接。
Peter Wone

@PeterWone在顶部,您可以很容易地看到许多开源替代方案。让某人分享相同的东西只是在浪费时间。但是,如果您尝试了所有这些方法并且不满意,我希望您可以在这些方法下分享您对不满意的内容的评论,然后可能会有助于您增加知识。
obayhan

@obayhan-为什么要重复别人已经做的事情?它们分为三类:不是真正的免费,不可接受的依赖项,如wkhtmltopdf或IE9,以及HTMLSharp for PDFSharp。PDF#的HR是纯C#中唯一的HR,它的分页工作非常糟糕-它呈现一页很长的页面并将其切成小段,通常会切入文本行。如果我有时间完全重写渲染器,则适用于PDF#的HR会赢得人们的青睐:它速度快,免费且没有依赖性。但我担心那将是一个全新的渲染器。
Peter Wone

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,将其复制到我的项目根目录,将copy设置为output,然后将库初始化为所以:

var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));

上面的代码将完全查找 “ wkhtmltox.dll”,因此请不要重命名该文件。我使用了DLL的64位版本。

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


1

这是pruiz的wkhtmltopdf.dll 的包装器

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


任何文档或教程如何使用它们?那里只有源代码,没有任何文档
Burjua 2012年

1
下载代码并查看单元测试。那应该给您一些好的用法示例。
加菲猫2012年

并没有真正的帮助,实际上我什至无法测试pruiz解决方案是否起作用,它说No tests are run because no tests are loaded or the selected tests are disabled谷歌搜索也没有帮助
Burjua 2012年

@Burjua这通常与您使用的测试运行程序的版本有关。然而,尝试我的GitHub的项目现场打开一个问题,我会尽力帮助你..
巴勃罗·鲁伊斯·加西亚

嗨,这个包装器工作正常,但未显示我的Google饼图。因此,在找到解决方案之前,我必须找到另一个解决方案。
安德烈·隆巴德

1

我发现并用于生成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;
}

您可以共享完整的源代码吗?我是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");

详细的文章: 如何在asp.net C#中将HTML转换为PDF


Spire生成的PDF文件只是图像。有些css甚至不正确,例如忽略粗体。
野人

请参阅我关于将PDF生成为图像的问题的答复:e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage

尖顶是我从本页尝试过的第4个,我想这是最好的,谢谢。
MDave

1

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


1
产生不错的结果,但是像SelectPdf一样,它可能对您的构建时间和部署程序包大小产生重大影响。这几乎使我的Visual Studio构建时间加倍。我也很难把它填满我的页面-html太小了-在这方面SelectPdf做得更好。
野人

1
HTML内容填充页面取决于HtmlToPdf.BrowserWidth属性。默认情况下为1200像素,但您可以将其设置为800像素,HTML可以很好地填充整个PDF页面。您可以在hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf

1
也不支持.NET Core。
Taylor Buchanan

1

大多数项目很可能会包装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

0

尝试使用此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


1
BitDefender报告:“检测到恶意软件!该页面的访问已被阻止。”。我对这份报告是真实的还是假阳性没有意见。
GeoffM

0

要将C#中的HTML转换为PDF,请使用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 2012年

在海报防御中,网站确实将产品评为非常不错。
汤姆·温特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.