使用wkhtmltopdf.exe将HTML文件转换为PDF的路径问题

时间:2012-07-05 10:19:56

标签: asp.net c#-4.0 pdf-generation webforms wkhtmltopdf

我正在使用wkhtmltopdf将HTML文件转换为链接按钮上的PDF文档 http://code.google.com/p/wkhtmltopdf/

当用户单击链接按钮时,它会运行以下代码,如下所示,将传递文件路径中的代码作为参数ProcessStartInfo。这些代码仅适用于以下方案

考虑到该网站托管在域http://www.xyz.net/

  1. 当我提到路径为http://demo.XYZ.net/时工作正常
  2. 当我提到路径http://www.XYZ.net/它不起作用时
  3. 如果路径为http://localhost:51005/XYZ/http://web:8080/
  4. ,如果是本地主机,它可以正常工作

    为了使这个工作正常,我们需要给予网站完全信任等级&我不知道为什么代码不运行我给它相同的域路径如果我创建put PrintArticle.aspx如果我创建一个子域然后它将正常工作。我不确定这是安全问题还是什么

    以下代码

    protected void lnkbtnDownload_Click(object sender, EventArgs e)
    {
        //ConvertURLToPDF();
        try
        {
            string url = "PrintArticle.aspx?articleID=" + Request["articleID"] + "&download=yes&Language=" + Request["Language"];
    
            //string args = string.Format("\"{0}\" - ", "http://demo.XYZ.net/" + url); //Works
            //string args = string.Format("\"{0}\" - ", "http://www.xyz.net/" + url); Doesnt work
            //string args = string.Format("\"{0}\" - ", url);
    
            string args = string.Format("\"{0}\" - ", "http://localhost:51005/XYZ/" + url); //Works
    
            var startInfo = new ProcessStartInfo(Server.MapPath("bin\\wkhtmltopdf.exe"), args)
            {
                UseShellExecute = false,
                CreateNoWindow = true,
                RedirectStandardOutput = true
            };
            var proc = new Process { StartInfo = startInfo };
            proc.Start();
    
            string output = proc.StandardOutput.ReadToEnd();
            byte[] buffer = proc.StandardOutput.CurrentEncoding.GetBytes(output);
            proc.WaitForExit();
            proc.Close();
            Response.ContentType = "application/pdf";
            Response.AddHeader("Content-Disposition", "attachment;filename=download.pdf");
            Response.BinaryWrite(buffer);
            Response.End();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    

    案例文件位于同一域中的错误消息

      '/'应用程序中的服务器错误。无法找到资源。

         

    描述:HTTP 404.您正在寻找的资源(或其中一个   依赖项)可能已被删除,其名称已更改,或者是   暂时不可用。请查看以下网址并确认   拼写正确。   请求的网址:/PrintArticle.aspx

         

    版本信息:Microsoft .NET Framework版本:4.0.30319;   ASP.NET版本:4.0.30319.272

2 个答案:

答案 0 :(得分:0)

我使用以下语句解决了这个问题

var url = Request.Url.GetLeftPart(UriPartial.Authority) + "/PrintArticle.aspx?articleID=" + Request["articleID"] + "&download=yes&Language=" + Request["Language"];

现在它工作正常我不确定当我指定文件路径时它不起作用。

答案 1 :(得分:0)

输出变量包含空字符串 我的代码如下:      尝试         {             string url = Request.Url.GetLeftPart(UriPartial.Authority)+“/ PrintQuickPrescription.aspx?DoctorId =”+ DoctorID +“& DispnID =”+ DispnID +“& ApptID =”+ ApptID +“& PatientID =” + PatientID;             System.Diagnostics.Process process = new System.Diagnostics.Process();

        string args = string.Format("\"{0}\" - ", "http://localhost:50013/DPMNewWeb/"+url);
        //string  args="http://localhost:50013/DPMNewWeb/PrintQuickPrescription.aspx";

        var startInfo = new ProcessStartInfo(Server.MapPath("~\\Bin\\wkhtmltopdf.exe"), args)
        {
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardOutput = true
        };
        var proc = new Process { StartInfo = startInfo };
        proc.Start();

        string output = proc.StandardOutput.ReadToEnd();

        byte[] buffer = proc.StandardOutput.CurrentEncoding.GetBytes(output);
        proc.WaitForExit();
        proc.Close();
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(buffer);
        Response.End();



        //byte[] fileContent = GeneratePDFFile();
        //GeneratePDFFile();
        //if (fileContent != null)
        //{
        //    Response.Clear();
        //    Response.ContentType = "application/pdf";
        //    Response.AddHeader("content-length", fileContent.Length.ToString());
        //    Response.BinaryWrite(fileContent);
        //    Response.End();
        //}
    }
    catch
    {
    }