wkhtmltopdf.exe выполняется 100 или более раз в цикле в веб-форме ASP.Net - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь распечатать HTML-страницу в формате PDF, я использую wkhtmltopdf.exe для преобразования, аналогичный код работает на тестовой странице при нажатии кнопки, но даже когда я использую следующий код на странице Print.aspx, он попадает в цикл и запускает 100 или более процессов wkhtmltopdf.exe на моей локальной машине win 7.

Я перехожу к странице print.aspx со страницы main.aspx по событию linkbutton, которое затем генерирует страницу и должно конвертировать страницу в PDF, а не зацикливаться. Я не уверен, почему он так себя ведет

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using CMS.SqlHelper;
using CMS.DataAccessLayer;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;
using System.Diagnostics;
using System.IO;

public partial class PrintArticle : System.Web.UI.Page
{
   // string print;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            try
            {
                if (Request["download"] != "yes")
                {
                    int articleID = int.Parse(Request["ArticleID"]);
                    string strSql = "Select ArticleID, ArticleTitle,  ArticleBodyDesc, ArticlePublishDate FROM art_Articles";
                    strSql += " WHERE ArticleID = " + articleID;
                    DataSet ds = DataProvider.Connect_Select(strSql);
                    DateTime dt;
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        lblArticleTitle.Text = ds.Tables[0].Rows[0]["ArticleTitle"].ToString();
                        //lblPubDate.Text = ds.Tables[0].Rows[0]["ArticlePublishDate"].ToString();
                        lblPubDate.Text = Convert.ToDateTime(ds.Tables[0].Rows[0]["ArticlePublishDate"].ToString()).ToLongDateString();
                        lblArticleDesc.Text = ds.Tables[0].Rows[0]["ArticleBodyDesc"].ToString();
                        //Response.Write ("<script type='text/javascript'>function printpage()  {  window.print();  }</script>");
                        //Page.ClientScript.RegisterStartupScript(GetType(), "MyKey", "printpage()");
                        Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", "javascript:printpage();", true);

                    }
                    else
                    {
                        lblArticleDesc.Text = "Article not found";
                    }
                }
                else
                {

                    int articleID = int.Parse(Request["ArticleID"]);
                    Response.Clear();
                    string strSql = "Select ArticleID, ArticleTitle,  ArticleBodyDesc, ArticlePublishDate FROM art_Articles";
                    strSql += " WHERE ArticleID = " + articleID;
                    DataSet ds = DataProvider.Connect_Select(strSql);
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        lblArticleTitle.Text = ds.Tables[0].Rows[0]["ArticleTitle"].ToString();

                        lblPubDate.Text = Convert.ToDateTime( ds.Tables[0].Rows[0]["ArticlePublishDate"].ToString()).ToLongDateString();
                        lblArticleDesc.Text = ds.Tables[0].Rows[0]["ArticleBodyDesc"].ToString();



                        PrintToPDF();
                    }
                    else
                    {
                        lblArticleDesc.Text = "Article not found";
                    }


                }

            }
            catch (Exception ex)
            {
                Response.Write("Page can't be displayed. Please try later.");
            }
        }
    }

    protected void PrintToPDF()
    {
        try
        {
            string args = string.Format("\"{0}\" - ", Request.Url.AbsoluteUri);
            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)
        {
            string xx = ex.Message.ToString();
            Response.Write("<br>" + xx);
        }
    }
}

1 Ответ

0 голосов
/ 07 февраля 2012

ваша проблема в очереди.

string args = string.Format("\"{0}\" - ", Request.Url.AbsoluteUri);

когда вы вызываете wkhtmltopdf.exe с таким же URL-адресом и параметрами страницы, wkhtmltopdf.exe снова вызывает вашу страницу, поэтому ваша страница вызывает еще раз wkhtmltopdf.exe :)

, чтобы решить эту проблему, вы можете вызвать wkhtmltopdf.exe с дополнительной строкой запроса при просмотре этой строки запроса при загрузке, а не вызывать wkhtmltopdf.exe.

...