Как использовать whtmltopdf.exe в asp.net [дубликат
-
04-10-2019 - |
Вопрос
Этот вопрос уже имеет ответ здесь:
- Вызов WKHTMLTOPDF для генерации PDF из HTML 11 ответов
Через 10 часов и попробовать 4 других HTML к инструментам PDF, я готов взорваться.
wkhtmltopdf. Похоже, как отличное решение ... Проблема в том, что я не могу выполнить процесс с достаточным количеством разрешений от ASP.NET ...
Process.Start("wkhtmltopdf.exe","http://www.google.com google.pdf");
Начинается, но ничего не делает.
Есть ли удобный способ:
-a) разрешить ASP.NET начать процессы (которые могут сделать что-то) или
-b) Совыкомите / обернуть / все равно WHTMLTOPDF.exe в что-то, что я могу использовать из C #, как это: WkHtmlToPdf.Save("http://www.google.com", "google.pdf");
Решение
Вы также можете использовать Печенья
.Net Wrapper для WHTMLTOPDF DLL, библиотека, которая использует Ebekit Engine для преобразования HTML-страниц в PDF.
Пакеты Nuget:
Другие советы
Я только начал новый проект, чтобы обеспечить обертку C # P / Invoke вокруг WHTMLTOPDF.
Вы можете оформить заказ мой код по адресу: https://github.com/pruiz/wkhtmltoxsharp.
Приветствует.
Благодаря Павел, Я нашел хорошее оболочка Написано Codaxy, которая также может быть легко загружена через Ног.
После нескольких испытаний мне удалось этому действию MVC, которое мгновенно создает и возвращает файл PDF в виде потока:
public ActionResult Pdf(string url, string filename)
{
MemoryStream memory = new MemoryStream();
PdfDocument document = new PdfDocument() { Url = url };
PdfOutput output = new PdfOutput() { OutputStream = memory };
PdfConvert.ConvertHtmlToPdf(document, output);
memory.Position = 0;
return File(memory, "application/pdf", Server.UrlEncode(filename));
}
Здесь классы PDF * были реализованы в обертке, с приятным, чистым кодом, к сожалению, не хватает документации.
В пределах преобразователя URL будет преобразован в PDF, сохраненный во временном файле, скопировал в поток, который мы дали в качестве параметра, и после этого файл PDF удален.
Наконец, мы должны протолкнуть поток как Filestreamresult.
Не забудьте установить положение выходного потока на ноль, в противном случае вы увидите файлы PDF, загруженные в виде нулевых байтов размера.
Вот настоящий код, который я использовал. Пожалуйста, не стесняйтесь редактировать это, чтобы избавиться от некоторых запахов и других ужасных ... Я знаю, что это не так здорово.
using System;
using System.Diagnostics;
using System.IO;
using System.Web;
using System.Web.UI;
public partial class utilities_getPDF : Page
{
protected void Page_Load(Object sender, EventArgs e)
{
string fileName = WKHtmlToPdf(myURL);
if (!string.IsNullOrEmpty(fileName))
{
string file = Server.MapPath("~\\utilities\\GeneratedPDFs\\" + fileName);
if (File.Exists(file))
{
var openFile = File.OpenRead(file);
// copy the stream (thanks to http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances-c)
byte[] buffer = new byte[32768];
while (true)
{
int read = openFile.Read(buffer, 0, buffer.Length);
if (read <= 0)
{
break;
}
Response.OutputStream.Write(buffer, 0, read);
}
openFile.Close();
openFile.Dispose();
File.Delete(file);
}
}
}
public string WKHtmlToPdf(string Url)
{
var p = new Process();
string switches = "";
switches += "--print-media-type ";
switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm ";
switches += "--page-size Letter ";
// waits for a javascript redirect it there is one
switches += "--redirect-delay 100";
// Utils.GenerateGloballyUniuqueFileName takes the extension from
// basically returns a filename and prepends a GUID to it (and checks for some other stuff too)
string fileName = Utils.GenerateGloballyUniqueFileName("pdf.pdf");
var startInfo = new ProcessStartInfo
{
FileName = Server.MapPath("~\\utilities\\PDF\\wkhtmltopdf.exe"),
Arguments = switches + " " + Url + " \"" +
"../GeneratedPDFs/" + fileName
+ "\"",
UseShellExecute = false, // needs to be false in order to redirect output
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true, // redirect all 3, as it should be all 3 or none
WorkingDirectory = Server.MapPath("~\\utilities\\PDF")
};
p.StartInfo = startInfo;
p.Start();
// doesn't work correctly...
// read the output here...
// string output = p.StandardOutput.ReadToEnd();
// wait n milliseconds for exit (as after exit, it can't read the output)
p.WaitForExit(60000);
// read the exit code, close process
int returnCode = p.ExitCode;
p.Close();
// if 0, it worked
return (returnCode == 0) ? fileName : null;
}
}
Я не могу комментировать, поэтому я публикую это как «ответ» на комментарии выше ответа Как использовать whtmltopdf.exe в asp.net
Если --redirect-delay
не работает, попробуй --javascript-delay
Смотрите здесь для всех вариантов: https://github.com/antialize/wkhtmltopdf/blob/master/ruadme_wkhtmltopdf.
Или сделать wkhtmltopdf -H
Для расширенной помощи (афаик же вывод как выше ссылки).