我花了很长一段时间来搜索易于使用的库,它以html字符串作为输入,并将PDF输出作为文件输出到客户端浏览器。
在我尝试过的几十个工具中,一个名为NReco PDF Generator的产品,它是基于wkhtmltopdf的众多衍生工具之一,似乎符合我的需求。
这是我的测试代码:
var strHtml = String.Format("<h1>Hello World!</h1");
Response.Clear();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=test.pdf");
(new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(strHtml, null, Response.OutputStream);
Response.End();
使用上面的代码,我希望看到一个PDF文件传递给我的浏览器。相反,我只看到在我的开发者控制台中生成的输出流。 (顺便说一句,我使用的是Chrome)
我的问题不是关于该产品是如何工作的,我认为这是按预期工作的,但它是关于我的代码是否缺少.NET的Response
对象的任何操作或者正在做什么哪里不对了。正如我已经指出的那样,我可以在控制台中看到转换后的Pdf流。我认为这只是在文件中捕获该流并将其传递给客户端的问题。
答案 0 :(得分:2)
缺失的行是Response.BinaryWrite(pdfBytes)
。没有该行,PDF将不会呈现给用户。
据我所知,你不需要这些行:
Response.Clear();
Response.ClearHeaders();
以下适用于我(显然,您需要添加using NReco.PdfGenerator;
)
string strHtml = String.Format("<h1>Hello World!</h1");
HtmlToPdfConverter pdfConverter = new HtmlToPdfConverter();
var pdfBytes = pdfConverter.GeneratePdf(strHtml);
Response.ContentType = "application/pdf";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("Content-Disposition", "Inline; filename=TEST.pdf");
Response.BinaryWrite(pdfBytes);
Response.Flush();
Response.End();
答案 1 :(得分:0)
将PDF存储为字节数组,然后将其写入响应。
var pdfBytes = new NReco.PdfGenerator.HtmlToPdfConverter().GeneratePdf(strHtml);
Response.BinaryWrite(pdfBytes);
而不是
(new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(strHtml, null, Response.OutputStream);
对此的启示来自NReco's site。