Converta HTML para PDF no .NET

425

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?

Amedee Van Gasse
fonte
Você pode usar o GemBox.Document para isso. Também aqui você pode encontrar um código de amostra para converter um arquivo HTML em um arquivo PDF.
Mario Z
Qual versão do iTextSharp você usa e pode compartilhar seu html?
Amedee Van Gasse
Ainda não há resposta ao meu pedido de informações adicionais. Adicione também se você estiver usando HTMLWorker ou XMLWorker.
Amedee Van Gasse
E o núcleo .net?
Piero Alberto
Setembro 2019: Eu adicionei uma nova resposta algumas das opções listadas são outros gratuitos pagos e alguns estão disponíveis como núcleo .net stackoverflow.com/questions/564650/...
Mauricio Gracia Gutierrez

Respostas:

198

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

  1. Faça o download do pacote de pepitas 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;
    }

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.

  1. Antes de tudo, o wkhtmltopdf é implementado em C ++ e não em C #, e você encontrará vários problemas ao incorporá-lo ao 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 alternativas, incluindo a criação condicional de projetos etc. etc. apenas para evitar "exceções de formato inválidas" 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 no Azure, conforme mencionado pelo autor do TerPenchin ), Elastic Beanstalk etc.), é um pesadelo configurar esse ambiente apenas para que o wkhtmltopdf funcione.
  3. O wkhtmltopdf está criando arquivos no seu servidor, portanto você precisa gerenciar as permissões do usuário e conceder acesso de "gravação" ao local em que o wkhtmltopdf está sendo executado.
  4. O Wkhtmltopdf está sendo executado como um aplicativo autônomo, portanto, não é gerenciado pelo seu pool de aplicativos IIS . Portanto, você deve hospedá-lo como um serviço em outra máquina ou terá picos de processamento e consumo de memória no servidor de produção.
  5. Ele usa arquivos temporários para gerar o pdf e, em casos como o AWS EC2, que tem realmente E / S de disco lento, é um grande problema de desempenho.
  6. O erro mais odiado "Não foi possível carregar a DLL 'wkhtmltox.dll'" relatado por muitos usuários.

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

Terça-feira

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

ou especialmente para aplicativos da Web MVC (mas 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 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 ...

Anestis Kivranoglou
fonte
2
Obrigado por atualizar sua postagem. Vou tentar o PdfSharp. Você me salvou muito tempo.
John Henckel
1
O PDFSharp é bom em termos de desempenho, mas não renderiza flutuações adequadamente para mim. Felizmente, eu poderia alterar a marcação para usar boas tabelas antigas, o PdfSharp lida bem com elas.
Gebb
3
Tentamos o HtmlRenderer. Foi muito rápido quando não estava carregando nenhum CSS. Mas quando tentamos aplicar o CSS (Bootstrap mais alguns sob medida), a análise do CSS levou um tempo (o que provavelmente poderíamos atenuar), e a renderização foi completamente diferente da página da web.
OutstandingBill
1
@ user2347528 - procurando a fonte do HtmlRenderer.PdfSharp, não há como corrigir isso - basta levar a altura total da página e os clipes para cada página PDF, o que é realmente lamentável - significa que PDFs de várias páginas com esta biblioteca podem realmente ' não seja feito.
Sr. Bungle
3
BS. Isso cria uma imagem do HTML e adiciona a imagem ao arquivo pdf. Este não é um PDF real. Além disso, o PDF é um formato de gráfico vetorial - você pode rolar infinitamente - é claro, exceto se o PDF consistir em um gráfico raster, que é o que esta biblioteca produz.
Stefan Steiger
191

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.

Marko
fonte
17
suporta .NET ??
Kiquenet 28/10/10
6
é um executável independente. Você pode iniciá-lo como um processo, passando uma URL do documento HTML como argumento.
Marek
46
@bamccaig Eu já o tenho =) github.com/gmanny/Pechkin Ele expõe todas as funções utilizáveis ​​da biblioteca e também possui um invólucro para uso em vários threads. E é no NuGet.
Gman
7
Para usá-lo no C # stackoverflow.com/questions/4651373/…
Daniel Little
7
@ AdamMoszczyński: Wikipedia : A LGPL permite que desenvolvedores e empresas usem e integrem o software LGPL em seu próprio software (mesmo proprietário) sem serem obrigados (pelos termos de um copyleft forte) a liberar o código fonte de suas próprias partes de software.
1011 Oliver
34

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:

  • Muito boa compatibilidade com HTML (por exemplo, foi a única ferramenta no meu exemplo que repetiu corretamente os cabeçalhos das tabelas quando uma tabela ocupava várias páginas)
  • API fluente
  • Gratuito e Código Aberto ( licença Creative Commons Attribution 3.0 )
  • Disponível via NuGet

Outras ferramentas testadas:

Markus
fonte
+1 para isso, testei o HtmlRenderer for PdfSharp, mas encontrei muitos problemas com quebras de página. Eu posso viver com a dependência de wkHtmlToPdf neste projeto, então essa solução foi ótima - renderiza o HTML lindamente.
jmdon
Parecia bonito, mas uau demorou muito tempo. 30 segundos, com um tema de inicialização e assim por diante, página bastante simples, mas mesmo assim.
31418 Nicholas Petersen
Stephanie da IronPDF aqui. Aqui está um exemplo de código sobre como usar o IronPDF para converter html para PDF em C #. Mais informações podem ser encontradas em nosso tutorial de html para pdf em nosso site. 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");
Stephanie
Eu usei o iText pdfHtml, mas ele não suporta background-color. OpenHtmlToPdf funciona perfeitamente de graça.
Hp93 30/09/19
Eu concordo com a superioridade do OpenHtmlToPdf. Além disso, ele suporta a fusão de .exe e .dll com o ILMerge.
saygley 10/01
30

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

Se nenhuma das opções acima o ajudar, você sempre poderá pesquisar os pacotes NuGet https://www.nuget.org/packages?q=html+pdf

Mauricio Gracia Gutierrez
fonte
1
você já testou algum desempenho? estamos procurando melhorar os tempos de conversão atuais e estamos explorando outras bibliotecas para obter esses benefícios de desempenho
frno
Eu não fiz nenhuma comparação de desempenho, especialmente porque é uma lista tão longa - talvez alguém já tenha feito uma "revisão de desempenho de bibliotecas .net de geração de PDF" ou similar
Mauricio Gracia Gutierrez
28

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.

Jason
fonte
35
não é útil porque você deve comprar a biblioteca
d1jhoni1b
47
d1jhoni1b, como isso a torna inútil? Se for uma ferramenta de pagamento, pode-se dizer que é caro, mas não inútil apenas com base nesses critérios.
Don Rolando
3
É verdade que o EO.Pdf não usa o IE. Mas parece gerar instâncias de 32 bits de um navegador de webkit em segundo plano. Verifique sua lista de processos e você os verá como instâncias do rundll32.exe, apontando para a dll EO.PDF. Portanto, ainda é um pouco hacky na minha opinião.
27415 Matt
1
Não suporta media = "print", o que é realmente doloroso.
Marat Faskhiev 02/07/2015
15
Licença de desenvolvedor único por US $ 650. Isso é caro.
Abhijeet Nagre 17/08/2015
25

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

Kim Tranjan
fonte
3
Parece realmente bastante útil. Vale ressaltar que até hoje (10/10/15), é o wrapper .Net mais baixado para wkhtmtopdf (como um pacote Nuget).
Ken2k
3
Tentei, infelizmente não consegui fazê-lo funcionar nas páginas da web do azure.
gabriel14
Essa biblioteca funciona bem quando eu a executo localmente na minha máquina, mas no servidor de hospedagem, vejo o seguinte erro aleatoriamente. Às vezes, o PDF é gerado, mas às vezes gera o seguinte erro. "Erro. ​​Ocorreu um erro ao processar sua solicitação. Não é possível gerar PDF: (código de saída: 1)"
user2347528
O wkhtmtopdf depende do GDI + ou x-server se você estiver executando no Mono / Linux. Portanto, este não é útil para ambientes de servidor ...
nuzzolilo
Seu problema é bom e está funcionando como esperado, mas com pouca qualidade que vejo no meu pdf, podemos melhorar isso?
Bharat
13

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.

Stewart
fonte
4
Lembre-se de que, quando verificamos pela última vez, o winnovative era incompatível com o IE9 (pois eles usavam o mecanismo de renderização do IE GDI, que foi removido no IE9). Portanto, se você tiver o IE9 instalado na máquina que está usando, a conversão não funcionará. Eles podem ter corrigido isso no momento em que você lê isso, mas muitos dos componentes comerciais usavam o mecanismo de renderização do IE e se soltaram do IE9, por isso vale a pena conferir.
fubaar 4/08/11
O Winnovative foi o mais fácil de configurar e funcionou imediatamente. Mas: 1. NÃO FUNCIONA nos sites do Azure, apenas no CloudApp. 2. ele é lento, é preciso uma boa 8 segundos para gerar um simples PDF em um Azure D1 VM
jsgoupil
Confirme. É muito lento. Eu comparei com o wkhtmltopdf.
Marat Faskhiev 02/07/2015
A Biblioteca Winnovative é muito cara. Cerca de US $ 650 para licença de desenvolvedor e US $ 1200 para outra licença.
Abhijeet Nagre 17/08/15
O Winnovative HTML to PDF Converter funciona em sites do Azure e não depende do IE, conforme sugerido em um comentário. Verifique a solução Winnovative HTML para PDF para Azure no site: winnovative-software.com/html-to-pdf-converter-azure.aspx . Para melhorar o tempo de conversão, defina HtmlToPdf.ConversionDelay = 0. O conversor está usando um atraso padrão para lidar com páginas HTML que atualizam seu conteúdo após o carregamento da página.
EvoPdf
9

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.

Davis Jebaraj
fonte
8

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 .

Stewart
fonte
O tutorial usa um componente de um site que não existe mais.
Tom Winter
7

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

charpdevel0p3r
fonte
o ExpertPDf tem uma opção para marcar os documentos com água?
user1799214
@ user1799214 - Sim, o ExpertPDF suporta marcas d'água. Veja aqui o código de exemplo. Eu usei com sucesso com marcas d'água em um dos meus sites.
Theophilus
Funciona muito bem, mas eles não respondem às perguntas de suporte.
Michael Freidgeim
7

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.

Paulo
fonte
7

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

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 .

Peter Krauss
fonte
1
As soluções vinculadas pelo print-css.rocks custam US $ 2.950,00 para o PDFreactor, US $ 3800 para o Prince e US $ 5.000,00 para o Antenna House Formatter V7. E Weasyprint parece ser para Python.
MDave 15/04
6

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();
    }
Leonard AB
fonte
Ei, isso é muito legal para servidor e vps próprios. Obrigado por compartilhar.
mjb 22/02
Para permitir que o ASP.NET no IIS execute um programa externo com permissão de acesso de gravação, o pool de aplicativos> configurações avançadas> identidade> definido como "LocalSystem"
mjb
4

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.

Christophe Trevisani Chavey
fonte
10
Usamos isso por alguns anos e descobrimos que é bastante doloroso de usar. Suporte ruim, muito exigente como resultado de seu wrapper no mecanismo de renderização do IE, baixa qualidade e compactação de imagem, capacidade limitada de personalizar a solicitação feita para lidar com alguns cenários de uso mais avançados (como fornecer cookies e cabeçalhos de solicitação). Suponho que ele funcione está sujeito ao que você precisa fazer.
moribvndvs
3
+1 para ABCPdf. O comentarista anterior não deve ter falado com o mesmo pessoal de suporte que eu - eles sempre me escreviam de volta e sempre tinham uma solução para os problemas que tínhamos. Agora eles suportam o uso do Gecko como o mecanismo de renderização, em vez do IE. Você pode escolher o que deseja em tempo de execução. O ABC permite que você faça literalmente qualquer coisa que o PDF permita.
22412 Steve Steve
12
apoio muito caro e ruim. Eu não recomendo o abcPDF.
Vivek
Eu também o uso há 6 anos e, para ser justo, nos serviu bem.
Toepoke.co.uk
Esta resposta não é mais uma repetição de stackoverflow.com/a/2182212/471213 ? Quero dizer, o outro cara que é afiliado ao programa pelo menos forneceu algumas linhas de código de exemplo
usr-local-
4

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.

http://www.rotativahq.com/

Contas gratuitas disponíveis.

Giorgio Bozio
fonte
Isso depende do Itextsharp e, portanto, você precisa ter uma licença para o itextsharp usá-lo?
Micah Armantrout
2
@MicahArmantrout Não, não. Ele usa o wkhtmltopdf.exe para criar o arquivo PDF. Nenhuma licença é necessária.
Giorgio Bozio
@MicahArmantrout, o iTextSharp também não é o GNU GPL? gnu.org/licenses/agpl.html
Pranav Singh
Não recomendamos o uso de versões anteriores ao iText (Sharp) 5 por razões técnicas e também legais. stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout
4

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();
}
Sergey Malyutin
fonte
Observe que o iTextSharp trabalha com XHtml e é bastante sensível à qualidade do seu html. Quebraria, onde SelectPdf e HiqPdf não.
Savage
3

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.

Rune Grimstad
fonte
3

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.

Mike
fonte
2

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

enriquein
fonte
oi, u pode fornecer um link e também um guia sobre como usá-lo com c # asp.net graças #
user287745
static.persistedthoughts.com/htmldoc_1.9.1586-setup.exe Esteja ciente de que este é um programa de linha de comando. Você deve executá-lo de dentro do seu aplicativo para que ele funcione. Você pode encontrar a documentação para seus argumentos e advertências no Capítulo 4: easysw.com/htmldoc/documentation.php
enriquein
Não tenho certeza de quão útil isso seria hoje em dia, mas se isso o ajudar: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein
O site não está mais em operação.
Tom Winter
2

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.

charpdevel0p3r
fonte
Você não tem que usar uma biblioteca comercial, se você precisa aperfeiçoar html renderização em pdf
obayhan
Estou começando a acreditar nisso. Eu tentei 5 dos brindes e todos eles têm uma coisa que estraga tudo para mim. De engasgar a uma página que está além de um simples mundo olá, a parecer horrível - acho que vou ter que gastar dinheiro para um conversor real. As amostras de cada um dos produtos comerciais realmente funcionam da maneira que você esperaria que o PDF fosse.
Herb Meehan
@obayhan - eu gostaria de acreditar em você. Talvez você possa compartilhar conosco um link para as ferramentas que você acha tão boas.
Peter Wone
@ PeterWone no topo, existem muitas alternativas de código aberto, como você pode ver facilmente. Pedir a alguém para compartilhar as mesmas coisas é apenas roubar tempo. Mas se você tentou todos eles e está insatisfeito, espero que você compartilhe seus comentários sobre o que não está satisfeito e, talvez, isso ajude a aumentar o conhecimento.
21416 obayhan
@obayhan - Por que repetir o que os outros já fizeram? Eles se enquadram em três categorias: dependências inaceitáveis, não realmente gratuitas, como wkhtmltopdf ou IE9, e o HTML Renderer para PDFSharp. O HR para PDF # é o único em C # puro e faz um trabalho horrível de paginação - renderiza uma página longa e a corta, geralmente cortando linhas de texto. Se eu encontrar tempo para reescrever completamente o renderizador, o HR para PDF # ganharia as mãos: é rápido, gratuito e não tem dependências. Mas isso seria um renderizador totalmente novo, eu temo.
Peter Wone
2

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
Abhishek Sengupta
fonte
2

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.

Shahin Dohan
fonte
1

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 .

Garfield
fonte
Alguns documentos ou tutoriais como usá-los? existe apenas código-fonte lá sem qualquer documentação
#
1
Faça o download do código e dê uma olhada nos testes de unidade. Isso deve fornecer algumas boas amostras de uso.
Garfield19
Realmente não ajuda, na verdade eu não posso mesmo fazer testes da solução pruiz ao trabalho, ele diz No tests are run because no tests are loaded or the selected tests are disabledpesquisando também não ajuda
Burjua
@ Burjua, isso geralmente está relacionado à versão do executor de teste que você está usando. No entanto, tente abrir um problema no local do projeto do meu github e eu vou tentar ajudá-lo ..
Pablo Ruiz García
Oi, este wrapper funciona bem, mas não está exibindo meus gráficos de pizza do Google. Então, até que eu possa resolver isso, eu teria que encontrar outra solução.
Andre Lombaard 29/09
1

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;
}
Shan Khan
fonte
Você pode compartilhar seu código fonte completo? Eu sou novo em c #, então eu estou ficando preso mesmo nas importações.
precisa
1

Você também pode verificar o Spire , que permite criar HTML to PDFcom 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 #

Satinder singh
fonte
O Spire gera um arquivo PDF que é apenas uma imagem. Algumas das CSS nem sequer estão corretas, como ignorar fontes em negrito.
Savage
Veja a resposta à minha pergunta sobre como gerar os PDFs como uma imagem: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage
O Spire é o quarto que eu tentei nesta página e acho que é o melhor, obrigado.
MDave 15/04
1

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 .

HiQPdf
fonte
1
Produz resultados decentes, mas, como o SelectPdf, pode ter um grande impacto no tempo de compilação e implantar o tamanho do pacote. Estava quase dobrando meu tempo de criação do Visual Studio. Também tive dificuldade em fazê-lo preencher minha página - o html era muito pequeno no meio - a esse respeito, o SelectPdf fez um trabalho melhor.
Savage
1
o preenchimento da página com conteúdo HTML depende da propriedade HtmlToPdf.BrowserWidth. É 1200 pixels por padrão, mas você pode configurá-lo para 800 pixels e o HTML deve preencher muito bem toda a página PDF. Você pode encontrar uma demonstração ao vivo e um código de exemplo para isso em hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf
1
Também não há suporte para .NET Core.
Taylor Buchanan
1

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
Alex Nolasco
fonte
0

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

Constantine
fonte
1
O BitDefender reporta: "Malware detectado! O acesso a esta página foi bloqueado.". Não tenho opinião sobre se este relatório é genuíno ou falso positivo.
GeoffM
0

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.

AffineMesh
fonte
91
Você realmente deve escrever todas as respostas que trabalha para o websupergoo. Do faq: 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
jgauffin
12
Ai! Sugeri o ABCpdf porque é um componente que estou familiarizado. Se uma grande porcentagem de minhas postagens está relacionada a PDFs, é apenas porque eu evito contribuir com tópicos fora das minhas áreas de interesse. Desculpas.
AffineMesh
Na defesa dos pôsteres, o site considera o produto muito bom.
22415 Tom Tom