0

我在学习 ASP.net MVC 的同时制作发票网站,到目前为止一切都很好。我遇到的问题是,当我在我的应用程序中更新发票,然后尝试将其下载为 pdf 格式时,我得到了页面的初始内容并且没有任何更新。我想在有人下载它之前显示 pdf,它工作得很好。所以我不知道我的问题是否与流没有在页面上获得更改有关。

如果可能的话,我还希望在 URL 中返回一个 Guid,并且不知道如何根据当前的设置来做到这一点。

任何帮助都会很棒!

注意:我发布了网站但 ABCpdf 出错(可能是因为它是试用版),但是,我可以在本地生成 PDF

看法

@Html.ActionLink("Download PDF", "DownloadPDF", null, new { @class = "btn btn-action", @target = "_blank" })

控制器

    public ActionResult DownloadPDF()
    {
        Doc pdf = new Doc();
        MemoryStream stream = new MemoryStream();

        pdf.Rect.Inset(40, 40);
        pdf.HtmlOptions.Engine = EngineType.Gecko;
        pdf.HtmlOptions.UseScript = true;

        pdf.AddImageUrl("http://local.completeinvoice.com/");
        byte[] data = pdf.GetData();

        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "inline; filename=invoice-001.pdf");
        Response.AddHeader("content-length", data.Length.ToString());
        Response.BinaryWrite(data);
        Response.Flush();
        Response.End();

        pdf.Flatten();
        pdf.Save(stream);
        stream.Close();
        pdf.Clear();

        return View("Index");
    }
4

2 回答 2

0

您在此示例中提供的 URL 每次都相同,但您希望输出每次都更改。

因此,这里的关键是确定如何存储状态。假设这是某种类型的发票,发票编号从何而来?

执行此操作的正常方法是在 URL 中对发票 ID 进行编码。然后在您的页面中获取 ID 并使用该唯一标识符生成页面。

这样,您可以将链接通过电子邮件发送给您的朋友,她会看到您看到的同一张发票。上面示例中使用的 URL 是通用的。如果你把它邮寄给你知道她会看到什么的朋友?

ABCpdf 是一样的。它确实需要一个可以使用的唯一 URL。是的,它可以关闭会话状态和 cookie,但如果你想这样做,它会变得非常复杂和令人厌烦。只需确保每个 URL 都是唯一的,就简单多了。

因此,调整您传递给 AddImageUrl 的 URL,使其包含将要返回的唯一页面所需的状态。然后 ABCpdf 将看到与您看到的相同的内容。

我会注意到,PDF 也可以缓存在浏览器中。但是,这是您在此处描述的问题的不常见原因。我认为在这种情况下,您可以放心地忽略它。

于 2013-06-18T10:02:12.980 回答
0

在阅读http://www.websupergoo.com/helppdf9net/source/3-concepts/g-htmlrender.htm我发现:

您可以呈现任何可以为其提供 URL 的页面。当您呈现页面时,该页面必须由 ABCpdf 重新加载。

基本上,您需要一个唯一的 URL,即实际页面,并显示数据,以便 ABCpdf 在将页面呈现为 PDF 之前能够读取该页面。

另一种选择是将页面保存为 .html,然后从服务器读取页面,然后删除生成的 .html 页面。

于 2013-04-27T16:06:20.590 回答