制作pdf时无法让CSS在iTextSharp(5.4.3)中工作
Posted
技术标签:
【中文标题】制作pdf时无法让CSS在iTextSharp(5.4.3)中工作【英文标题】:Cannot get CSS to work in iTextSharp (5.4.3) when making pdf 【发布时间】:2013-09-22 02:18:04 【问题描述】:我在尝试使用 iTextSharp (5.4.3) 生成库将 css 文件应用到我的 pdf 时遇到问题。基本上css根本没有被应用。
我的 vb.net 文件中有以下方法
Protected Sub btnPreview_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPreview.Click
Dim bytes As Byte()
bytes = System.Text.Encoding.UTF8.GetBytes(letterRadEdit.Content)
Dim tagProcessor As tool.xml.html.DefaultTagProcessorFactory()
Using input As New MemoryStream(bytes, False)
Dim ms As New MemoryStream()
Dim document As New iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER, 36, 36, 36, 36)
Dim writer As PdfWriter = PdfWriter.GetInstance(document, ms)
writer.CloseStream = False
document.Open()
Dim htmlContext As HtmlPipelineContext = New HtmlPipelineContext(Nothing)
htmlContext.SetAcceptUnknown(True)
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory())
Dim cssResolver As ICs-s-resolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(False)
cssResolver.AddCssFile(HttpContext.Current.Server.MapPath("/assets/css/pdf.css"), True)
Dim pipeline As New CssResolverPipeline(cssResolver, New HtmlPipeline(htmlContext, New PdfWriterPipeline(document, writer)))
Dim pdfworker As New XMLWorker(pipeline, True)
Dim p As New XMLParser(True, pdfworker, New System.Text.UTF8Encoding)
Try
'p.AddListener(pdfworker)
'p.Parse(input, Encoding.UTF8)
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, input, New FileStream(HttpContext.Current.Server.MapPath("~/assets/css/pdf.css"), FileMode.Open, FileAccess.Read))
Catch
Finally
pdfworker.Close()
End Try
document.Close()
ms.Position = 0
Response.Buffer = True
Response.Clear()
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=preview.pdf")
Response.BinaryWrite(ms.GetBuffer())
Response.Flush()
End Using
End Sub
CSS 文件只包含:
pcolor:#e10000;margin-bottom:1.2em;
(这是为了测试渲染是否正确,所有文字都应该是红色的)
我的问题是下面的命令
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, input, New FileStream(HttpContext.Current.Server.MapPath("~/assets/css/pdf.css"), FileMode.Open, FileAccess.Read))
正确生成 pdf,但不应用 CSS。我知道它正在读取 CSS,因为在我应用 FileAccess.Read 属性之前我有权限异常
方法
p.Parse(input, Encoding.UTF8)
不生成任何 pdf,只是“不允许元素”异常,这是因为 html(来自 radeditor 文本框 2013 年第三季度)是旧 html,并且解析似乎有表格问题。
【问题讨论】:
【参考方案1】:iTextSharp 在使用 css、图像等的设计方面非常糟糕。相反,wkhtmltopdf 是最好的。
【讨论】:
【参考方案2】:好吧,当我测试一个
td
border:1px solid red;
padding:0.4em;
margin:0;
到 pdf,所有单元格都以红色边框,因此 pdf 似乎覆盖了某些样式。不知道为什么。
【讨论】:
您必须将边框样式应用为边框宽度:1px;边框样式:实心;边框颜色:红色; CSS 解析器似乎不理解复合规则。以上是关于制作pdf时无法让CSS在iTextSharp(5.4.3)中工作的主要内容,如果未能解决你的问题,请参考以下文章
在 iTextSharp 中使用 CSS 从 HTML 渲染 PDF