2013-09-17 5 views
1

У меня проблема с попыткой применить файл css к моему pdf с помощью библиотеки генерации iTextSharp (5.4.3). в основном, css не применяется вообще.Невозможно заставить CSS работать в iTextSharp (5.4.3) при создании pdf

я следующий метод в моем файле 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 ICSSResolver = 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 просто содержит:

p{color:#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 Q3 2013) является старым html, и, похоже, у синтаксического анализа есть проблема с таблицами.

ответ

0

Ну казалось бы, что CSS правильно применяется, как я испытал

td{ 
    border:1px solid red; 
    padding:0.4em; 
    margin:0; 
} 

в формате PDF, и все клетки получили каймой красного, так что может показаться, что PDF отменяет определенные стили. Не знаю, почему.

+0

Вы должны применить стиль границы как border-width: 1px; border-style: solid; border-color: red; Парсер CSS, похоже, не понимает составных правил. – sumitkm

2

iTextSharp очень плохой дизайн с использованием css, изображений и т. Д. Вместо этого wkhtmltopdf является лучшим.

Смежные вопросы