Я пытаюсь создать PDF, он отлично работает в разработке, но не на моем рабочем сервере. Я предполагаю, что это права. Ошибка, которую я получаю:Значение не может быть пустым с wkhtmltopdf в MVC 4
Значение не может быть пустым. Имя параметра: fileContents
Я предполагаю, что говорит об этом fileContents пары:
System.Web.Mvc.Controller.File(Byte[] fileContents, String contentType, String fileDownloadName) +28
Код для метода:
public ActionResult Pdf(Guid id, string filename)
{
string url = Url.Action("RenderReport", "TitleSearchReport", new { id = id }, "http");
var file = WKHtmlToPdf(url);
return File(file, "application/pdf", Server.UrlEncode(filename));
}
код, который генерирует файл является:
public byte[] WKHtmlToPdf(string url)
{
var fileName = " - ";
//var wkhtmlDir = "C:\\Program Files\\wkhtmltopdf\\";
//var wkhtml = "C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe";
var wkhtmlDir = HttpContext.Server.MapPath(@"~/wkhtmltopdf");
var wkhtml = HttpContext.Server.MapPath(@"~/wkhtmltopdf/wkhtmltopdf.exe");
var p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = wkhtml;
p.StartInfo.WorkingDirectory = wkhtmlDir;
string switches = "";
switches += "--print-media-type ";
switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm ";
switches += "--page-size Letter ";
p.StartInfo.Arguments = switches + " " + url + " " + fileName;
p.Start();
//read output
byte[] buffer = new byte[32768];
byte[] file;
using (var ms = new MemoryStream())
{
while (true)
{
int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);
if (read <= 0)
{
break;
}
ms.Write(buffer, 0, read);
}
file = ms.ToArray();
}
// wait or exit
p.WaitForExit(60000);
// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
return returnCode == 0 ? file : null;
}
Снова он работает p когда я отлаживаю, но не при развертывании. Что я могу сделать, чтобы сделать эту работу по производству?
Спасибо за ваш совет.
Edit:
Изменено мой метод, но теперь все это я получаю пустую страницу ...
public void Pdf(Guid id, string filename)
{
string url = Url.Action("RenderReport", "TitleSearchReport", new { id = id }, "http");
var file = WKHtmlToPdf(url);
if (file != null)
{
Response.ContentType = "Application/pdf";
Response.BinaryWrite(file);
Response.End();
}
}
Вы проверили содержимое 'fileContents' после' var file = WKHtmlToPdf (url); '? –
Я не уверен, как проверить это на производстве. Я изменил свой код (как показано выше), но теперь все, что я получаю, это пустая страница (без ошибок, просто пустая белая страница)! – user1477388
Возможно, используя журнал? –