#c# #asp.net-mvc #rotativa
#c# #asp.net-mvc #rotativa
Вопрос:
Что я сделал до сих пор
Я работаю над программой, в которой у меня есть своего рода квитанция, которую можно показать пользователю. Когда это происходит, у меня есть кнопка, на которую можно нажать, чтобы сгенерировать эту квитанцию в формате pdf. Я выполнил это на своем локальном ноутбуке, используя Rotativa ActionAsPdf и ViewsAsPDF. Но именно здесь мой успех приходит к сбою.
Проблема
Я перенес все это на сервер, и ActionAsPdf абсолютно отказывается работать, я, должно быть, прочитал как минимум 23 сообщения, в которых говорится о dll и средах выполнения, и поместил их в папку Rotativa, но у меня ничего из этого не сработало. Я попытался использовать ViewAsPdf, где я снова добился некоторого успеха, но это снова было недолгим, когда я переместил код на сервер. Рендеринг pdf-файла, хотя на моем ноутбуке он занимает около 1/2, на сервере очень медленный. Я видел сообщение на форуме, в котором говорилось о внешнем css и добавлении «—print-media-type», но ничто из этого не решило мою проблему. Я также должен отметить, что я могу запустить wkhtmltopdf вручную.
Пожалуйста, найдите код ниже
[AllowAnonymous]
public ActionResult viewInvoice(Guid cartID)
{
var invoice = from t in db.Transactions
join p in db.Payment_Types
on t.paymentTypeId_FK equals p.paymentTypeId
join c in db.Carts
on t.cartId_FK equals c.cartId
join u in db.Users
on c.accountId_FK equals u.Id
join d in db.Departments
on p.deparmentId_FK equals d.departmentId
join m in db.Ministries
on d.ministryId equals m.ministryId
where t.cartId_FK == cartID
select new
{
t.amount,
c.totalAmount,
p.name,
c.invoiceNum,
c.datePaid,
c.taxAmt,
c.finalAmt,
c.cartId,
u.FirstName,
u.LastName,
d.departmentName,
m.ministryName
};
ViewBag.minName = invoice.Select(e => e.ministryName).FirstOrDefault();
ViewBag.departmentName = invoice.Select(e => e.departmentName).FirstOrDefault();
ViewBag.datePaid = invoice.Select(e => e.datePaid).FirstOrDefault();
ViewBag.invoiceNum = invoice.Select(e => e.invoiceNum).FirstOrDefault();
ViewBag.fullName = invoice.Select(e => e.FirstName " " e.LastName).FirstOrDefault();
ViewBag.amount = invoice.Select(e => e.totalAmount).FirstOrDefault();
ViewBag.taxAmt = invoice.Select(e => e.taxAmt).FirstOrDefault();
ViewBag.finalAmt = invoice.Select(e => e.finalAmt).FirstOrDefault();
ViewBag.cartId = invoice.Select(e => e.cartId).FirstOrDefault();
OrderHistory orderHistory = new OrderHistory();
orderHistory.no = db.vw_OrderHistory.Where(d => d.cartId_FK == cartID).Select(d => new noVm
{
amount = d.amount,
name = d.name,
}).ToList();
var z = new ViewAsPdf("InvoicePreview", orderHistory);
z.Cookies = Request.Cookies.AllKeys.ToDictionary(k => k, k => Request.Cookies[k].Value);
z.FormsAuthenticationCookieName = System.Web.Security.FormsAuthentication.FormsCookieName;
//z.CustomSwitches = "--load-error-handling ignore";
//z.CustomSwitches = "--print-media-type";
//z.FormsAuthenticationCookieName = FormsAuthentication.FormsCookieName;
return z;
}
Вид
@{
Layout = null;
}
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Favicon icon -->
<link rel="icon" href="~/Content/assets/images/favicon.ico" type="image/x-icon">
<!-- prism css -->
<!-- vendor css -->
<link rel="stylesheet" href="~/Content/assets/css/style.css">
<title> </title>
@*<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://code. jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>*@
<link rel="stylesheet" href="~/Content/jquery-ui.css">
<script src="~/Scripts/jquery-ui.min.js"></script>
<style>
body {
background-color: white !important;
}
</style>
</head>
<div class="main-body ">
<div class="page-wrapper">
<!-- [ Main Content ] start -->
<div class="row">
<!-- [ Invoice ] start -->
<div class="container" id="printTable">
<div>
<div class="card">
<div class="row invoice-contact">
<div class="col-md-8">
<div class="invoice-box row">
<div class="col-sm-12">
<table class="table table-responsive invoice-table table-borderless">
<tbody>
<tr>
@*<td><img src="~/Content/assets/images/logo-dark.png" class="m-b-10" alt=""></td>*@
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td><a class="text-secondary" href="sdm" target="_top"> </a></td>
</tr>
<tr>
<td> </td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-md-4"></div>
</div>
<div>
<table width="100%" style="margin:auto;vertical-align:top" align="center">
<tr>
<td valign="top" width="30%">
<h6>Client Information :</h6>
<h6 class="m-0">@ViewBag.fullName</h6>
@*<p class="m-0 m-t-10">1065 Mandan Road, Columbia MO, Missouri. (123)-65202</p>
<p class="m-0">(1234) - 567891</p>
<p><a class="text-secondary" href="mailto:demo@gmail.com" target="_top">demo@gmail.com</a></p>*@
</td>
<td valign="top" width="30%">
<h6>Order Information </h6>
<table class="table table-responsive invoice-table invoice-order table-borderless">
<tbody>
<tr>
<td><b> Date :</b> @ViewBag.datePaid</td>
</tr>
<tr>
<td><b>Status :</b> <span class="label label-success">Paid</span></td>
</tr>
<tr>
@*
<th>Id :</th>
<td>
#146859
</td>*@
</tr>
</tbody>
</table>
</td>
<td valign="top" width="30%">
<h6 class="m-b-20">Invoice Number: <span>@ViewBag.invoiceNum</span></h6>
<h6 class="text-uppercase text-primary">
Total Paid :
<span>$@ViewBag.finalAmt</span>
</h6>
</td>
</tr>
</table>
</div>
<div class="card-block">
<div class="row">
<div class="col-sm-12">
<div class="table-responsive">
<table class="table invoice-detail-table">
<thead>
<tr class="thead-default">
<th style="text-align:left">Description</th>
<th></th>
<th></th>
<th style="text-align:right;padding-right:100px">Total</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.no)
{
<tr>
<td>
<h6>@item.name</h6>
<p>@ViewBag.minName - @ViewBag.departmentName</p>
</td>
<td></td>
<td></td>
<td style="text-align:right;padding-right:100px">@item.amount</td>
</tr>
}
@*<tr>
<td>
<h6>Logo Design</h6>
<p>lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt </p>
</td>
<td>7</td>
<td>$100.00</td>
<td>$700.00</td>
</tr>
<tr>
<td>
<h6>Logo Design</h6>
<p>lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt </p>
</td>
<td>5</td>
<td>$150.00</td>
<td>$750.00</td>
</tr>*@
</tbody>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<table class="table table-responsive invoice-table invoice-total">
<tbody style="padding-right:90px">
<tr>
<th>Sub Total :</th>
<td>$@ViewBag.amount</td>
</tr>
<tr>
<th>Service Charge(3%) :</th>
<td>$@ViewBag.taxAmt</td>
</tr>
@*<tr>
<th>Discount (5%) :</th>
<td>$45.00</td>
</tr>*@
<tr class="text-info">
<td>
<hr />
<h5 class="text-primary m-r-10">Total :</h5>
</td>
<td>
<hr />
<h5 class="text-primary">$@ViewBag.finalAmt</h5>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<h6>Terms And Condition :</h6>
<p>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- [ Invoice ] end -->
</div>
<!-- [ Main Content ] end -->
</div>
</div>
У меня много базы данных, но я не думаю, что это проблема скорости. Однако сначала я показываю счет, затем у меня есть кнопка, которая вызывает ViewAsPdf, которая выполняет одни и те же вычисления снова и снова, и я не думаю, что это лучшее. Также я ищу альтернативы Rotativia, любая помощь приветствуется.
Комментарии:
1. «ActionAsPdf абсолютно отказывается работать», похоже, вообще не является проблемой производительности… Вы уверены, что хотели это написать? Также вы можете захотеть удалить запрос на библиотеки из сообщения (если это не ваш актуальный вопрос… что, как вы знаете, не по теме)
2. Я имею в виду, что ActionAsPDF не работает при размещении на сервере, я также перепробовал все dll, и ничего не помогло
3. Не могли бы вы предоставить список связанных с Rotativa файлов, которые вы загружаете на сервер внутри папки вашего приложения для IIS? Пожалуйста, убедитесь, что у вас есть хотя бы эти файлы (угадайте «appfolder» в качестве имени физического пути к вашему приложению): — appfolderbinRotativa.dll — appfolderApp_Browsersqt.browser — appfolderRotativawkhtmltoimage.exe — appfolderRotativawkhtmltopdf.exe Получаете ли вы какие-либо ошибки в журналах ваших приложений при использовании Rotativa на сервере?