web-dev-qa-db-pt.com

Converter HTML para PDF em .NET

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

Existe uma maneira melhor?

387
SandHurst

Tente wkhtmltopdf . É a melhor ferramenta que encontrei até agora.

Para .NET, você pode usar este biblioteca pequena para facilmente invocar o utilitário de linha de comando wkhtmltopdf.

182
Marko

EDIT: Nova Sugestão HTML Renderer para PDF usando PdfSharp

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

HtmlRenderer.PdfSharp é um 100% totalmente código gerenciado em C # , fácil para use, thread safe e mais importante FREE ( Nova Licença BSD ) solução.

Uso

  1. Download Pacote nuget HtmlRenderer.PdfSharp .
  2. Use o método de exemplo.

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

Um muito bom substituto é um versão gratuita de iTextSharp

Até a versão 4.1.6, o iTextSharp era licenciado sob a licença LGPL e versões até o 4.16 (ou pode haver também garfos) estão disponíveis como pacotes e podem ser usados ​​livremente. Claro que alguém pode usar o continuado 5+ versão paga .

Eu tentei integrar wkhtmltopdf soluções no meu projeto e tive um monte de obstáculos.

Eu pessoalmente evito usar soluções baseadas em wkhtmltopdf em aplicativos Hosted Enterprise pelos seguintes motivos.

  1. Primeiro de tudo wkhtmltopdf é C + + implementado não C #, e você terá vários problemas incorporando-o dentro de seu código C #, especialmente ao alternar entre compilações de 32 bits e 64 bits do seu projeto. Tive que tentar várias soluções, incluindo construção de projeto condicional, etc, etc. apenas para evitar "exceções de formato inválido" em máquinas diferentes.
  2. Se você gerencia sua própria máquina virtual, tudo bem. Mas se o seu projeto estiver sendo executado em um ambiente restrito como ( Azure (Na verdade, é impossível com o Azure, como mencionado pelo autor TuesPenchin ), Elastic Beanstalk etc) é um pesadelo para configurar esse ambiente apenas para wkhtmltopdf para trabalhar.
  3. wkhtmltopdf está criando arquivos dentro de seu servidor, então você tem que gerenciar permissões de usuários e conceder acesso "write" para onde wkhtmltopdf está rodando.
  4. Wkhtmltopdf está sendo executado como um aplicativo autônomo, portanto, seu não gerenciado pelo seu IIS pool de aplicativos . Portanto, você precisa hospedá-lo como um serviço em outra máquina ou terá picos de processamento e consumo de memória em seu servidor de produção.
  5. Ele usa arquivos temporários para gerar o pdf, e em casos como AWS EC2 que tem disco muito lento e/ou é um grande problema de desempenho.
  6. O mais odiado "Não é possível carregar DLL 'wkhtmltox.dll'" erro relatado por muitos usuários.

--- Seção Editar Anterior ---

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

TuesPechkin

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

ou especialmente para MVC Aplicativos da Web (mas eu acho que você pode usá-lo em qualquer aplicativo .net)

Rotativa

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

Ambos utilizam o binário wkhtmtopdf para converter html para pdf. Que usa o mecanismo de webkit para renderizar as páginas para que ele também possa analisar folhas de estilo css .

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

Rotativa também pode gerar PDFs diretamente de qualquer Razor View.

Além disso, para aplicativos da web do mundo real, eles também gerenciam a segurança de threads, etc ...

174
Anestis Kivranoglou

A maioria dos HTML para PDF conversor depende de IE para fazer a análise e renderização de HTML. Isso pode quebrar quando o usuário atualiza seu IE. Aqui é aquele que não depende do IE.

O código é algo assim:

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

Como muitos outros conversores, você pode passar texto, nome de arquivo ou URL. O resultado pode ser salvo em um arquivo ou fluxo.

29
Jason

Eu realizei recentemente um PoC sobre HTML para PDF conversão e queria compartilhar meus resultados.

Meu favorito é de longe OpenHtmlToPdf

Vantagens desta ferramenta:

  • Compatibilidade de HTML muito boa (por exemplo, foi a única ferramenta no meu exemplo que repetiu cabeçalhos de tabela corretamente quando uma tabela ultrapassou várias páginas)
  • API fluente
  • Gratuito e OpenSource ( licença Creative Commons Attribution 3. )
  • Disponível via NuGet

Outras ferramentas testadas:

27
Markus

Eu recomendo NReco , a sério. Tem a versão gratuita e paga e realmente vale a pena. Ele usa o wkhtmtopdf em segundo plano, mas você só precisa de um Assembly. Fantástico.

Exemplo de uso:

Instale 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
Kim Tranjan

Winnovative oferecer uma biblioteca .Net PDF que suporte entrada HTML. Eles oferecem um ilimitado teste gratuito . Dependendo de como você deseja implantar seu projeto, isso pode ser suficiente.

13
Stewart

PDF essencial pode ser usado para converter HTML para PDF : amostra C # . O exemplo vinculado aqui é baseado em ASP.NET, mas a biblioteca pode ser usada no Windows Forms, WPF, ASP.NET Webforms e ASP.NET MVC. A biblioteca oferece a opção de usar diferentes mecanismos de renderização HTML: Internet Explorer (padrão) e WebKit (melhor saída).

O conjunto completo de controles está disponível gratuitamente (aplicativos comerciais também) através do programa community license se você se qualificar. A licença da comunidade é o produto completo sem limitações ou marcas d'água.

Nota: Eu trabalho para o Syncfusion.

8
Davis Jebaraj

Eu usei ExpertPDF Html ​​To Pdf Converter . Faz um trabalho decente. Infelizmente, não é grátis.

7
charpdevel0p3r

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 gratuita.

7
Paul

Se você realmente não precisa de uma verdadeira biblioteca .Net PDF, existem numerosas ferramentas livres de HTML para PDF , muitas das quais podem ser executadas a partir de um comando -linha.

Uma solução seria escolher um desses e, em seguida, escrever um wrapper fino em torno de C #. Por exemplo, conforme feito em este tutorial .

6
Stewart

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

Há boas notícias para as demandas de HTML para PDF. Como esta resposta mostro , o padrão W3C css-break- 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-padrão, existem soluções, com plug-ins para C #, como mostrado por print-css.rocks .

6
Peter Krauss

Abaixo está um exemplo de conversão de 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
Sergey Malyutin

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

Nós usamos e recomendamos.

Componente muito bom, ele não só converte uma página da Web para PDF como uma imagem, mas realmente converte texto, imagem, formatação, etc ...

Não é grátis, mas é barato.

4
Christophe Trevisani Chavey

Depende de qualquer outro requisito que você tenha.

Uma solução realmente simples, mas não facilmente implantável, é usar um controle WebBrowser para carregar o Html e, em seguida, usar a impressão do método de impressão para uma impressora PDF instalada localmente. Existem várias impressoras gratuitas PDF disponíveis e o controle WebBrowser faz parte da estrutura .Net.

EDIT: Se você Html é XHtml você pode usar PDFizer para fazer o trabalho.

3
Rune Grimstad

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

3
Praveen Kumar Thalluri

PDF Vision é bom. No entanto, você tem que ter confiança total para usá-lo. Eu já enviei um e-mail e perguntei por que meu HTML não estava sendo convertido no servidor, mas funcionou bem em localhost.

3
Mike

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

ExpertPdf Html para PDF Converter é muito fácil de usar e suporta o mais recente html5/css3. Você pode converter uma URL inteira em pdf:

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

ou uma string html:

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

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

2
charpdevel0p3r

Eu sou o autor do pacote Rotativa. Permite criar arquivos PDF diretamente de visões de navalha:

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

Trivial para usar e você tem controle total sobre o layout desde que você pode usar vistas de navalha com dados do seu contêiner de modelo e ViewBag.

Eu desenvolvi uma versão SaaS no Azure. Isso facilita ainda mais o uso do WebApi ou de qualquer aplicativo .Net, serviço, site do Azure, webjob do Azure, o que for executado .Net.

http://www.rotativahq.com/

Contas gratuitas disponíveis.

2
Giorgio Bozio

Eu também estava procurando por isso há algum tempo. Eu encontrei o HTMLDOC http://www.easysw.com/htmldoc/ que é um aplicativo gratuito de linha de comando de código aberto que pega um arquivo HTML como argumento e cospe um PDF a partir dele. Funcionou muito bem para o meu projeto paralelo, mas tudo depende do que você realmente precisa.

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

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

2
enriquein

Aqui está m wrapper para wkhtmltopdf.dll por pruiz

E m wrapper para wkhtmltopdf.exe por Codaxy
- também em nuget .

1
Garfield

Este é um biblioteca livre e funciona muito facilmente: 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
1
Abhishek Sengupta

Como representante do HiQPdf Software, acredito que a melhor solução é HiQPdf HTML para PDF conversor para .NET . Ele contém o mecanismo de renderização HTML5, CSS3, SVG e JavaScript mais avançado do mercado. Há também um versão gratuita do HTML para PDF biblioteca que você pode usar para produzir gratuitamente até 3 PDF páginas. O código C # mínimo para produzir um PDF como um byte [] de uma página HTML é:

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 para ASP.NET e MVC em HiQPdf HTML para PDF Repositório de exemplos do conversor .

1
HiQPdf

A melhor ferramenta que encontrei e usei para gerar PDF de javascript e estilos de exibições renderizadas ou páginas html é phantomJS.

Baixe o arquivo .exe com a função rasterize.js encontrada na raiz do exe da pasta de exemplo e coloque dentro da solução.

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

A seguir, o código generate PDF File:

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
Shan Khan

O PDFmyURL lançou recentemente um componente .NET para conversão de página da Web/HTML para PDF também. Isto 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 do PDFmyURL .NET

Isenção de responsabilidade: Eu trabalho para a empresa proprietária do PDFmyURL

0
user1914292

Já se você estiver usando dll itextsharp, não há necessidade de adicionar dll de terceiros (plugin), eu acho que você está usando htmlworker em vez de usar xmlworker você pode facilmente converter o seu html para pdf.

Alguns css não funcionam, são CSS Suportados
Explique Completo com o exemplo Referência 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
Merbin Joe

Ok, usando essas tecnologias ....

O src pode ser baixado de aqui ele precisa nant

0
jjchiw

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

window.print(); 

no lado do cliente, ele avisará o usuário para salvar o pdf da página atual. Você também pode personalizar a aparência do pdf ao vincular o estilo

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

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

limitação

Você não pode armazenar o arquivo no lado do servidor. Prompt do usuário para imprimir a página do que ele tinha que salvar a página manualmente. A página deve ser renderizada em uma guia.

0
Ravi Kumar Mistry

Com Winnovative HTML para PDF conversor você pode converter uma string HTML em uma única linha

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

O URL base é usado para resolver as imagens referenciadas por URLs relativos em string HTML. Como alternativa, você pode usar URLs completos em HTML ou incorporar imagens usando src = "data: image/png" para a tag de imagem.

Em resposta ao comentário do usuário 'fubaar' sobre o conversor Winnovative, uma correção é necessária. O conversor não usa IE como mecanismo de renderização. Na verdade, não depende de nenhum software instalado e a renderização é compatível com o mecanismo do WebKit.

0
Winnovative

Outra sugestão é tentar a solução por https://grabz.it .

Eles fornecem uma API .NET do Nice para capturar capturas de tela e manipulá-las em uma abordagem fácil e flexível.

Para usá-lo em seu aplicativo, você precisará primeiro obter chave + segredo e download o .NET SDK (é grátis).

Agora, um pequeno exemplo de usá-lo.

Para usar a API, primeiro é necessário criar uma instância da classe GrabzItClient, passando a chave do aplicativo e o segredo do aplicativo da sua conta do GrabzIt para o construtor, conforme mostrado no exemplo a seguir:

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

Agora, para converter o HTML para PDF tudo o que você precisa fazer:

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

Você também pode converter em imagem:

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

Em seguida, você precisa salvar a imagem. Você pode usar um dos dois métodos de salvaguarda disponíveis, Save, se disponível publicamente acessível identificador de retorno de chamada e SaveTo se não. Verifique a documentação para detalhes.

0
Stas

Você também pode verificar Spire , ele permite que você crie HTML to PDF com este simples pedaço 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
Satinder singh

Em vez de analisar HTML diretamente em PDF, você pode criar um Bitmap da sua página HTML e inserir o Bitmap em seu PDF, usando, por exemplo, iTextSharp .

Aqui está um código como obter um bitmap de um URL. Eu encontrei em algum lugar aqui em SO, se eu encontrar a fonte eu vou ligá-lo.

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;
}
0
Jimmy Mattsson

Tente isto PDF Duo .Net convertendo componente para converter HTML para PDF do ASP.NET aplicativo sem usando dlls adicionais.

Você pode passar a string ou arquivo HTML ou fluxo para gerar o PDF. Use 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";   
}   

Exemplos de Info + C #/VB que você pode encontrar em: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx

0
Constantine