Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

WEb para PDF

Existe alguma forma de baixar um conteúdo em url para PDF ou até mesmo para word ou imagem usando o C#

11 respostas

Oi João,

Coisas que achei:

Acho que com essa combinação vc consegue o que deseja.

Olá Alberto eu ainda estou com dificuldade você poderia me ajudar?

Não estou conseguindo baixar o pdf pela URL, e não estou conseguindo fazer o request da página, vou manda meu código veja a onde estou errando, desde já muito obrigado!

esse são os dados de exemplo que estou usando

Placa: HJM8096

Renavam: 00115191364

Atte.

private void btn_url_to_pdf_Click(object sender, EventArgs e)
        {
            string url1 = "https://www.detran.mg.gov.br/veiculos/situacao-do-veiculo/emissao-de-extrato-de-multas/-/lista_tipo_infracoes_para_extrato/";
            string url2 = "/";
            string url3 = "/0/0/0/0/0/0/3/";
            string url_pesq_dados = string.Concat(url1, txt_placa.Text, url2, txt_renavam.Text, url3);

            Uri url_dados = new Uri(url_pesq_dados);


            WebRequest request = WebRequest.Create(url_dados);
            request.Credentials = CredentialCache.DefaultCredentials;



            HtmlToPdf HtmlToPdf = new IronPdf.HtmlToPdf();
            PdfResource PDF = HtmlToPdf.RenderUrlAsPdf(url_dados);
            PDF.SaveAs(@"c:\\teste\\"+"placa_"+txt_placa.Text+"_renavan_"+txt_renavam.Text+".pdf");
        }

Qual erro que dá? É necessário o erro para continuarmos ajudando.

O mesmo esta retorna o PDF em Branco, isso que esta acontecendo, agora não sei se estou errando na questão de fazer o request da URL no código descrito assim, ou na questão de fazer uma webclient.

João, dê uma olhada nesse link: https://code.msdn.microsoft.com/Convert-from-HTML-to-PDF-09ce2a1d

Depois de adicionar a lib na sua solução, parece bem simples converter para pdf a partir de uma URL:

// instantiate the html to pdf converter 
HtmlToPdf converter = new HtmlToPdf(); 

// convert the url to pdf 
PdfDocument doc = converter.ConvertUrl(url); 

// save pdf document 
doc.Save(file); 

// close pdf document 
doc.Close();

Olá Gabriel, Tudo Bem!

Eu efetuei todos os procedimento, baixei pelo NuGet, todo o conteúdo no meu projeto, o mesmo criou um pasta de packages onde estão alocados toda a documento da lib, e montei o seguinte código.

private void btn_pdf_Click(object sender, EventArgs e)
        {
            string file = (@"c:\\teste\\teste.pdf");

            HtmlToPdf convert = new HtmlToPdf();

            PdfDocument doc = convert.ConvertUrl(txt_url.Text);

            doc.Save(file);

            doc.Close();

        }

Porem o mesmo agora gerou esse erro, ("Conversion error: Navigation timeout."), pesquisei mais afundo e noite que era referente ao time da aplicação, e que é preciso declarar um time para gerar o mesmo converte, essa declaração logo em seguida do HtmlToPdf.

private void btn_pdf_Click(object sender, EventArgs e)
        {
            string file = (@"c:\\teste\\teste.pdf");

            HtmlToPdf convert = new HtmlToPdf();
            convert.Options.MaxPageLoadTime = 120;
            PdfDocument doc = convert.ConvertUrl(txt_url.Text);

            doc.Save(file);

            doc.Close();

        }

porem após ter feito isso mesmo continuou com o erro de ("Conversion error: Navigation timeout.").

Obrigado pelo suporte que estão me dando.

Apesar de não trabalhar com C# gostaria de dar uma sugestão para resolver este interessante problema.

Eu gostaria de sugerir uma abordagem diferente para o problema, ou seja, ao invés de diretamente passar o link que deve ser convertido para PDF, tentar converter para PDF apenas a tabela com as multas.

Para fazer isso, seria necessário:

Baixar o HTML Extrair apenas a tabela. Pegar o HTML referente a tabela e mandar gerar um PDF.

Para pegar o codigo fonte da página se poderia fazer algo assim:

http://csharp.net-informations.com/communications/csharp-url-content.htm

ou talvez

var html = new System.Net.WebClient().DownloadString(siteUrl)

Depois de guardar o HTML numa variavel, se poderia instalar o Agility Pack para poder manusear este conteúdo.

Neste link do Detran, eu tenho apenas uma tag TABLE. Creio que para puxar o conteúdo se poderia fazer isso:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(STRING_HTML);

var node1A = doc.DocumentNode.SelectSingleNode("//table");
string content1A = node1A.InnerHtml;
Console.WriteLine(content1A);

Aqui tem link com outros exemplos

http://stackoverflow.com/questions/26065766/get-specific-tables-with-html-agility-pack

Com uma variável com o HTML da tabela, se poderia gerar um PDF fazendo isso:

http://selectpdf.com/html-to-pdf/demo/convert-html-code-to-pdf.aspx

Claro que existe uma desvantagem nessa abordagem, pode ocorrer mudança na estrutura da página, o que acabaria invalidando essa solução. Mas não deixa de ser uma solução alternativa, já que desta forma poderíamos extrair dados e exportar num formato diferente.

Caso exista a necessidade de extrair mais informações da página, o miolo da página parece estar envolvido numa div chamada "retorno-formulario"

Olá Daniel, Bom Dia Tudo Bem!

Muito interessante esse seu método, porem vou aproveitar ele em uma outra aplicação minha que será exclusiva também na obtenção de dados de multas. Porem eu preciso infelizmente baixar a URL ou a página em HTML para PDF, do site que falei, pois estou trabalhando numa aplicação interna na minha empresa, essa tarefa de baixar o PDF já é feita hoje, porem manualmente, e fiquei encarregado de automatizar essa tarefa, e digo que não é fácil. Eu até poderia usar o PHP que já tem uma biblioteca própria para isso, porem essa aplicação tem que ser em Windows Form, que é recomendação de minha empresa. Muito obrigado pela ajuda e todo suporte que meu porem vou continuar a pesquisar uma solução.

Abraços e muito obrigado.

Você pode tentar uma API online de conversão, algumas são gratuitas para uma certa quantidade de requisições por mês

https://www.html2pdfrocket.com/convert-csharp-to-pdf

O código parece bem simples, e eles tem na home do site um link para testes. Ele gerou o PDF rápido, mas o menu ficou fora do lugar, apesar disso a parte mais importante que é o conteúdo ficou igual

Olá Dani, Tudo Bem!

Esse é outro ponto que também tentamos aqui não deu certo.

1-> Fizemos um WebRequest que faz a o seguinte ele monta a url ou seja o endereço da página, e logo em seguida ele insere essa url no campo e baixamos o pdf, até ai tudo bem, porem quando ele se aproxima de uma certa quantidade o site começa a informar que tempo estimado para conversão é de 60seg, e 60 segundo para uma base de 2500 placas se torna meio inviável.

2-> Outra forma que iriamos utilizar seria um Motor (API), que estaria vinculado ao projeto, e dessa forma ele faria todo o tratamento, da página porem esse Motor(API) nos seria custeado um valor x, porem a nossa diretoria não aceitou pois hoje o que impera no nosso ambiente de trabalho é a redução de custo.

Isso fora outros teste que tentamos, já buscamos até uma forma de baixar url para Word e depois converte em PDF, essa situação é muito complicada.

Muito Obrigado.

solução!

Olá Amigos da Alura, eu achei o modo de fazer a URL vira pdf, porem de um outro jeito, usando a Tecnologia WPF C#, o que seria essa tecnologia, ela é muito semelhante ao C# que a Alura oferece porem ela mistura um pouco de HTML.

Resumindo montei uma aplicação teste, e utilizei a LIB Spire.PDF, e coloquei esse código.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Spire.Pdf;

namespace minas_detram
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }


        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //Create a new pdf document.

            PdfDocument doc = new PdfDocument();

            //load the webpage

            String url = "https://www.detran.mg.gov.br/veiculos/situacao-do-veiculo/emissao-de-extrato-de-multas/-/exibir_lista_tipos_infracoes_multas/";

            doc.LoadFromHTML(url, false, true, true);

            //Save html webpage as pdf file.

            doc.SaveToFile(@"c:\\teste\\sample.pdf");

            doc.Close();
        }

    }
}

E pronto faz o debug da aplicação e veja o resultado, o pdf sai em segundos.

Desde já gostaria de agradecer a todos pela ajuda e ai esta a solução do problema, espero que também tenho ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software