HTML到PDF转换 - 几乎可以工作,但是

时间:2014-12-12 17:13:57

标签: c# pdf response file-conversion

我花了很长一段时间来搜索易于使用的库,它以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流。我认为这只是在文件中捕获该流并将其传递给客户端的问题。

2 个答案:

答案 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