【发布时间】:2015-02-04 20:58:05
【问题描述】:
我一直在使用 iTextSharp 将 MVC 视图转换为 pdf。该视图使用内联样式。下面的代码一切正常但解析很慢-
using (var ms = new MemoryStream())
{
using (var doc = new Document(PageSize.A4, 0, 1, 0,0))
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
doc.Open();
XMLWorkerHelper.GetInstance().ParseXHtml(writer,doc, htmlcontent);
//Above line is too slow
doc.Close();
}
}
按照这里专家的建议,我继续进行以下修改-
- 注册字体
- 将样式移至不同的 css 文件
现在我正在使用下面的代码,但是生成的 pdf 是空白的。它确实保留了样式但没有字体,即使这种方法也需要同样的时间来解析
using (var ms = new MemoryStream())
{
using (var doc = new Document(PageSize.A4, 0, 1, 0,0))
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
doc.Open();
// css
var cssResolver = new StyleAttrCSSResolver();
var cssFile = XMLWorkerHelper.GetCSS((new FileStream(Server.MapPath("~/Content/scptpdf.css"), FileMode.Open, FileAccess.Read)));
cssResolver.AddCss(cssFile);
// html
var fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.Register(Server.MapPath("~/Content/fonts/arial.ttf"));
fontProvider.Register(Server.MapPath("~/Content/fonts/arialbd."));
fontProvider.AddFontSubstitute("calibri","ARIAL");
var cssAppliers = new CssAppliersImpl(fontProvider);
var htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
var pdf = new PdfWriterPipeline(doc, writer);
var html = new HtmlPipeline(htmlContext, pdf);
var css = new CssResolverPipeline(cssResolver, html);
var worker = new XMLWorker(css,true);
var p = new XMLParser(worker);
byte[] byteArray = Encoding.UTF8.GetBytes(pdftext);
var htmlstream = new MemoryStream(byteArray);
p.Parse(htmlstream);
//XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, htmlcontent);
doc.Close();
}
}
我需要克服延迟。可以对此有所帮助。提前致谢。
【问题讨论】:
-
不看 HTML 就很难评论这个问题。也许您有包含大量嵌套元素的巨大表格。如果没有 HTML,也无法在更改代码时找出 PDF 为空白的原因。我的第一个猜测是:你有字体问题,但这只是一个猜测。
-
我已经使用 itextsharp 两年了。我喜欢它,因为它可以完成任务,但是当我尝试转换 100000 个字符的 HTML 文件时遇到了同样的问题。 iTextsharp 在大约 10 分钟内将其转换,这是不可接受的。我尝试使用 wkhtmltopdf 转换相同的 HTML 文件,但令我惊讶的是它在大约 10 秒内转换了文件。 iTextSharp 是一个很棒的工具,但性能很慢,因为它是用托管代码编写的。另一方面,wkhtmltopdf 完全是原生编写的。我使用 TuesPechkin,这是迄今为止 ASP.NET 项目最好的 wkhtmltopdf 包装器。
标签: c# css asp.net-mvc itextsharp