Mise à jour:
Ma réponse ci-dessous, crée le fichier pdf sur le disque. J'ai ensuite diffusé ce fichier dans le navigateur d'utilisateurs en téléchargement. Envisagez d'utiliser quelque chose comme A la réponse ci-dessous pour obtenir wkhtml2pdf pour la sortie d'un flux à la place, puis les envoyer directement à l'utilisateur qui permettra de contourner beaucoup de problèmes avec les autorisations de fichier, etc.
Ma réponse originale à cette question:
Assurez-vous que vous avez spécifié un chemin de sortie pour le format PDF, qui est accessible en écriture par l'ASP.NET processus de IIS qui s'exécute sur votre serveur (généralement NETWORK_SERVICE je pense).
Le mien ressemble à ça (et ça marche):
/// <summary>
/// Convert Html page at a given URL to a PDF file using open-source tool wkhtml2pdf
/// </summary>
/// <param name="Url"></param>
/// <param name="outputFilename"></param>
/// <returns></returns>
public static bool HtmlToPdf(string Url, string outputFilename)
{
// assemble destination PDF file name
string filename = ConfigurationManager.AppSettings["ExportFilePath"] + "\\" + outputFilename + ".pdf";
// get proj no for header
Project project = new Project(int.Parse(outputFilename));
var p = new System.Diagnostics.Process();
p.StartInfo.FileName = ConfigurationManager.AppSettings["HtmlToPdfExePath"];
string switches = "--print-media-type ";
switches += "--margin-top 4mm --margin-bottom 4mm --margin-right 0mm --margin-left 0mm ";
switches += "--page-size A4 ";
switches += "--no-background ";
switches += "--redirect-delay 100";
p.StartInfo.Arguments = switches + " " + Url + " " + filename;
p.StartInfo.UseShellExecute = false; // needs to be false in order to redirect output
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true; // redirect all 3, as it should be all 3 or none
p.StartInfo.WorkingDirectory = StripFilenameFromFullPath(p.StartInfo.FileName);
p.Start();
// read the output here...
string output = p.StandardOutput.ReadToEnd();
// ...then 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 or 2, it worked (not sure about other values, I want a better way to confirm this)
return (returnCode == 0 || returnCode == 2);
}