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?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.
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
- Download Htmlrender.Pacote PdfSharp nuget.
-
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.
- 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. 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.
- 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.
- 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.
- Ele usa arquivos temp para gerar o pdf, e em casos como AWS EC2 que tem disco realmente lento é um grande desempenho problema. 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.
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)
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...
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.
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:)
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:
- ExpertPDF (http://www.html-to-pdf.net/)
- IronPDF (http://ironpdf.com/)
- iTextSharp (https://sourceforge.net/projects/itextsharp/)
- NReco PDF Creator for. NET ([37]} http://www.nrecosite.com/pdf_generator_net.aspx)
- renderizador de HTML para PDF Sharp ([41]} https://www.nuget.org/packages/HtmlRenderer.PdfSharp/)
- edição comunitária do SelectPDF ([45]} http://selectpdf.com/community-edition/)
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.
Usei ExpertPDF Html para conversor de Pdf. Faz um trabalho decente. Infelizmente, não é de graça.
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.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.
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.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.
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();
}
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.
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.
Eu achei a seguinte biblioteca mais eficaz na conversão de html para pdf.
nuget: https://www.nuget.org/packages/Select.HtmlToPdf/
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
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.
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.Contas gratuitas disponíveis.
Aqui está uma embalagem para wkhtmltopdf.dll por pruiz
E Uma embalagem para wkhtmltopdf.exe by Codaxy
- também em nuget .
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;
}
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
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.
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.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
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();
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#
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;
}
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 .