Comment utiliser wkhtmltopdf.exe in ASP.net [duplicata]
cette question a déjà une réponse ici:
après 10 heures et essayer 4 Autres Outils HTML à PDF je suis sur le point d'exploser.
wkhtmltopdf sonne comme un excellente solution...le problème est que je ne peux pas exécuter un processus avec suffisamment d'autorisations de asp.net ...
Process.Start("wkhtmltopdf.exe","http://www.google.com google.pdf");
commence mais ne fait rien.
Est-il un moyen facile de:
- a) allow asp.net pour lancer des processus (qui peuvent réellement faire quelque chose) ou
- B) compiler/wrap/whatever wkhtmltopdf.exe dans quelque chose que je peux utiliser à partir de C # comme ceci: WkHtmlToPdf.Save("http://www.google.com", "google.pdf");
5 réponses
vous pouvez également utiliser Pechkin
.net Wrapper for WkHtmlToPdf DLL, bibliothèque qui utilise le moteur Webkit pour convertir les pages HTML en PDF.
Nuget packages:
je viens de commencer un nouveau projet pour fournir un C# P/Invoke wrapper autour de wkhtmltopdf.
vous pouvez vérifier mon code à: https://github.com/pruiz/WkHtmlToXSharp
salutations.
merci à Paul , j'ai trouvé le bon wrapper écrit par Codaxy, qui peut également être facilement téléchargé via NuGet .
après quelques essais, j'ai géré cette action MVC, qui crée et renvoie instantanément le fichier PDF en flux:
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));
}
ici, les classes Pdf* ont été implémentées dans le wrapper, avec un code propre et agréable, malheureusement manquant documentation.
dans le convertisseur, L'URL sera convertie en PDF, stockée dans un fichier temporaire, copiée dans le flux que nous avons donné comme paramètre, et ensuite le fichier PDF sera supprimé.
enfin, nous devons pousser le flux comme FileStreamResult.
n'oubliez pas de définir la Position du flux de sortie à zéro, sinon vous verrez les fichiers PDF téléchargés en tant que zéro bytes de taille.
Voici le code que j'ai utilisé. N'hésitez pas à le modifier pour se débarrasser de certaines des odeurs et d'autres terribleness...Je sais que ce n'est pas si grande.
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 /q/how-do-i-copy-the-contents-of-one-stream-to-another-37840/"";
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;
}
}
Je ne peux pas commenter donc je poste ceci comme une 'réponse' aux commentaires de la réponse ci-dessus comment utiliser wkhtmltopdf.exe in ASP.net
si --redirect-delay
ne fonctionne pas, essayez --javascript-delay
Voir ici pour toutes les options: https://github.com/antialize/wkhtmltopdf/blob/master/README_WKHTMLTOPDF
ou faire wkhtmltopdf -H
pour l'aide prolongée (afaik même sortie que le lien ci-dessus).