Стили 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