Converter HTML para PDF in.NET

quero gerar um PDF passando o conteúdo HTML para uma função. Eu fiz uso de iTextSharp para isso, mas ele não funciona bem quando ele encontra mesas e o layout apenas fica confuso.

Há uma maneira melhor?

Author: Amedee Van Gasse, 2009-02-19

30 answers

Tenta wkhtmtopdf . É a melhor ferramenta que encontrei até agora.

Para A. NET, poderá usar esta biblioteca pequena para invocar facilmente o utilitário de linha de comandos wkhtopdf.

 170
Author: Marko, 2015-03-25 08:53:35

Editar: Nova sugestão renderizador de HTML para PDF usando PdfSharp

(Depois de tentar o wkhtmltopdf e sugerir para evitá-lo)

Htmlrender.PdfSharp é um 100% totalmente C# código gerenciado, fácil usar thread-safe e, mais importante, GRÁTIS (Nova Licença BSD) solução.

Utilização

  1. Download Htmlrender.Pacote PdfSharp nuget.
  2. Usar O Exemplo Metodo.

    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;
    }
    

Uma alternativa muito boa é uma versão livre de iTextSharp

Até que a Versão 4.1.6 iTextSharp foi licenciada sob a licença LGPL e as versões até 4.16 (ou pode haver também garfos) estão disponíveis como pacotes e podem ser livremente utilizados. É claro que alguém pode usar a versão 5+ paga continuada .

Tentei integrar as soluções wkhtmltopdf no meu projecto e tive um monte de obstáculos.

Pessoalmente, evitaria utilizar soluções baseadas em wkhtmltopdf em aplicações empresariais hospedadas pelas seguintes razões.

  1. Em Primeiro Lugar, O wkhtmltopdf está implementado em C++ e não em C#, e você irá experimente vários problemas incorporando-o no seu código C# , especialmente ao mudar entre 32bit e 64bit builds do seu projecto. Teve que tentar vários workarounds, incluindo condicional construção de projectos, etc. etc. só para evitar "excepções de formato inválidas" em diferentes Niquel.
  2. Se gerires a tua própria máquina virtual, tudo bem. Mas se o teu projecto está a correr dentro de um ambiente restrito como (Azure (Na verdade, é impossível withing azure como mencionado pelo TuesPenchin autor) , É um pesadelo configurar esse ambiente apenas para o wkhtmltopdf funcionar.
  3. o wkhtmltopdf está a criar ficheiros no seu servidor, por isso tem de gerir as permissões do utilizador e conceder acesso "write" a onde o wkhtmltopdf está em execução.
  4. O Wkhtmltopdf está a funcionar como uma aplicação autónoma, por isso o seu não gerido pelo seu conjunto de aplicações IIS. Então você tem que hospedá-lo como um serviço em outra máquina ou você vai experimentar enorme processamento de picos e consumo de memória com a sua produção servidor.
  5. Ele usa arquivos temp para gerar o pdf, e em casos como AWS EC2 que tem disco realmente lento é um grande desempenho problema.
  6. Os mais odiados "Incapaz de carregar o DLL 'wkhtmltox.erro comunicado por muitos usuários.

--- secção Pré-editar---

Para quem quiser gerar pdf a partir de html em aplicações / ambientes mais simples, deixo o meu antigo post como sugestão.

TuesPechkin

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

Ou especialmente paraMVC Aplicações Web (Mas eu acho que você pode usá-lo em qualquer. net aplicação)

Rotativa

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

Ambos utilizam o binário do wkhtmtopdf para converter html para pdf. Que usa o motor webkit para desenhar as páginas para que também possa processar folhas de estilo CSS.

Eles fornecem fácil de usar integração sem emenda com C#.

{[[2]}a Rotativa também pode gerar directamente PDFs a partir de qualquer visão Da Lâmina .

Adicionalmente, a sério. world web applications they also manage thread safety etc...

 146
Author: Anestis Kivranoglou, 2016-10-24 10:34:55

A maioria do conversor HTML para PDF depende do IE para fazer o processamento e renderização HTML. Isso pode quebrar quando o usuário atualiza seu IE. aqui é um que não confia no IE.

O código é algo assim:

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

Como muitos outros conversores, você pode passar texto, Nome do arquivo ou Url. O resultado pode ser salvo em um arquivo ou fluxo.

 30
Author: Jason, 2013-09-29 07:21:40
A sério. Tem a versão gratuita e paga, e realmente vale a pena. Ele usa wkhtmtopdf em segundo plano, mas você só precisa de uma montagem. Fantastico.

Exemplo de Utilização:

Instalar via NuGet .

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

Disclaimer: eu não sou o desenvolvedor, apenas um fã do projeto:)

 20
Author: Kim Tranjan, 2015-04-23 19:53:38

Recentemente realizei um COP sobre conversão HTML para PDF e queria compartilhar meus resultados.

O meu favorito de longe é o OpenHtmlToPdf.

Vantagens desta ferramenta:

  • Compatibilidade HTML muito boa (por exemplo, era a única ferramenta no meu exemplo que repetia correctamente os cabeçalhos da tabela quando uma tabela abrangia várias páginas)
  • API fluente
  • Free and OpenSource (Creative Commons Attribution 3.0 license)
  • disponível via NuGet

Outras ferramentas testadas:

 19
Author: Markus, 2016-08-18 11:13:10

Winnovative oferece uma biblioteca PDF. Net que suporta a entrada em HTML. Eles oferecem um teste ilimitado livre. Dependendo de como você deseja implantar o seu projeto, isso pode ser suficiente.

 13
Author: Stewart, 2009-02-19 11:46:55

Usei ExpertPDF Html para conversor de Pdf. Faz um trabalho decente. Infelizmente, não é de graça.

 7
Author: charpdevel0p3r, 2010-10-18 12:30:00
Há também um novo aplicativo de geração de documentos baseado na web- DocRaptor.com . parece fácil de usar, e há uma opção livre.
 7
Author: Paul, 2010-10-28 06:35:09

Se você realmente não precisa de uma verdadeira biblioteca PDF. Net, existem inúmeros HTML livre para ferramentas PDF , Muitos dos quais podem ser executados a partir de uma linha de comandos.

Uma solução seria escolher uma dessas e depois escrever uma embalagem fina em torno dela em C#. Por exemplo, como feito em este tutorial.
 6
Author: Stewart, 2009-02-19 11:55:41

A actualização de 2018, e vamos usar o padrão HTML+CSS=equação PDF!

Há boas notícias para as exigências HTML-to-PDF. Como esta resposta mostrou, a norma W3C css-break-3 irá resolver o problema ... É uma recomendação candidata com plano para se transformar em recomendação definitiva em 2017 ou 2018, após os testes.

Como não-so-standard existem soluções, com plugins para C#, como mostrado por print-css.pedras.

 5
Author: Peter Krauss, 2018-03-16 10:18:38

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

Usamos e recomendamos.

Muito bom componente, ele não só converter uma página web para PDF como uma imagem, mas realmente converter texto, imagem, formatação, etc...

Não é grátis, mas é barato.
 4
Author: Christophe Trevisani Chavey, 2011-12-28 23:00:39

Essential PDF can be used to convert HTML to PDF: C# sample . A amostra aqui ligada é ASP.NET baseado, mas a biblioteca pode ser usada a partir de formulários Windows, WPF, ASP.NET formulários Web, e ASP.NET acidente de viação. A biblioteca oferece a opção de usar diferentes motores de renderização HTML: Internet Explorer (padrão) e WebKit (melhor saída).

Todo o conjunto de controlos está disponível gratuitamente (aplicações comerciais também) através do Programa licença comunitária Se qualifica-se. A licença comunitária é o produto completo, sem limitações ou marcas d'água.

Nota: eu trabalho para a Sincfusão.

 4
Author: Davis Jebaraj, 2015-11-17 20:22:33

Abaixo está um exemplo de conversão html + css para PDF usando 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();
}
 4
Author: Sergey Malyutin, 2016-06-23 08:29:14

Depende de quaisquer outros requisitos que tenha.

Uma solução realmente simples, mas não fácil de implantar é usar um controle WebBrowser para carregar o Html e, em seguida, usando o método de impressão para uma impressora PDF instalada localmente. Existem várias impressoras PDF livres disponíveis e o controle WebBrowser é uma parte do framework.Net.

Editar: Se o seu Html é XHtml, poderá usar PDFizer para fazer o trabalho.

 3
Author: Rune Grimstad, 2009-02-19 10:31:54

A visão PDF é boa. No entanto, você tem que ter total confiança para usá-lo. Já enviei um e-mail e perguntei porque é que o meu HTML não estava a ser convertido no servidor, mas funcionou bem no localhost.

 3
Author: Mike, 2011-10-28 09:24:14

Eu achei a seguinte biblioteca mais eficaz na conversão de html para pdf.
nuget: https://www.nuget.org/packages/Select.HtmlToPdf/

 3
Author: Praveen Kumar Thalluri, 2016-12-03 12:18:25
Também andava à procura disto há algum tempo. Encontrei o HTMLDOC http://www.easysw.com/htmldoc/ que é um aplicativo de linha de comandos livre open source que pega um arquivo HTML como um argumento e cospe um PDF a partir dele. Funcionou para mim muito bem para o meu projecto paralelo, mas tudo depende do que realmente precisas.

A empresa que o faz vende os binários compilados, mas você está livre para baixar e compilar a partir da fonte e usá-lo gratuitamente. Eu consegui compilar uma revisão recente (para a versão 1.9) e eu pretendo lançar um instalador binário para ele em poucos dias, então se você estiver interessado eu posso fornecer um link para ele assim que eu postá-lo.

Editar (2/25/2014): parece que os documentos e o site mudaram para http://www.msweet.org/projects.php?Z1

 2
Author: enriquein, 2014-02-25 21:34:07

Você precisa usar uma biblioteca comercial Se você precisar de uma renderização html perfeita em pdf.

ExpertPdf Html To Pdf Converter é muito fácil de usar e suporta o mais recente html5 / css3. Você pode converter um url inteiro para pdf:

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

Ou um texto em html:

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

Você também tem a alternativa para salvar diretamente o documento PDF gerado para um fluxo de arquivo no disco.

 2
Author: charpdevel0p3r, 2014-11-14 14:08:50
Sou o autor do pacote Rotativa. Ele permite criar arquivos PDF diretamente a partir de razor views:

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

Trivial de usar e você tem total controle sobre o layout, uma vez que você pode usar vistas de lâmina com dados do seu modelo e container do ViewBag.

Desenvolvi uma versão SaaS sobre o Azure. Ele torna ainda mais fácil de usá-lo a partir de WebApi ou qualquer aplicação .Net, serviço, Azure Site, Azure webjob, o que quer que corra.Net.

Http://www.rotativahq.com/

Contas gratuitas disponíveis.

 2
Author: Giorgio Bozio, 2016-06-10 15:06:13

Aqui está uma embalagem para wkhtmltopdf.dll por pruiz

E Uma embalagem para wkhtmltopdf.exe by Codaxy
- também em nuget .

 1
Author: Garfield, 2012-01-11 00:47:00

A melhor ferramenta que encontrei e usei para gerar PDF de javascript e estilos renderizados vistas ou páginas html é phantomJS .

Descarrega o .ficheiro exe com o rasterize.função js encontrada na raiz de exe da pasta de exemplo e colocar dentro da solução.

Ele mesmo permite que você baixe o arquivo em qualquer código sem abrir esse arquivo também permite baixar o arquivo quando os estilos e especialmente jquery são aplicados.

A seguir ao código gerar ficheiro 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;
}
 1
Author: Shan Khan, 2015-03-18 10:12:39

Tente este PDF Duo. Net componente de conversão para a conversão de HTML para PDF a partir de ASP.NET aplicação sem utilização de dlls adicionais.

Você pode passar a cadeia de HTML ou arquivo, ou transmissão para gerar o PDF. Usar o código abaixo (exemplo 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 exemplos que pode encontrar em: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

 0
Author: Constantine, 2010-10-01 09:41:57
Ok, usando estas tecnologias....

O src pode ser baixado de aqui ele precisa nant

 0
Author: jjchiw, 2014-01-09 19:32:59

Com Winnovative HTML para PDF converter um texto HTML numa única linha

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

O URL de base é usado para resolver as imagens referenciadas por URLs relativos no texto HTML. Alternativamente, você pode usar URLs completos em HTML ou imagens embutidas usando src="data:image/png" para tag de imagem.

Em resposta ao comentário do utilizador do' fubaar ' sobre o Conversor Winnovativo, é necessária uma correcção. O Conversor não usa IE como motor de renderização. Na verdade, não depende de qualquer software instalado e a renderização é compatível com o motor WebKit.

 0
Author: Winnovative, 2014-09-15 11:45:01

Se você quer que o usuário baixe o pdf da página renderizada no navegador, então a solução mais fácil para o problema é

window.print(); 

Do lado do cliente irá pedir ao utilizador para gravar o pdf da página actual. Você também pode personalizar a aparência do pdf ligando o estilo

<link rel="stylesheet" type="text/css" href="print.css" media="print">

Imprimir.o css é aplicado ao html durante a impressão.

Limitação

Não podes guardar o ficheiro do lado do servidor. O usuário pede para imprimir a página do que ele teve que salvar a página manualmente. Página deve para ser representado numa Conta.
 0
Author: Ravi Kumar Mistry, 2015-03-18 09:28:42

PDFmyURL lançou recentemente um componente.NET para a conversão de páginas web / HTML para PDF também. Esta tem uma interface muito amigável, por exemplo:

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

Documentação: documentação do componente PDFmyURL. net

Aviso: trabalho para a empresa proprietária da PDFmyURL

 0
Author: user1914292, 2015-09-08 11:33:28

Já que está a usar o itextsharp dll, não há necessidade de adicionar o 'plugin' de terceiros dll, acho que está a usar o htmlworker em vez dele use o xmlworker, pode converter facilmente o seu html para pdf.

Alguns css não funcionarão. são CSS suportados por
explicar por completo com a referência do exemplo Clique aqui


        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();
 0
Author: Merbin Joe, 2016-02-24 07:57:13

Você também pode verificar Spire , que lhe permite criar HTML to PDF com esta simples peça de código

 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");

Artigo Detalhado : Como converter HTML para PDF em asp.net C#

 0
Author: Satinder singh, 2016-05-05 11:52:03

Em vez de processar o HTML directamente para PDF, poderá criar um mapa de bits da sua página HTML e depois inserir o mapa de bits no seu PDF, usando por exemplo iTextSharp.

Aqui está um código como obter um Bitmap de uma URL. Encontrei-a algures por aqui, por isso, se encontrar a fonte, vou ligá-la.

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;
}
 -1
Author: Jimmy Mattsson, 2014-06-11 09:22:38

Como representante do Software HiQPdf, creio que a melhor solução é o Conversor HiQPdf HTML em PDF para o. net. contém o motor de renderização HTML5, CSS3, SVG e JavaScript mais avançado no mercado. Há também uma versão livre do HTML para a biblioteca PDF que você pode usar para produzir gratuitamente até 3 páginas PDF. The minimal C# code to produce a PDF as a byte [] from a HTML page is:

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);

Você pode encontrar exemplos mais detalhados tanto para ASP.NET e MVC em HiQPdf HTML para PDF Converter exemplos repositório .

 -1
Author: HiQPdf, 2016-12-02 11:48:59