2013-08-08 11 views
7

Ich versuche, einen Teil meiner Webseite mit iTextSharp in PDF zu konvertieren, und während die PDF-Generierung ordnungsgemäß funktioniert, keine der CSS-Stile angewendet werden. Ich habe versucht, die Stile nacheinander anzuwenden, aber das scheint nicht zu funktionieren. Das ist, was ich bisher gefunden habe:CSS-Stile nicht auf PDF mit iTextSharp

//Get the portion of the page to convert. 
StringBuilder sb = new StringBuilder(); 
print_div.RenderControl(new HtmlTextWriter(new StringWriter(sb))); 
string html = sb.ToString(); 

//Generate a random filename to use for the pdf 
Guid random_guid; 
random_guid = Guid.NewGuid(); 
string fileName = random_guid.ToString() + ".pdf"; 
string filename_with_folder = @"pdf\sl_" + fileName; 
string fullFilePath = System.IO.Path.Combine(Request.PhysicalApplicationPath, filename_with_folder); 

using (Document doc = new Document()) 
{ 
    // Create the pdf 
    PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(fullFilePath, FileMode.Create)); 
    doc.Open(); 
    try 
    { 
     //Set the font size for all elements 
     StyleSheet styles = new StyleSheet(); 
     styles.LoadStyle("body", "fontsize", "8px"); 

     //Write the content to the pdf document 
     StringReader sr = new StringReader(html); 
     XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, sr); 
    } 
    catch (Exception ex) 
    { 
    } 
    doc.Close(); 
} 

Fehle ich etwas? Ich habe mit HTMLWorker angefangen und bin zu XMLWorker gewechselt, aber ich glaube, ich verwirre mich jetzt nur noch. Hilfe wäre willkommen.

attemp # 2

Danke für die Antwort! Das ist, was ich mir ausgedacht habe, aber es funktioniert nicht. Mein Inhalt erscheint jetzt überhaupt nicht mehr in der PDF und ich bin mir nicht sicher warum. Irgendwelche Gedanken?

using (Document doc = new Document()) 
{ 
    PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(fullFilePath, FileMode.Create)); 
    doc.Open(); 

    // CSS 
    var cssResolver = new StyleAttrCSSResolver(); 
    var cssFile = XMLWorkerHelper.GetCSS(new FileStream(HttpContext.Current.Server.MapPath("~/css/print.css"), FileMode.Open)); 
    cssResolver.AddCss(cssFile); 

    // HTML 
    CssAppliers ca = new CssAppliersImpl(); 
    HtmlPipelineContext hpc = new HtmlPipelineContext(ca); 
    hpc.SetTagFactory(Tags.GetHtmlTagProcessorFactory()); 

    // PIPELINES 
    PdfWriterPipeline pdf = new PdfWriterPipeline(doc, writer); 
    HtmlPipeline htmlPipe = new HtmlPipeline(hpc, pdf); 
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, htmlPipe); 

    XMLWorker worker = new XMLWorker(css, true); 
    XMLParser p = new XMLParser(worker); 
    StringReader sr = new StringReader(html); 
    p.Parse(sr); 
    doc.Close(); 
} 

Bin ich nah, oder fehlt mir der Punkt vollständig?

+6

Erste Frage, korrekt formatierter Code, zeigt, was Sie versucht haben, eine kurze genaue Beschreibung. Das ist sicher selten. – gunr2171

+0

Sie haben es gelöst? Bitte posten Sie Ihre Antwort oder Anleitung, was zu tun ist? Ich habe die gleiche Situation wie du .... – micronyks

Antwort

0

Sie können die XmlWorker erstellen

var cssResolver = new StyleAttrCSSResolver(); 
//Change the path to your CSS file 
var cssFile = XMLWorkerHelper.GetCSS(new FileStream(HttpContext.Current.Server.MapPath("~/pdf.css"), FileMode.Open)); 
cssResolver.AddCss(cssFile); 

ein CSSResolver mit und dann HtmlPipeline erstellen und an den CssResolverPipeline Konstruktor übergeben:

CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); 
XMLWorker worker = new XMLWorker(css, true); 
XMLParser p = new XMLParser(worker); 
using (TextReader sr = new StringReader(html)) 
     { 
      p.Parse(sr); 
      document.Close(); 
     } 
     //close your writer 
     pdfwriter.Close(); 
0

Nicht sicher, ob Sie dieses Problem arbeiten, verwaltet, aber ich hatte das gleiche Problem von CSS-Stilen, die in meiner Frage "Cannot get CSS to work in iTextSharp (5.4.3) when making pdf" hier auf SO nicht angewendet werden.

Grundsätzlich fand ich, dass einige Teile des Stylesheets (zB Ränder um Tabellenzellen) angewendet wurden, aber andere nicht (Farbe von Schriftarten, Größen von irgendetwas in PX nicht sein)

2

Um Sheets zu verwenden Um eine PDF-Datei mit XmlWorker zu erstellen, können Sie diesen Beispielcode versuchen, der ein Byte-Array zurückgibt.



     byte[] bytesArray = null; 
     using (var ms = new MemoryStream()) 
     { 
      using (var document = new Document()) 
      { 
       using (PdfWriter writer = PdfWriter.GetInstance(document, ms)) 
       { 
        document.Open(); 
        using (var strReader = new StringReader(html)) 
        { 
         //Set factories 
         HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
         htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory()); 
         //Set css 
         ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false); 
         cssResolver.AddCssFile(System.Web.HttpContext.Current.Server.MapPath("~/Content/bootstrap.min.css"), true); 
         //Export 
         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(strReader); 
         xmlParse.Flush(); 
        } 
        document.Close(); 
       } 
      } 
      bytesArray = ms.ToArray(); 
     } 
     return bytesArray; 
Verwandte Themen