2013-08-08 23 views
7

iTextSharpを使用してWebページの一部をpdfに変換しようとしていますが、pdf生成が正しく機能している間にCSSスタイルが適用されていません。私はスタイルを一度に1つずつ適用しようとしましたが、それはうまくいかないようです。これはこれまで私が思い付いたことです:iTextSharpでCSSスタイルが適用されない

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

私には何かが欠けていますか?私はHTMLWorkerを使い始め、XMLWorkerに切り替えましたが、今は自分自身を混乱させるだけです。ヘルプをいただければ幸いです。返信用

ATTEMP#2

ありがとう!これは私が思いついたものですが、うまくいきません。私のコンテンツは今のところpdfには表示されません。理由はわかりません。何かご意見は?

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

私は閉じるか、ポイントを完全に紛失していますか?

+6

最初の質問、正しくフォーマットされたコード、試したことを示す、正確な短い説明。これはまれです。 – gunr2171

+0

あなたはそれを解決しましたか?あなたの答えを投稿したり、何をすべきか指導してください。私はあなたのような状況にあります.... – micronyks

答えて

0

あなたは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); 

を使用してXmlWorkerを作成し、あなたのHtmlPipelineを作成し、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

ないあなたはこの問題を回避するために管理した場合に確認してください、私の質問には「Cannot get CSS to work in iTextSharp (5.4.3) when making pdf」のCSSスタイルは適用されていませんでした。

は、基本的に私は、スタイルシートを使用するために

2

(何かのサイズはPXにない、フォントの色)ではない(表セルの周りに、例えば、境界線)スタイルシートの一部が適用されたことを見出したが、その他XmlWorkerでPDFファイルを作成するには、バイト配列を返すこのサンプルコードを試してみてください。



     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;