2013-08-08 15 views
7

Sto tentando di convertire una parte della mia pagina Web in pdf utilizzando iTextSharp e mentre la generazione di PDF funziona correttamente, nessuno degli stili CSS viene applicato. Ho provato ad applicare gli stili uno alla volta, ma non sembra funzionare. Questo è quello che ho inventato finora:Gli stili CSS non vengono applicati a PDF con 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(); 
} 

Mi manca qualcosa? Ho iniziato a utilizzare HTMLWorker e sono passato a XMLWorker, ma ora mi sto confondendo. L'aiuto sarebbe apprezzato

attemp # 2

Grazie per la risposta! Questo è quello che ho trovato, ma non funziona. Il mio contenuto non appare nel pdf a tutti ora, e non sono sicuro del perché. qualche idea?

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(); 
} 

Sono chiuso o mi manca completamente il punto?

+6

Prima domanda, codice formattato correttamente, che mostra ciò che hai provato, una descrizione breve e accurata. Questo è raro. – gunr2171

+0

Hai risolto? Per favore pubblica la tua risposta o guida cosa fare? Sto avendo la stessa situazione come te .... – micronyks

risposta

0

è possibile creare il XmlWorker utilizzando un CSSResolver

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

E quindi creare il HtmlPipeline e passarlo al costruttore CssResolverPipeline:

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

Non è sicuro se sei riuscito a risolvere questo problema, ma ho avuto lo stesso problema di stili CSS non applicati nella mia domanda "Cannot get CSS to work in iTextSharp (5.4.3) when making pdf" qui su SO.

Fondamentalmente ho scoperto che alcune parti del foglio di stile sono stati applicati (ad esempio, i bordi intorno a celle della tabella), ma gli altri non (il colore dei font, dimensioni di tutto quanto non essendo in PX)

2

Per poter utilizzare i fogli di stile per creare un file PDF con XmlWorker puoi provare questo codice di esempio che restituisce un array di byte.



     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; 
Problemi correlati