none
Gerar PDF a partir do html usando ITextSharp ASP.NET C# RRS feed

  • Pergunta

  • Bom dia,

    Estou precisando gerar um pdf a partir do html ele funciona normal mas quando há alguma imagem html ele não exibe quando é gerado o pdf, já perdi alguns dias batendo a cabeça para resolver esse problema mas não consegui chegar em nenhuma resolução. 

    Se alguem poder me ajudar agradeço, deixarei o código abaixo.

    protected void btn_Command(object sender, CommandEventArgs e)
            {
                HttpWebRequest request;
                HttpWebResponse response;
                Stream stream;
                StreamReader streamReader;

                string strSiteUrl = "localhost:52192/Default.aspx";
                request = (HttpWebRequest)WebRequest.Create(strSiteUrl);
                response = (HttpWebResponse)request.GetResponse();
                stream = response.GetResponseStream();
                streamReader = new StreamReader(stream);

                string html = streamReader.ReadToEnd();
                criarPDF(html, "Arquivo", "~/Css/StyleMateria.css");
            }
            private void criarPDF(string html, string nomeArquivo, string linkCss)
            {
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.ContentType = "application/pdf";

                HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + nomeArquivo);

                using (var document = new Document(PageSize.A4, 40, 40, 40, 40))
                {
                    html = FormatImageLinks(html);

                    //define o  output do  HTML
                    var memStream = new MemoryStream();
                    TextReader xmlString = new StringReader(html);

                    PdfWriter writer = PdfWriter.GetInstance(document, memStream);

                    document.Open();

                    //Registra todas as fontes no computador cliente.
                    FontFactory.RegisterDirectories();

                    // Set factories
                    var htmlContext = new HtmlPipelineContext(null);
                    htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

                    // Set css
                    ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
                    cssResolver.AddCssFile(HttpContext.Current.Server.MapPath(linkCss), true);

                    // Exporta
                    IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));

                    var worker = new XMLWorker(pipeline, true);
                    var xmlParse = new XMLParser(true, worker);
                    xmlParse.Parse(xmlString);
                    xmlParse.Flush();

                    document.Close();
                    document.Dispose();

                    HttpContext.Current.Response.BinaryWrite(memStream.ToArray());
                }
                HttpContext.Current.Response.End();
                HttpContext.Current.Response.Flush();
            }
            public static string FormatImageLinks(string input)
            {
                if (input == null)
                {
                    return string.Empty;
                }

                string tempInput = input;
                const string pattern = @"";
                HttpContext context = HttpContext.Current;

                foreach (Match m in Regex.Matches(input, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.RightToLeft))
                {
                    if (!m.Success) continue;
                    string tempM = m.Value;
                    const string pattern1 = "src=[\'|\"](.+?)[\'|\"]";
                    var reImg = new Regex(pattern1, RegexOptions.IgnoreCase | RegexOptions.Multiline);
                    Match mImg = reImg.Match(m.Value);

                    if (!mImg.Success) continue;
                    string src = mImg.Value.ToLower().Replace("src=", "").Replace("\"", "").Replace("\'", "");

                    if (src.StartsWith("http://") || src.StartsWith("https://")) continue;
                    //Inserimos a nova URL na tag img
                    src = "src=\"" + context.Request.Url.Scheme + "://" +
                          context.Request.Url.Authority + src + "\"";

                    try
                    {
                        tempM = tempM.Remove(mImg.Index, mImg.Length);
                        tempM = tempM.Insert(mImg.Index, src);

                        // inserimos a nova url img para todo o código html
                        tempInput = tempInput.Remove(m.Index, m.Length);
                        tempInput = tempInput.Insert(m.Index, tempM);
                    }
                    catch (Exception)
                    {

                    }
                }
                return tempInput;
            }

    quinta-feira, 8 de setembro de 2016 14:08

Respostas

  • André,

    Respondi esse thread já faz um tempo, mas talvez te ajude:

    https://social.msdn.microsoft.com/Forums/pt-BR/049133ce-2ce0-4b6e-9194-53b62e12ddbe/como-gerar-um-arquivo-pdf-a-partir-de-uma-pagina-aspx?forum=aspnetpt


    Carlos Eduardo Ferreira

    quinta-feira, 8 de setembro de 2016 14:49

Todas as Respostas

  • Olá,

    Dá uma olhada nessa thread, talvez lhe ajude de alguma forma: http://stackoverflow.com/questions/29281040/itextsharp-xmlworkerhelper-and-images-for-html-to-pdf

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    quinta-feira, 8 de setembro de 2016 14:16
  • André,

    Respondi esse thread já faz um tempo, mas talvez te ajude:

    https://social.msdn.microsoft.com/Forums/pt-BR/049133ce-2ce0-4b6e-9194-53b62e12ddbe/como-gerar-um-arquivo-pdf-a-partir-de-uma-pagina-aspx?forum=aspnetpt


    Carlos Eduardo Ferreira

    quinta-feira, 8 de setembro de 2016 14:49
  • Tentei fazer do mesmo modo só que ele dá erro 

    this.RenderControl(htextw);

    E pelo que vi no código ele não iria gerar um espelho da pagina

    quinta-feira, 8 de setembro de 2016 17:51
  • Boa tarde AndreGomesA,

    Neste link há um código de uma ferramenta que faz essa conversão. Talvez possa ajudar.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 9 de setembro de 2016 17:20
    Moderador
  • Bom dia Robson, na minha situação não posso pegar via url, pq estou mexendo com login. Se por via url só vai renderizar a pagina inicial que pede o e-mail e senha do usuário.

    Atenciosamente, André Gomes.

     
    sábado, 10 de setembro de 2016 11:57
  • Você copiou o código?

    Qual é a mensagem de erro?

    Poderia postar seu código?


    Carlos Eduardo Ferreira

    segunda-feira, 12 de setembro de 2016 11:57
  • Bom dia,

    Devido a falta de resposta do usuário
    essa thread está sendo fechada.
    Se o problema ainda estiver ocorrendo,
    favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 14 de setembro de 2016 13:16
    Moderador