在.NET中将HTML转换为PDF

时间:2009-02-19 10:21:22

标签: c# html pdf itextsharp

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

有更好的方法吗?

40 个答案:

答案 0 :(得分:180)

试试wkhtmtopdf。这是迄今为止我找到的最好的工具。

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

答案 1 :(得分:171)

编辑:新建议  HTML Renderer for PDF using PdfSharp

(尝试wkhtmltopdf并建议避免使用之后)

HtmlRenderer.PdfSharp是 100%完全C#托管代码易于使用,线程安全,最重要的是免费 New BSD License解决方案。

用法

  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;
    }
    
  3. 非常好的替代 Free Version iTextSharp

    直到版本4.1.6 iTextSharp根据LGPL许可证获得许可,版本直到4.16(或者也可能有叉子)作为包提供,可以自由使用。当然有人可以使用续5 + paid version

    我尝试将 wkhtmltopdf 解决方案整合到我的项目中并遇到了一些障碍。

    出于以下原因,我个人会避免在托管企业应用程序中使用 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'“报告错误 许多用户。
    7. --- PRE编辑部分---

      对于想要在更简单的应用程序/环境中从html生成pdf的任何人,我将旧帖子作为建议。

      TuesPechkin

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

      或特别针对 MVC Web应用程序 (但我认为您可以在任何.net应用程序中使用它)

      Rotativa

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

      他们都利用了 用于将html转换为pdf的wkhtmtopdf二进制文件。它使用webkit引擎呈现页面,因此它也可以解析 css样式表

      它们提供易于使用的与C#的无缝集成。

      Rotativa还可以从任何 Razor 视图直接生成PDF。

      此外,对于真实世界的Web应用程序,他们还管理线程安全等...

答案 2 :(得分:29)

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

代码是这样的:

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

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

答案 3 :(得分:27)

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

我最喜欢的是OpenHtmlToPdf

此工具的优点:

  • 非常好的HTML兼容性(例如,它是我的示例中唯一一个在表格跨越多个页面时正确重复表头的工具)
  • Fluent API
  • 免费和开放源代码(Creative Commons Attribution 3.0 license
  • 可通过NuGet
  • 获取

其他测试工具:

答案 4 :(得分:20)

我强烈推荐NReco。它有免费和付费版本,非常值得。它在后台使用wkhtmtopdf,但你只需要一个程序集。奇妙。

使用示例:

通过NuGet安装。

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

免责声明:我不是开发人员,只是该项目的粉丝:)

答案 5 :(得分:13)

Winnovative提供支持HTML输入的.Net PDF库。他们提供无限free trial。根据您希望部署项目的方式,这可能就足够了。

答案 6 :(得分:10)

最后更新时间:2019年12月

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

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

答案 7 :(得分:7)

我使用了ExpertPDF Html To Pdf Converter。做得体。不幸的是,这不是免费的。

答案 8 :(得分:7)

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

答案 9 :(得分:7)

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

wchar_t

答案 10 :(得分:7)

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

如果您符合资格,可通过community license计划免费提供整套控件(商业应用程序)。社区许可是完整的产品,没有任何限制或水印。

注意:我为Syncfusion工作。

答案 11 :(得分:6)

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

HTML-to-PDF要求有好消息。如this answer showed W3C标准css-break-3将解决问题 ......这是一项候选建议书,计划在测试后于2017年或2018年转为最终建议书。< / p>

由于不是那么标准,有一些解决方案,带有C#插件,如print-css.rocks所示。

答案 12 :(得分:6)

如果你真的不需要真正的.Net PDF库,那么有很多free HTML to PDF tools,其中很多都可以从命令行运行。

一种解决方案是选择其中一种,然后在C#中编写一个薄包装器。例如,如this tutorial中所做的那样。

答案 13 :(得分:4)

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

我们使用并推荐。

非常好的组件,它不仅将网页转换为像图像一样的PDF,而且真正转换文本,图像,格式等......

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

答案 14 :(得分: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();
}

答案 15 :(得分:3)

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

答案 16 :(得分:3)

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

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

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

答案 17 :(得分:3)

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

答案 18 :(得分:2)

如果您需要使用pdf格式的完美html渲染,则需要使用商业库。

ExpertPdf Html To Pdf Converter非常易于使用,它支持最新的html5 / css3。您可以将整个网址转换为pdf:

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);

或html字符串:

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);

您还可以直接将生成的pdf文档保存到磁盘上的文件流中。

答案 19 :(得分:2)

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

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

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

我在Azure上开发了一个SaaS版本。它使WebApi或任何.Net应用程序,服务,Azure网站,Azure webjob,无论运行.Net都更容易使用它。

http://www.rotativahq.com/

免费帐户。

答案 20 :(得分:2)

我一直在寻找这个。我遇到了HTMLDOC http://www.easysw.com/htmldoc/这是一个免费的开源命令行应用程序,它将HTML文件作为参数并从中吐出PDF。这对我来说非常适合我的项目,但这一切都取决于你真正需要的东西。

制作它的公司销售已编译的二进制文件,但您可以从源代码下载和编译,并免费使用它。我设法编译了一个非常新的版本(版本1.9),我打算在几天内发布它的二进制安装程序,所以如果你感兴趣我可以在发布后立即提供它的链接。

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

答案 21 :(得分:2)

到目前为止,似乎最好的免费 .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”匹配,因此请不要重命名该文件。我使用了DLL的64位版本。

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

答案 22 :(得分:2)

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

答案 23 :(得分:1)

作为HiQPdf软件的代表,我认为最佳解决方案是HiQPdf HTML to PDF converter for .NET。它包含市场上最先进的HTML5,CSS3,SVG和JavaScript渲染引擎。您还可以使用free version of the HTML to PDF library免费制作最多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 examples repository中找到有关ASP.NET和MVC的更详细示例。

答案 24 :(得分:1)

对于所有在 .net 5 中寻找可行解决方案的人来说,这里是您。

这是我的工作解决方案。

使用 wkhtmltopdf

  1. here 下载并安装 wkhtmltopdf 最新版本。
  2. 使用以下代码。
public static string HtmlToPdf(string outputFilenamePrefix, string[] urls,
    string[] options = null,
    string pdfHtmlToPdfExePath = @"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe")
{
    string urlsSeparatedBySpaces = string.Empty;
    try
    {
        //Determine inputs
        if ((urls == null) || (urls.Length == 0))
            throw new Exception("No input URLs provided for HtmlToPdf");
        else
            urlsSeparatedBySpaces = String.Join(" ", urls); //Concatenate URLs

        string outputFilename = outputFilenamePrefix + "_" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss-fff") + ".PDF"; // assemble destination PDF file name

        var p = new System.Diagnostics.Process()
        {
            StartInfo =
            {
                FileName = pdfHtmlToPdfExePath,
                Arguments = ((options == null) ? "" : string.Join(" ", options)) + " " + urlsSeparatedBySpaces + " " + outputFilename,
                UseShellExecute = false, // needs to be false in order to redirect output
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                RedirectStandardInput = true, // redirect all 3, as it should be all 3 or none
                WorkingDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location))
            }
        };

        p.Start();

        // read the output here...
        var output = p.StandardOutput.ReadToEnd();
        var errorOutput = p.StandardError.ReadToEnd();

        // ...then wait n milliseconds for exit (as after exit, it can't read the output)
        p.WaitForExit(60000);

        // read the exit code, close process
        int returnCode = p.ExitCode;
        p.Close();

        // if 0 or 2, it worked so return path of pdf
        if ((returnCode == 0) || (returnCode == 2))
            return outputFilename;
        else
            throw new Exception(errorOutput);
    }
    catch (Exception exc)
    {
        throw new Exception("Problem generating PDF from HTML, URLs: " + urlsSeparatedBySpaces + ", outputFilename: " + outputFilenamePrefix, exc);
    }
}
  1. 并将上述方法调用为 HtmlToPdf("test", new string[] { "https://www.google.com" }, new string[] { "-s A5" });
  2. 如果您需要将HTML字符串转换为PDF,请调整上述方法并将Arguments替换为Process StartInfo$@"/C echo | set /p=""{htmlText}"" | ""{pdfHtmlToPdfExePath}"" {((options == null) ? "" : string.Join(" ", options))} - ""C:\Users\xxxx\Desktop\{outputFilename}""";

这种方法的缺点:

  1. 发布此答案时 wkhtmltopdf 的最新版本不支持最新的 HTML5CSS3。因此,如果您尝试将任何 html 导出为 CSS GRID,那么输出将不会如预期。
  2. 您需要处理并发问题。

使用 chrome headless

  1. here 下载并安装最新的 Chrome 浏览器。
  2. 使用以下代码。
var p = new System.Diagnostics.Process()
{
    StartInfo =
    {
        FileName = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe",
        Arguments = @"/C --headless --disable-gpu --run-all-compositor-stages-before-draw --print-to-pdf-no-header --print-to-pdf=""C:/Users/Abdul Rahman/Desktop/test.pdf"" ""C:/Users/Abdul Rahman/Desktop/grid.html""",
    }
};

p.Start();

// ...then wait n milliseconds for exit (as after exit, it can't read the output)
p.WaitForExit(60000);

// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
  1. 这会将 html 文件转换为 pdf 文件。
  2. 如果您需要将某些 url 转换为 pdf,请使用以下作为 ArgumentProcess StartInfo

@"/C --headless --disable-gpu --run-all-compositor-stages-before-draw --print-to-pdf-no-header --print-to-pdf=""C:/Users/Abdul Rahman/Desktop/test.pdf"" ""https://www.google.com""",

这种方法的缺点:

  1. 这与最新的 HTML5CSS3 功能按预期工作。输出将与您在浏览器中查看的相同,但通过 IIS 运行时,您需要在 AppliactionPool 标识下运行应用程序的 LocalSystem,或者您需要提供 read/{{1} } 访问write

使用 IISUSRS

  1. 安装 Nuget 软件包 Selenium WebDriverSelenium.WebDriver
  2. 使用以下代码。
Selenium.WebDriver.ChromeDriver

这种方法的优点:

  1. 这只需要安装 Nuget 并使用最新的 public async Task<byte[]> ConvertHtmlToPdf(string html) { var directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), "ApplicationName"); Directory.CreateDirectory(directory); var filePath = Path.Combine(directory, $"{Guid.NewGuid()}.html"); await File.WriteAllTextAsync(filePath, html); var driverOptions = new ChromeOptions(); // In headless mode, PDF writing is enabled by default (tested with driver major version 85) driverOptions.AddArgument("headless"); using var driver = new ChromeDriver(driverOptions); driver.Navigate().GoToUrl(filePath); // Output a PDF of the first page in A4 size at 90% scale var printOptions = new Dictionary<string, object> { { "paperWidth", 210 / 25.4 }, { "paperHeight", 297 / 25.4 }, { "scale", 0.9 }, { "pageRanges", "1" } }; var printOutput = driver.ExecuteChromeCommandWithResult("Page.printToPDF", printOptions) as Dictionary<string, object>; var pdf = Convert.FromBase64String(printOutput["data"] as string); File.Delete(filePath); return pdf; } HTML5 功能按预期工作。输出将与您在浏览器中查看的相同。

这是我的工作项目存储库的链接 - HtmlToPdf

在几乎花了 2 天的可用选项之后,我得出了上述答案,并最终实施了基于 CSS3 的解决方案及其工作。希望这可以帮助您并节省您的时间。

答案 25 :(得分:1)

这是一个免费库,非常容易使用: OpenHtmlToPdf

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 401 for URL: https://login.microsoftonline.com/"myTenantID"/oauth2/token
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at com.nttdata.altemista.RateCardRest.getAccessToken(RateCardRest.java:38)
    at com.nttdata.altemista.RateCardRest.main(RateCardRest.java:74)

答案 26 :(得分:1)

我发现并用于生成javascript和样式渲染视图或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;
}

答案 27 :(得分:1)

这是pruiz的wkhtmltopdf.dll的a wrapper

a wrapper for Ckhxy的wkhtmltopdf.exe   - 还on nuget

答案 28 :(得分:0)

如果您使用的是itextsharp dll,则无需添加第三方dll(插件),我认为您使用的是htmlworker而不是使用xmlworker,您可以轻松地将html转换为pdf。

有些css不会工作,Supported CSS Full Explain with example Reference Click here


        MemoryStream memStream = new MemoryStream();
        TextReader xmlString = new StringReader(outXml);
        using (Document document = new Document())
        {
            PdfWriter writer = PdfWriter.GetInstance(document, memStream);
            //document.SetPageSize(iTextSharp.text.PageSize.A4);
            document.Open();
            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(outXml);
            MemoryStream ms = new MemoryStream(byteArray);
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, ms, System.Text.Encoding.UTF8);
            document.Close();
        }

        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.BinaryWrite(memStream.ToArray());
        Response.End();
        Response.Flush();

答案 29 :(得分:0)

PDFmyURL最近发布了一个用于网页/ HTML到PDF转换的.NET组件。这有一个非常用户友好的界面,例如:

PDFmyURL pdf = new PDFmyURL("yourlicensekey");
pdf.ConvertURL("http://www.example.com", Application.StartupPath + @"\example.pdf");

文档:PDFmyURL .NET component documentation

免责声明:我为拥有PDFmyURL的公司工作

答案 30 :(得分:0)

您还可以查看 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");

详细文章 How to convert HTML to PDF in asp.net C#

答案 31 :(得分:0)

如果您希望用户在浏览器中下载渲染页面的pdf,那么解决问题的最简单方法是

window.print(); 

在客户端,它将提示用户保存当前页面的pdf。您还可以通过链接样式

来自定义pdf的外观
<link rel="stylesheet" type="text/css" href="print.css" media="print">

print.css在打印时应用于html。

<强>限制

您无法在服务器端存储该文件。 用户提示打印页面,而不是手动保存页面。 页面必须在选项卡中呈现。

答案 32 :(得分:0)

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

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

基本URL用于解析HTML字符串中相对URL引用的图像。或者,您可以使用HTML中的完整网址或使用src =“data:image / png”嵌入图片作为图片代码。

在回答关于Winnovative转换器的'fubaar'用户评论时,需要进行修正。转换器不使用IE作为渲染引擎。它实际上不依赖于任何已安装的软件,并且渲染与WebKit引擎兼容。

答案 33 :(得分:0)

使用Aspose.HTML在.NET中将HTML轻松转换为PDF:

var htmlDocument = new HTMLDocument(dataDir + "input.html");

// Initialize PdfSaveOptions 
PdfSaveOptions options = new PdfSaveOptions
{
  JpegQuality = 100
};

// Output file path 
string outputPDF = dataDir + "output.pdf";
// Convert HTML to PDF
Converter.ConvertHTML(htmlDocument, options, outputPDF);

希望有帮助。否则,随时问我。

注意:我是Aspose的开发人员布道者。

答案 34 :(得分:0)

您可以使用WebBrowser控件的另一种技巧,下面是我完整的工作代码

在我的情况下,将Url分配给文本框控件

  protected void Page_Load(object sender, EventArgs e)
{

   txtweburl.Text = "https://www.google.com/";

 }

下面是使用线程生成screeen的代码

  protected void btnscreenshot_click(object sender, EventArgs e)
  {
    //  btnscreenshot.Visible = false;
    allpanels.Visible = true;
    Thread thread = new Thread(GenerateThumbnail);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();

}

private void GenerateThumbnail()
{
    //  btnscreenshot.Visible = false;
    WebBrowser webrowse = new WebBrowser();
    webrowse.ScrollBarsEnabled = false;
    webrowse.AllowNavigation = true;
    string url = txtweburl.Text.Trim();
    webrowse.Navigate(url);
    webrowse.Width = 1400;
    webrowse.Height = 50000;

    webrowse.DocumentCompleted += webbrowse_DocumentCompleted;
    while (webrowse.ReadyState != WebBrowserReadyState.Complete)
    {
        System.Windows.Forms.Application.DoEvents();
    }
}

在下面的代码中,下载后我将保存pdf文件

        private void webbrowse_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // btnscreenshot.Visible = false;
    string folderPath = Server.MapPath("~/ImageFiles/");

    WebBrowser webrowse = sender as WebBrowser;
    //Bitmap bitmap = new Bitmap(webrowse.Width, webrowse.Height);

    Bitmap bitmap = new Bitmap(webrowse.Width, webrowse.Height, PixelFormat.Format16bppRgb565);

    webrowse.DrawToBitmap(bitmap, webrowse.Bounds);


    string Systemimagedownloadpath = System.Configuration.ConfigurationManager.AppSettings["Systemimagedownloadpath"].ToString();
    string fullOutputPath = Systemimagedownloadpath + Request.QueryString["VisitedId"].ToString() + ".png";
    MemoryStream stream = new MemoryStream();
    bitmap.Save(fullOutputPath, System.Drawing.Imaging.ImageFormat.Jpeg);



    //generating pdf code 
     Document pdfDoc = new Document(new iTextSharp.text.Rectangle(1100f, 20000.25f));
     PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
     pdfDoc.Open();
     iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(fullOutputPath);   
     img.ScaleAbsoluteHeight(20000);
     img.ScaleAbsoluteWidth(1024);     
     pdfDoc.Add(img);
     pdfDoc.Close();
     //Download the PDF file.
     Response.ContentType = "application/pdf";
     Response.AddHeader("content-disposition", "attachment;filename=ImageExport.pdf");
     Response.Cache.SetCacheability(HttpCacheability.NoCache);
     Response.Write(pdfDoc);
     Response.End();


}

您也可以参考我最早的帖子以获取更多信息:Navigation to the webpage was canceled getting message in asp.net web form

答案 35 :(得分:0)

尝试使用此 PDF Duo .Net 转换组件,以便在不使用其他dll的情况下转换HTML to PDF from ASP.NET应用程序。

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

您可以在http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

找到的信息+ C#/ VB示例

答案 36 :(得分:0)

好的,使用这些技术......

可以从需要here

nant下载src

答案 37 :(得分:-1)

另一个建议是https://grabz.it尝试解决方案。

它们提供了一个很好的.NET API来捕获屏幕截图并以一种简单灵活的方式对其进行操作。

要在您的应用中使用它,您需要先获得key + secretdownload .NET SDK(它是免费的)。

现在是使用它的一个简短例子。

要使用API​​,您首先需要创建GrabzItClient类的实例,将您的应用程序密钥和应用程序密钥从GrabzIt帐户传递给构造函数,如下例所示:

//Create the GrabzItClient class
//Replace "APPLICATION KEY", "APPLICATION SECRET" with the values from your account!
private GrabzItClient grabzIt = GrabzItClient.Create("Sign in to view your Application Key", "Sign in to view your Application Secret");

现在,要将HTML转换为PDF,您需要执行以下操作:

grabzIt.HTMLToPDF("<html><body><h1>Hello World!</h1></body></html>");

您也可以转换为图片:

grabzIt.HTMLToImage("<html><body><h1>Hello World!</h1></body></html>");     

接下来,您需要保存图像。如果可以使用公共可访问的回调句柄,则可以使用两种可用的保存方法之一,Save,如果不可用,则使用SaveToCheck the documentation了解详情。

答案 38 :(得分:-1)

您可以创建HTML页面的位图,然后使用例如iTextSharp将位图插入PDF中,而不是直接将HTML解析为PDF。

这是一个如何获取URL位图的代码。我在SO的某个地方找到了它,如果我找到了源码,我会链接它。

public System.Drawing.Bitmap HTMLToImage(String strHTML)
{
    System.Drawing.Bitmap myBitmap = null;

    System.Threading.Thread myThread = new System.Threading.Thread(delegate()
    {
        // create a hidden web browser, which will navigate to the page
        System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser();
        // we don't want scrollbars on our image
        myWebBrowser.ScrollBarsEnabled = false;
        // don't let any errors shine through
        myWebBrowser.ScriptErrorsSuppressed = true;
        // let's load up that page!    
        myWebBrowser.Navigate("about:blank");

        // wait until the page is fully loaded
        while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
            System.Windows.Forms.Application.DoEvents();

        myWebBrowser.Document.Body.InnerHtml = strHTML;

        // set the size of our web browser to be the same size as the page
        int intScrollPadding = 20;
        int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding;
        int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding;
        myWebBrowser.Width = intDocumentWidth;
        myWebBrowser.Height = intDocumentHeight;
        // a bitmap that we will draw to
        myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding);
        // draw the web browser to the bitmap
        myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding));
    });
    myThread.SetApartmentState(System.Threading.ApartmentState.STA);
    myThread.Start();
    myThread.Join();

    return myBitmap;
}

答案 39 :(得分:-1)

To convert HTML to PDF in C# use 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是商业软件的标题,但标准版通常可以免费获得。