使用 iTextSharp 使用多个 ASP.NET 网络表单填充 PDF

Filling PDF with multiple ASP.NET webforms using iTextSharp

我目前正在构建一个小型网站,该网站从用 ASP.NET 和 C# 编写的 6 种不同的网络表单中获取数据。我需要将所有信息写入第 6 页末尾的 PDF。我目前已映射所有字段,但每次页面更改时,信息都会被擦除。我将信息设置为使用查询字符串传递值,但它似乎一直在丢失。有什么建议吗?

编辑 很抱歉没有第一次发布代码,这是我在这里发布的第一个问题。另外,我知道我的代码效率不高,我或多或少地试图掌握 iTextSharp 和 WebForms。谢谢

Page 1
            AcroFields af = ps.AcroFields;
        af.SetField("Name", name.Text);

        af.SetField("Email", email.Text);
        af.SetField("state", state.Text);
        af.SetField("city", city.Text);
        af.SetField("Address", address.Text);
        af.SetField("Phone", phone.Text);
        af.SetField("zip", zip.Text);
        Response.Redirect("Default.aspx?name=" + this.name.Text + "&Email=" + this.email.Text 
        + "&state=" + this.state.Text + "&city=" + this.city.Text + "&Address=" + this.address.Text + 
        "&Phone=" + this.phone.Text + "&zip=" + this.zip.Text);
        Response.Redirect("Page2.aspx");

Page 2
AcroFields af = ps.AcroFields;
            af.SetField("Degree", degree.Text);
            af.SetField("Grad", gradDate.Text);
            af.SetField("Obj", objective.Text);
            Response.Redirect("Default.aspx?Degree=" + this.degree.Text + "&Grad=" + this.gradDate.Text
        + "&Obj=" + this.objective.Text);
            Response.Redirect("Page3.aspx");
            //ps.FormFlattening = true;
Page 3
AcroFields af = ps.AcroFields;
            af.SetField("jobStart1", jobStart1.Text);
            af.SetField("jobEnd1", jobEnd1.Text);
            af.SetField("jobTitle1", jobTitle1.Text);
            af.SetField("coName1", coName1.Text);
            af.SetField("coAdd1", coAdd1.Text);
            af.SetField("Details1", details1.Text);
            Response.Redirect("Default.aspx?jobStart1" + this.jobStart1.Text + "&jobEnd1=" + this.jobEnd1.Text
        + "&jobTitle1=" + this.jobTitle1.Text + "&coName1=" + this.coName1.Text + "&coAdd1=" + this.coAdd1.Text +
        "&Details1=" + this.details1.Text);
            Response.Redirect("Page4.aspx");
Page 4
AcroFields af = ps.AcroFields;
            af.SetField("jobStart2", jobStart2.Text);
            af.SetField("jobEnd2", jobEnd2.Text);
            af.SetField("jobTitle2", jobTitle2.Text);
            af.SetField("coName2", coName2.Text);
            af.SetField("coAdd2", coAdd2.Text);
            af.SetField("Details2", details2.Text);
            Response.Redirect("Default.aspx?jobStart2" + this.jobStart2.Text + "&jobEnd2=" + this.jobEnd2.Text
        + "&jobTitle2=" + this.jobTitle2.Text + "&coName2=" + this.coName2.Text + "&coAdd2=" + this.coAdd2.Text +
        "&Details2=" + this.details2.Text);
            Response.Redirect("Page5.aspx");
Page 5
 AcroFields af = ps.AcroFields;
            af.SetField("jobStart3", jobStart3.Text);
            af.SetField("jobEnd3", jobEnd3.Text);
            af.SetField("jobTitle3", jobTitle3.Text);
            af.SetField("coName3", coName3.Text);
            af.SetField("coAdd3", coAdd3.Text);
            af.SetField("Details3", details3.Text);
            Response.Redirect("Default.aspx?jobStart3" + this.jobStart3.Text + "&jobEnd3=" + this.jobEnd3.Text
        + "&jobTitle3=" + this.jobTitle3.Text + "&coName3=" + this.coName3.Text + "&coAdd3=" + this.coAdd3.Text +
        "&Details3=" + this.details3.Text);
            Response.Redirect("Page6.aspx");
Page 6
 string name = Request.QueryString["Name"];
            string address = Request.QueryString["Address"];
            string phone = Request.QueryString["Phone"];
            string email = Request.QueryString["Email"];
            string city = Request.QueryString["city"];
            string state = Request.QueryString["state"];
            string zip = Request.QueryString["zip"];
            string degree = Request.QueryString["Degree"];
            string gradDate = Request.QueryString["Grad"];
            string objective = Request.QueryString["Obj"];
            string jobStart1 = Request.QueryString["jobStart1"];
            string jobEnd1 = Request.QueryString["jobEnd1"];
            string jobTitle1 = Request.QueryString["jobTitle1"];
            string coName1 = Request.QueryString["coName1"];
            string coAdd1 = Request.QueryString["coAdd1"];
            string details1 = Request.QueryString["Details1"];
            string jobStart2 = Request.QueryString["jobStart2"];
            string jobEnd2 = Request.QueryString["jobEnd2"];
            string jobTitle2 = Request.QueryString["jobTitle2"];
            string coName2 = Request.QueryString["coName2"];
            string coAdd2 = Request.QueryString["coAdd2"];
            string details2 = Request.QueryString["Details2"];
            string jobStart3 = Request.QueryString["jobStart3"];
            string jobEnd3 = Request.QueryString["jobEnd3"];
            string jobTitle3 = Request.QueryString["jobTitle3"];
            string coName3 = Request.QueryString["coName3"];
            string coAdd3 = Request.QueryString["coAdd3"];
            string details3 = Request.QueryString["Details3"];


            AcroFields af = ps.AcroFields;
            af.SetField("Name", name);
            af.SetField("Email", email);
            af.SetField("state", state);
            af.SetField("city", city);
            af.SetField("Address", address);
            af.SetField("Phone", phone);
            af.SetField("zip", zip);
            af.SetField("Degree", degree);
            af.SetField("Grad", gradDate);
            af.SetField("Obj", objective);
            af.SetField("jobStart1", jobStart1);
            af.SetField("jobEnd1", jobEnd1);
            af.SetField("jobTitle1", jobTitle1);
            af.SetField("coName1", coName1);
            af.SetField("coAdd1", coAdd1);
            af.SetField("Details1", details1);
            af.SetField("jobStart2", jobStart2);
            af.SetField("jobEnd2", jobEnd2);
            af.SetField("jobTitle2", jobTitle2);
            af.SetField("coName2", coName2);
            af.SetField("coAdd2", coAdd2);
            af.SetField("Details2", details2);
            af.SetField("jobStart3", jobStart3);
            af.SetField("jobEnd3", jobEnd3);
            af.SetField("jobTitle3", jobTitle3);
            af.SetField("coName3", coName3);
            af.SetField("coAdd3", coAdd3);
            af.SetField("Details3", details3);
            af.SetField("Skills", skills.Text);
            ps.FormFlattening = true;
        }
        Response.End();
 Response.Redirect("Default.aspx?name=" + this.name.Text + "&Email=" + this.email.Text 
        + "&state=" + this.state.Text + "&city=" + this.city.Text + "&Address=" + this.address.Text + 
        "&Phone=" + this.phone.Text + "&zip=" + this.zip.Text);
 Response.Redirect("Page2.aspx"); //this will never be reached because the line before it ends the current execution context

您正在重定向回 Default.aspx,但根据您的问题判断,您的意图是转到 Page2.aspx。但是 Response.Redirect("Page2.aspx"); 永远不会到达,因为响应在第一次重定向后结束。当您调用响应重定向(标准重载)时,当前请求上下文结束,客户端会收到一个 HTTP 重定向。因此不会执行更多代码。

相反,将这两行替换为这一行:

Response.Redirect("Page2.aspx?name=" + this.name.Text + "&Email=" + this.email.Text 
            + "&state=" + this.state.Text + "&city=" + this.city.Text + "&Address=" + this.address.Text + 
            "&Phone=" + this.phone.Text + "&zip=" + this.zip.Text);

然后在第 2 页,您需要 Page_Load 中的代码来从请求查询字符串中提取值,以及其他代码,以便在您离开页面时传递第 1 页中的值,第 2 页的新值。依此类推。

你应该 UriEncode your values before putting them in the query string. And concatenating a bunch of strings is really ugly. Perhaps a format string 适合这里。

另外,如果我是你,我会完全放弃查询字符串方法。这真的很混乱,像这样传递它们,因为在几页之后,您将拥有大量参数,并且它将变得混乱 URL 和大量样板代码。这些都不好。相反,您应该创建一个模型来表示您想要收集的所有信息,然后将模型存储在某个地方,例如 Session 以在页面之间传递它。在构建 PDF 的函数中,让它接受模型作为参数并根据模型中的值生成 PDF。

该模型只是一个 C# class,代表您的 PDF 需要的值。例如,这是一个起点:

public class ApplicantInformationModel
{
    public string Name {get; set;}
    public string Email {get; set;}
    public List<Job> Jobs {get; set;}
    public string PhoneNumber {get; set;}
}

public class Job
{
    public DateTime StartDate {get; set;}
    public DateTime EndDate {get; set;}
    public string Title {get; set;}
    public string Company {get; set;}
}

您的 PDF 创建功能将接受这个:

public static Document GeneratePdfForApplicant(ApplicantInformationModel model)
{
    //use iTextSharp to generate and return PDF based on the model
}