14

この Rotativa 1.6.4 コード例を使用して、.NET MVC 5 アプリのページから PDF を生成していました。

public ActionResult PrintIndex()
{
    var a = new ActionAsPdf("Index", new { name = "Giorgio" }) { FileName = "Test.pdf" };
    a.Cookies = Request.Cookies.AllKeys.ToDictionary(k => k, k => Request.Cookies[k].Value);
    a.FormsAuthenticationCookieName = System.Web.Security.FormsAuthentication.FormsCookieName;
    a.CustomSwitches = "--load-error-handling ignore";
    return a;
}

public ActionResult Index(string name)
{
    ViewBag.Message = string.Format("Hello {0} to ASP.NET MVC!", name);

    return View();
}

インデックス ページを印刷していたのではなく、ログイン ページを印刷していました。

認証の問題を修正したら、.pdf を使用しても PDF の生成が非常に遅くなりましたCustomSwitches。(数分)

上記のコードは実際に機能する可能性がありCookiesます。プロパティを使用して認証の問題を回避しましたが、私には遅すぎました。

安全なページをすばやく印刷するにはどうすればよいですか?

4

5 に答える 5

20

私はこれにおそらく 8 時間苦労しました。一部は自己参照として独自のソリューションを投稿していますが、スタック オーバーフローに適切な回答がなかったためにも投稿しています。

Rotativa ソースをダウンロードする

github でオープンソースとして公開されています。人々が使用するUrlAsPdfと言った他の多くのソリューションとgithubの問題からの他のソリューションを試しましたが、どれもうまくいきませんでした。コードを読む以外のもう1つの利点...pdbファイルをビルドし、ソリューションに投げ入れてデバッグします。それは多くを明らかにするでしょう!私が見つけた1つのことは、Rotativaがwkhtmltopdf.exeカバーの下で使用することです. これは、web kit を使用して html をレンダリングします。また、コマンドは通常、URL に対して http 要求を行います。なんで?私たちはすでにサーバーにいます!これは、再認証が必要になることを意味し、ログイン ページが表示される場合がある理由を説明しています。Cookie をコピーすることは役に立ちますが、インラインで実行できるのに、自分自身に http 要求を行う必要はありません。

ブレークスルー

GetHtmlFromView別の http リクエストを作成せずにビュー html を生成する拡張メソッドがソースに見つかりました。はい!誰が電話しGetHtmlFromViewますか?もちろんViewAsPdfです。したがって、これにより、以下のコードを試すようになりました。これは機能し、高速です!

ASP.NET MVC コントローラー アクションに入れるコード:

// ViewAsPdf calls Rotativa.Extensions.ControllerContextExtensions.GetHtmlFromView
// Which generates the HTML inline instead of making a separate http request which CallDriver (wkhtmltopdf.exe) does.
var a = new ViewAsPdf();
a.ViewName = "Index";
a.Model = _service.GetMyViewModel(id);
var pdfBytes = a.BuildPdf(ControllerContext);

// Optionally save the PDF to server in a proper IIS location.
var fileName = string.Format("my_file_{0}.pdf", id);
var path = Server.MapPath("~/App_Data/" + fileName);
System.IO.File.WriteAllBytes(path, pdfBytes);

// return ActionResult
MemoryStream ms = new MemoryStream(pdfBytes);
return new FileStreamResult(ms, "application/pdf");
于 2016-01-28T16:46:14.673 に答える
5

このコードが最初の質問を解決することを願っています

public ActionResult DownloadViewPDF() {
 Dictionary<string, string> cookieCollection = new Dictionary<string, string>();
   foreach (var key in Request.Cookies.AllKeys)
     {
       cookieCollection.Add(key, Request.Cookies.Get(key).Value);
     }
     return new ActionAsPdf("Index")
       {
          FileName = "Name.pdf",
          Cookies = cookieCollection
        };
     }
于 2016-06-28T06:53:51.347 に答える
3

私は同じ問題を抱えていましたが、ジェスの答えはうまくいきませんでした。

ここからダウンロードしたプロジェクトの wkhtmltopdf.exe ファイルを更新すると、再び高速に動作しました。

于 2016-02-05T14:49:49.557 に答える