2016-04-27 11 views
0

Hallo Leute ich eine Zahlung Rechnung bestellen in PDF von meinem HTML-Inhalte am erzeugen und per E-Mail mit dem folgenden Code zu senden:PDF Nicht die Darstellung von HTML Css ASP.NET

***//Generates PDF Payment Invoice***  
    StringBuilder sb = new StringBuilder(); 
    sb.Append(@"<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"">");  
    sb.Append(boletoBancario.MontaHtml()); 

    StringReader sr = new StringReader(sb.ToString()); 

    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f); 

    HTMLWorker htmlparser = new HTMLWorker(pdfDoc); 
    byte[] bytes; 

    memoryStream = new MemoryStream(); 

    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, memoryStream); 
    pdfDoc.Open(); 

    iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet(); 
    ST.LoadTagStyle("body", "encoding", "Identity-H"); 
    htmlparser.SetStyleSheet(ST); 
    htmlparser.Parse(sr);    

    pdfDoc.Close(); 
    bytes = memoryStream.ToArray(); 
    memoryStream.Close();      
    memoryStream = new MemoryStream(bytes); 


    ***//Sends E-mail with PDF PAYMENT INVOICE Attached*** 
    MailAddress de = new MailAddress(enderecoOrigem, HttpUtility.HtmlDecode(nomeOrigem)); 
    MailAddress para = new MailAddress(enderecoDestino, HttpUtility.HtmlDecode(nomeDestino)); 

    MailMessage mensagem = new MailMessage(de, para); 
    NetworkCredential credential = new NetworkCredential(usuarioConta, senhaConta); 
    SmtpClient smtp = new SmtpClient(); 
    smtp.Host = servidorSMTP; 
    smtp.Port = Convert.ToInt32(porta); 
    MailAddressCollection comCopia;  

    Attachment att = new Attachment(memoryStream, "Boleto.pdf", MediaTypeNames.Application.Pdf); 
    mensagem.Attachments.Add(att);  

    mensagem.Subject = "Payment Invoice"; 
    mensagem.Body = String.Format("Your payment invoice is available."); 
    mensagem.IsBodyHtml = true; 

    smtp.UseDefaultCredentials = true; 
    smtp.EnableSsl = false;  

    smtp.Send(mensagem);  

Das Problem ist, dass die PDF, das an die E-Mail angehängt ist, rendert den HTML-Code nicht korrekt, so dass er immer noch nicht formatiert ist. Ansonsten, wenn ich eine leere Datei anlege und den gesamten HTML-Code einfüge und ihn mit Chrome öffne, ist er ziemlich gut formatiert.

Ich muss dieses PDF korrekt an die E-Mail angehängt bekommen.

Kann mir jemand helfen? Here You can see the Rendering Problem

Antwort

0

Endlich habe ich die Lösung für mein Problem gefunden!

Es war notwendig, die Bibliothek itextSharp.xmlWorker zu verwenden und einige Änderungen im Code-Behind vorzunehmen. Der Grund dafür ist HTMLWorker nicht wirklich CSS beheben, so musste ich XMLWorker stattdessen verwenden und tun wie folgt vor:

//Geração de PDF 
    StringBuilder sb = new StringBuilder();  
    StringReader sr; 
    Document pdfDoc; 
    PdfWriter writer; 
    byte[] bytes; 

    sb.Append(boletoBancario.MontaHtml()); 
    sr = new StringReader(sb.ToString().Replace("<br />","<b></b>").Replace("<br>","<br></br>")); 

    pdfDoc = new Document(PageSize.A4, 30, 30, 30, 30); 

    writer = PdfWriter.GetInstance(pdfDoc, memoryStream); 
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
    htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory()); 

    ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false); 

    IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(pdfDoc, writer))); 

    XMLWorker worker = new XMLWorker(pipeline, true); 
    XMLParser xmlParser = new XMLParser(worker); 

    pdfDoc.Open(); 

    xmlParser.Parse(sr); 

    pdfDoc.Close(); 

    bytes = memoryStream.ToArray(); 
    memoryStream.Close(); 

    return new MemoryStream(bytes); 

Dank Sie alle btw!