【问题标题】:CSS styles not being applied to PDF with iTextSharpCSS 样式未使用 iTextSharp 应用于 PDF
【发布时间】:2013-08-10 12:26:07
【问题描述】:

我正在尝试使用 iTextSharp 将我的网页的一部分转换为 pdf,虽然 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();
}

我是接近了,还是我完全没有抓住重点?

【问题讨论】:

  • 第一个问题,格式正确的代码,显示您尝试过的内容,简短准确的描述。这肯定很少见。
  • 你解决了吗?请发布您的答案或指导该怎么做?我和你有同样的情况......

标签: c# pdf-generation itextsharp


【解决方案1】:

要使用样式表通过 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;

【讨论】:

    【解决方案2】:

    不确定您是否设法解决了这个问题,但我在 SO 上的问题“Cannot get CSS to work in iTextSharp (5.4.3) when making pdf”中没有应用 CSS 样式的问题。

    基本上我发现样式表的某些部分正在应用(例如,表格单元格周围的边框),但其他部分没有应用(字体颜色,不在 PX 中的任何东西的大小)

    【讨论】:

      【解决方案3】:

      您可以使用 CSSResolver 创建 XmlWorker

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

      【讨论】:

        猜你喜欢
        • 2012-08-18
        • 2019-02-15
        • 1970-01-01
        • 2019-12-05
        • 2023-02-04
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多