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?
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?
Respostas:
Edição: Nova sugestão HTML Renderer para PDF usando PdfSharp
(Depois de tentar o wkhtmltopdf e sugerir evitá-lo)
O HtmlRenderer.PdfSharp é um código gerenciado 100% totalmente em C # , fácil de usar, seguro para threads e, mais importante ainda, GRÁTIS ( Nova Licença BSD ) .
Uso
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;
}
Uma alternativa muito boa é uma versão gratuita do iTextSharp
Até a versão 4.1.6, o iTextSharp estava licenciado sob a licença LGPL e as versões até a versão 4.16 (ou também pode haver garfos) estão disponíveis como pacotes e podem ser usadas livremente. É claro que alguém pode usar a versão paga continuada com mais de 5 anos .
Tentei integrar soluções wkhtmltopdf no meu projeto e tive vários obstáculos.
Eu, pessoalmente, evitaria usar soluções baseadas em wkhtmltopdf nos aplicativos Hosted Enterprise pelos seguintes motivos.
--- Seção de Edição PRE ---
Para quem deseja gerar pdf a partir de html em aplicativos / ambientes mais simples, deixo meu post antigo como sugestão.
https://www.nuget.org/packages/TuesPechkin/
ou especialmente para aplicativos da Web MVC (mas acho que você pode usá-lo em qualquer aplicativo .net)
https://www.nuget.org/packages/Rotativa/
Ambos utilizam o binário wkhtmtopdf para converter html em pdf. Que usa o mecanismo do webkit para renderizar as páginas para que ele também possa analisar folhas de estilo css .
Eles fornecem fácil integração com o C #.
O Rotativa também pode gerar PDFs diretamente de qualquer Razor View.
Além disso, para aplicações web do mundo real, eles também gerenciam a segurança de threads, etc ...
Atualização: agora eu recomendaria o PupeteerSharp sobre o wkhtmltopdf.
Tente wkhtmtopdf . É a melhor ferramenta que encontrei até agora.
Para o .NET, você pode usar esta pequena biblioteca para chamar facilmente o utilitário de linha de comando wkhtmtopdf.
Recentemente, realizei um PoC em relação à conversão de HTML para PDF e queria compartilhar meus resultados.
O meu favorito de longe é o OpenHtmlToPdf
Vantagens desta ferramenta:
Outras ferramentas testadas:
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");
background-color
. OpenHtmlToPdf funciona perfeitamente de graça.
Última atualização: março de 2020
Esta é a lista de opções para conversão de HTML em PDF no .NET que eu montei (algumas gratuitas e outras pagas)
GemBox.Document
PDF Metamorfose .Net
HtmlRenderer.PdfSharp
PuppeteerSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Free Spire.PDF for .NET (versão comunitária)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
SelectPDF
Se nenhuma das opções acima o ajudar, você sempre poderá pesquisar os pacotes NuGet https://www.nuget.org/packages?q=html+pdf
A maioria dos conversores de HTML para PDF depende do IE para analisar e renderizar o HTML. Isso pode ser interrompido quando o usuário atualiza o IE. Aqui está um que não depende do IE.
O código é algo como isto:
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.
Eu recomendo a NReco , 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 :)
A Winnovative oferece uma biblioteca .Net PDF que suporta entrada HTML. Eles oferecem uma avaliação gratuita ilimitada . Dependendo de como você deseja implantar seu projeto, isso pode ser suficiente.
O PDF essencial pode ser usado para converter a amostra HTML em PDF : C # . O exemplo vinculado aqui é baseado no 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).
Todo o conjunto de controles está disponível gratuitamente (aplicativos comerciais também) através do programa de licença da comunidade , 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.
Se você realmente não precisa de uma verdadeira biblioteca .Net PDF, existem inúmeras ferramentas gratuitas de HTML para PDF , muitas das quais podem ser executadas em uma linha de comando.
Uma solução seria escolher um desses e, em seguida, escrever um invólucro fino em C #. Por exemplo, conforme feito neste tutorial .
Eu usei o ExpertPDF Html To Pdf Converter . Faz um trabalho decente. Infelizmente, não é grátis.
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.
Há boas notícias para demandas de HTML para PDF. Como essa resposta mostrou , o padrão css-break-3 do W3C resolverá o problema ... É uma recomendação de candidato com plano de se transformar em recomendação definitiva em 2017 ou 2018, após testes.
Como não tão padrão, existem soluções, com plugins para C #, como mostra print-css.rocks .
Você pode usar o recurso de impressão em PDF do Google Chrome no modo sem cabeça. Achei que esse era o método mais simples e mais robusto.
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();
}
ABCpdf.NET (http://www.websupergoo.com/abcpdf-5.htm)
Nós usamos e recomendamos.
Muito bom componente, ele não apenas converte uma página da Web em PDF como uma imagem, mas também converte texto, imagem, formatação, etc ...
Não é grátis, mas é barato.
Eu sou o autor do pacote Rotativa. Ele permite criar arquivos PDF diretamente a partir das visualizações de navalhas:
https://www.nuget.org/packages/Rotativa/
Trivial para usar e você tem controle total sobre o layout, pois é possível usar vistas de navalha com dados do contêiner Model e ViewBag.
Eu desenvolvi uma versão SaaS no Azure. Torna ainda mais fácil usá-lo na WebApi ou em qualquer aplicativo, serviço, site do Azure, webjob do Azure, qualquer que seja executado .Net.
Contas gratuitas disponíveis.
Abaixo está um exemplo de conversão de html + css para PDF usando o 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 você tiver.
Uma solução realmente simples, mas não de fácil implantação, é usar um controle WebBrowser para carregar o HTML e, em seguida, usar o método Print para imprimir em uma impressora PDF instalada localmente. Existem várias impressoras PDF gratuitas disponíveis e o controle WebBrowser faz parte da estrutura .Net.
Edição: Se você Html é XHtml, você pode usar o PDFizer para fazer o trabalho.
O PDF Vision é bom. No entanto, você precisa ter confiança total para usá-lo. Eu já enviei um email e perguntei por que meu HTML não estava sendo 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/
Eu também estava procurando por isso há um tempo. Encontrei o HTMLDOC http://www.easysw.com/htmldoc/ um aplicativo de linha de comando de código aberto gratuito que usa um arquivo HTML como argumento e cospe um PDF a partir dele. Funcionou muito bem para mim no meu projeto paralelo, mas tudo depende do que você realmente precisa.
A empresa que vende os binários compilados, mas você pode baixar e compilar a partir do código-fonte e usá-lo gratuitamente. Consegui compilar uma revisão bastante recente (para a versão 1.9) e pretendo liberar um instalador binário para ele em alguns dias, portanto, se você estiver interessado, posso fornecer um link para ele assim que publicar.
Editar (25/2/2014): parece que os documentos e o site foram movidos para http://www.msweet.org/projects.php?Z1
Você precisa usar uma biblioteca comercial se precisar da renderização perfeita de html em pdf.
O ExpertPdf Html To PDF Converter é muito fácil de usar e suporta os mais recentes html5 / css3. Você pode converter um URL inteiro para 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.
Esta é uma biblioteca gratuita e funciona com muita facilidade: 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
Até agora, parece que a melhor solução gratuita para .NET é a biblioteca terpechkin , que é um invólucro da biblioteca nativa wkhtmltopdf .
Agora usei a versão single-threaded para converter alguns milhares de strings HTML em arquivos PDF e parece funcionar muito bem. Ele também deve funcionar em ambientes com vários threads (IIS, por exemplo), mas eu não testei isso.
Também porque eu queria usar a versão mais recente do wkhtmltopdf (0.12.5 no momento da redação), baixei a DLL do site oficial, copiei para a raiz do meu projeto, configurei a cópia para saída como true e iniciei a biblioteca como tão:
var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));
O código acima procurará exatamente "wkhtmltox.dll", portanto, não renomeie o arquivo. Eu usei a versão de 64 bits da DLL.
Leia as instruções para ambientes com vários threads, pois você precisará inicializá-lo apenas uma vez por ciclo de vida do aplicativo, para que seja necessário colocar um singleton ou algo assim.
Aqui está um invólucro para o wkhtmltopdf.dll por pruiz
E um invólucro para o wkhtmltopdf.exe da Codaxy
- também no nuget .
No tests are run because no tests are loaded or the selected tests are disabled
pesquisando também não ajuda
A melhor ferramenta que encontrei e usei para gerar PDF em JavaScript e estilos e 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 a solução.
Ele ainda 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, o jquery são aplicados.
O código a seguir gera arquivo 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;
}
Você também pode verificar o Spire , que permite criar 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 em PDF no asp.net C #
Como representante do HiQPdf Software, acredito que a melhor solução é o HiQPdf HTML to PDF converter for .NET . Ele contém o mais avançado mecanismo de renderização HTML5, CSS3, SVG e JavaScript do mercado. Há também uma versão gratuita da biblioteca HTML para PDF que você pode usar para produzir gratuitamente até 3 páginas PDF. O código C # mínimo para produzir um PDF como um byte [] a partir 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 no repositório de exemplos do HiQPdf HTML to PDF Converter .
Provavelmente, a maioria dos projetos envolve um mecanismo C / C ++ em vez de implementar uma solução C # do zero. Experimente o Projeto Gotenberg .
Para testá-lo
docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6
Exemplo de ondulação
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);
}
}
}
}
Compilar
csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
Experimente este componente de conversão do PDF Duo .Net para converter HTML para PDF do ASP.NET aplicativo sem usar DLLs adicionais.
Você pode transmitir a string ou arquivo HTML ou transmitir 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 você pode encontrar em: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx
Para converter HTML para PDF em C #, use ABCpdf .
O ABCpdf pode usar os mecanismos de renderização Gecko ou Trident, para que sua tabela HTML tenha a mesma aparência que aparece no FireFox e no Internet Explorer.
Há uma demonstração on-line do ABCpdf em www.abcpdfeditor.com. Você pode usar isso para verificar como suas tabelas serão renderizadas primeiro, sem a necessidade de baixar e instalar o software.
Para renderizar páginas da Web inteiras, você precisará das funções AddImageUrl ou AddImageHtml. Mas se tudo o que você deseja fazer é simplesmente adicionar texto com estilo HTML, tente a função AddHtml, como abaixo:
Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();
ABCpdf é um título de software comercial, no entanto, a edição padrão geralmente pode ser obtida gratuitamente sob oferta especial.
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.
Todas as suas respostas foram sobre ABCpdf