gpt4 book ai didi

html - 调用 wkhtmltopdf 从 HTML 生成 PDF

转载 作者:技术小花猫 更新时间:2023-10-29 11:34:21 24 4
gpt4 key购买 nike

我正在尝试从 HTML 文件创建 PDF 文件。环顾四周后,我发现:wkhtmltopdf做到完美。我需要从 ASP.NET 服务器调用这个 .exe。我尝试过:

    Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = HttpContext.Current.Server.MapPath("wkhtmltopdf.exe");
p.StartInfo.Arguments = "TestPDF.htm TestPDF.pdf";
p.Start();
p.WaitForExit();

在服务器上创建任何文件都没有成功。谁能给我一个正确方向的指示?我将 wkhtmltopdf.exe 文件放在站点的顶级目录中。还有其他地方应该举行吗?


编辑:如果有人有更好的解决方案从 html 动态创建 pdf 文件,请告诉我。

最佳答案

更新:
我在下面的回答是在磁盘上创建 pdf 文件。然后我将该文件作为下载流式传输到用户浏览器。考虑使用类似于下面 Hath 的回答的方法来让 wkhtml2pdf 输出到流,然后将其直接发送给用户——这将绕过许多文件权限等问题。

我原来的回答:
确保您已指定 PDF 的输出路径,该路径可由服务器上运行的 IIS 的 ASP.NET 进程写入(我认为通常是 NETWORK_SERVICE)。

我的看起来像这样(并且有效):

/// <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);
}

关于html - 调用 wkhtmltopdf 从 HTML 生成 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1331926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com