获取当前HTML代码并创建PDF

时间:2012-06-21 08:20:09

标签: html asp.net-mvc-3 itext html-table

我正在使用MVC3和iTextSharp。

首先添加了一个Save和CreatePDF按钮。使用PDF Button我调用一个Method,它返回显示的WebPage的实际HTML代码。

到目前为止一切顺利,现在我开始使用iTextSharp生成PDF。我想知道,它在第一次尝试时起作用,但在我添加MVC网格表到iTextSharp仍然创建PDF,但其中包含错误消息。

不支持ERRORURI-Formate。

有什么建议可以让它发挥作用吗?

Grid就像那样构建

        @Html.DataGridFor(m => m.ConfigurationArticleList, ItemContainerType.tr,
        _S.H<ConfigurationArticle>(
        @<text>         
             <td class="ToDo">
                @item.ValidationMessageFor(m => m.ArtNr, "*")
                @item.TextBoxFor(m => m.ArtNr)
             </td>
             <td class="ToDo">
                @item.ValidationMessageFor(m => m.Bezeichnung, "*")
                @item.TextBoxFor(m => m.Bezeichnung)
             </td>
             <td class="ToDo">
                @item.ValidationMessageFor(m => m.Anzahl, "*")
                @item.TextBoxFor(m => m.Anzahl)
             </td>
        </text>
        ),
         _S.H<ConfigurationArticle>(
        @<text>         
            <td class="ToDo">
                @item.ValidationMessageFor(m => m.ArtNr, "*")
                @item.DisplayField(m => m.ArtNr)
            </td>
            <td class="editor-field">
                @item.ValidationMessageFor(m => m.Bezeichnung, "*")
                @item.DisplayField(m => m.Bezeichnung)
            </td>
            <td class="ToDo">
                @item.ValidationMessageFor(m => m.Anzahl, "*")
                @item.DisplayField(m => m.Anzahl)
            </td>
        </text>

此外,PDF的FilePath仍然是硬编码的,任何想法都可以获得SaveFile-Dialog或其他东西吗?

2 个答案:

答案 0 :(得分:2)

ABCpdf - 是一个更好的工具。我们确实喜欢它在我们的项目中,它没有问题。 ABCpdf

答案 1 :(得分:0)

我建议您使用wkhtmltopdf代替ITextSharp。它是一个使用Web工具包渲染引擎的开源可执行文件。它产生非常好的pdf输出。如果您想在mvc网站上使用它,那么您可以使用以下代码运行它:

var procStartInfo = new ProcessStartInfo("wkhtmltopdf.exe", "input.html output.pdf");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();

它将在服务器的文件系统上创建输出,但您可以轻松读取并写入http响应。

Response.ContentType = "Application/pdf";
Response.AddHeader("Content-Type", "application/pdf");
Response.AddHeader("Content-Disposition", "attachment; filename=output.pdf");
string filePath = "output.pdf";
Response.WriteFile(filePath);
Response.End();