CSS стиловете не се прилагат към PDF с iTextSharp

Опитвам се да конвертирам част от моята уеб страница в pdf с помощта на iTextSharp и докато генерирането на pdf работи правилно, нито един от стиловете на 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, но мисля, че сега просто се обърквам. Помощта ще бъде оценена.

ОПИТ №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();
}

Близо ли съм, или напълно пропускам темата?


person Broodmdh    schedule 08.08.2013    source източник
comment
Първи въпрос, правилно форматиран код, показващ какво сте опитали, кратко точно описание. Това със сигурност е рядкост.   -  person gunr2171    schedule 08.08.2013
comment
Решихте ли го? Моля, публикувайте отговора си или насочете какво да правите? И аз съм в същата ситуация като теб....   -  person micronyks    schedule 05.02.2016


Отговори (3)


За да използвате таблици със стилове за създаване на PDF файл с 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;
person Agus Rdz    schedule 26.09.2015

Можете да създадете XmlWorker с помощта на 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:

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();
person SShakeri    schedule 08.08.2013

Не съм сигурен дали сте успели да заобиколите този проблем, но имах същия проблем с неприлагането на CSS стилове в моя въпрос "Не мога да накарам CSS да работи в iTextSharp (5.4.3), когато правя pdf" тук на SO.

По принцип открих, че някои части от листа със стилове се прилагат (например граници около клетките на таблицата), но други не (цвят на шрифтове, размери на всичко, което не е в PX)

person kolin    schedule 14.11.2013