2013-08-08 11 views
7

के साथ पीडीएफ पर लागू नहीं किया जा रहा है। मैं अपने वेबपृष्ठ के एक हिस्से को iTextSharp का उपयोग करके पीडीएफ में परिवर्तित करने का प्रयास कर रहा हूं, और पीडीएफ पीढ़ी सही तरीके से काम कर रहा है, सीएसएस शैलियों में से कोई भी लागू नहीं किया जा रहा है। मैंने एक समय में शैलियों को लागू करने का प्रयास किया है, लेकिन ऐसा लगता है कि यह काम नहीं करता है। यही वह है जो मैंने अभी तक किया है:सीएसएस शैलियों को 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(); 
} 

क्या मुझे कुछ याद आ रही है? मैंने HTMLWorker का उपयोग शुरू कर दिया और XMLWorker पर स्विच किया है, लेकिन मुझे लगता है कि मैं अभी खुद को भ्रमित कर रहा हूं। मदद की सराहना की जाएगी।

प्रयास # 2

उत्तर के लिए धन्यवाद! यही वह है जिसके साथ मैं आया हूं, लेकिन यह काम नहीं कर रहा है। मेरी सामग्री अब पीडीएफ में दिखाई नहीं दे रही है, और मुझे यकीन नहीं है कि क्यों। कोई विचार?

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

और फिर अपने HtmlPipeline बनाने और इसे CssResolverPipeline निर्माता को पारित का उपयोग कर XmlWorker बना सकते हैं:

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" में एसओ पर लागू नहीं किया जा रहा था।

असल में मैंने पाया कि स्टाइलशीट के कुछ भागों (तालिका सेल के आसपास उदाहरण के लिए, सीमाओं) लागू किया गया जा रहा है, लेकिन दूसरों को नहीं

2

(फोंट का रंग, कुछ भी के आकार PX में नहीं किया जा रहा) आदेश स्टाइलशीट का उपयोग करने के XmlWorker के साथ एक पीडीएफ फाइल बनाने के लिए आप इस उदाहरण कोड को आजमा सकते हैं जो बाइट सरणी देता है।



     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;