Как конвертировать в PDF страницу ASPX с полями формы, заполненными данными с помощью C# и ASP.NET.
Разнообразные API для конвертирования ASPX в PDF;
Требуется только .NET Framework 2.0 и выше;
Полностью написан на языке C#;
Сохранение всех заполненных данных.
«PDF Vision .Net» - это то, что Вам нужно!
«PDF Vision .Net» - это .NET-компонент, полностью написанный на C#, надежный и очень простой в использовании. Он улучшит Ваш веб-сервер ASP.NET или приложение Windows Forms.
«PDF Vision .Net» разработан нами для Вашего приложения чтобы создавать PDF-документы из ASPX и HTML на лету.
Вы можете скачать Demo-версию «PDF Vision .Net» или установить пакет с NuGet.
В этой статье мы расскажем как создать простое ASP.NET-приложение C# с некоторыми элементами управления (TextBox, ListBox и CheckBox) и кнопкой "Печать в PDF".
Вы согласитесь, что, если просто взять страницу ASPX и передать её в любой PDF-конвертер, мы увидим результат, где все формы полей и элементы управления будут иметь свои значения по умолчанию.
Другими словами, основная проблема при преобразовании страниц ASPX заключается в сохранении всех значений полей и элементов управления, установленных пользователем.
Здесь Вы найдете пошаговую инструкцию как решить эту проблему.
Итак, начнем!
Прежде всего, создайте новое web-приложение ASP.Net.
Далее, добавьте элементы управления внутри формы: текстовое поле, список и флажки.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>How convert ASPX page to PDF with filled forms in C# and .Net</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>How convert ASPX page to PDF with filled forms in C# and .Net</h1>
<div>Fill some house description here:<br />
<br />
House space (m2):
<asp:TextBox ID="txtHouseSpace" runat="server"></asp:TextBox>
<br />
<br />
Number of floors:
<asp:ListBox ID="lstFloorsNum" runat="server" Rows="1">
<asp:ListItem Selected="True">1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
</asp:ListBox>
<br />
<br />
<asp:CheckBox ID="chkBathroom" runat="server" Checked="True" Text="Bathroom" />
<asp:CheckBox ID="chkToilet" runat="server" Checked="True" Text="Toilet" />
<asp:CheckBox ID="chkSwimmingPool" runat="server" Text="Swimming pool " />
</div>
<br />
<p>
<asp:Button ID="ButtonPDF" runat="server" onclick="GetPDF_Click"
Text="Print to PDF" />
</p>
</div>
</form>
</body>
</html>
Целью этого является получение состояния и значения всех элементов управления и сохрание их в нашем пользовательском объекте класса перед началом преобразования в PDF.
Следующим шагом является подготовка класса к хранению всех данных и значений всех наших элементов управления (текстовые поля, списки и флажки). То есть добавляем этот пользовательский класс в наше приложение:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
///
/// Summary description for HouseDescription
///
public class HouseDescription
{
public HouseDescription()
{
HouseSpace = 120.0f;
FloorsNumber = 2;
IsBathroom = true;
IsToilet = true;
IsSwimmingPool = false;
}
public float HouseSpace { set; get; }
public int FloorsNumber { set; get; }
public bool IsBathroom { set; get; }
public bool IsToilet { set; get; }
public bool IsSwimmingPool { set; get; }
}
После этого мы получаем объект со всеми данными, которые нам нужны, чтобы поместить его внутрь Page.Application с уникальным ID. Таким образом, все наши данные будут доступны приблизительно в течение 20 минут, если мы знаем уникальный ID. Кстати, Вы можете настроить время хранения предметов внутри свойства Page.Application.
На самом деле хранить на сервере эти данные в течение 20 минут небезопасно, поэтому лучше удалить объект из приложения сразу же после генерации PDF-файла.
Ну и конечно логично будет завершить процесс воссозданием состояния страницы по идентификатору (ID). Другими словами, метод, который преобразует ASPX в PDF, откроет страницу с параметром, например:
http://www.mysite.com/default.aspx?id=123456789
Зная ID, Вы найдете необходимый объект пользовательского класса и заполните все элементы управления: текстовые поля, флажки и списки.
Это остальная часть кода C# (Default.aspx.cs):
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Net;
using System.Text;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string id = Request.QueryString["id"];
HouseDescription hd = null;
if (id != null)
{
// Recreate the page state
hd = (HouseDescription)Application[id];
SetPageState(hd);
}
// First time loading. Set all to default.
else
{
if (!IsPostBack)
SetPageState(new HouseDescription());
}
}
protected void GetPDF_Click(object sender, EventArgs e)
{
// 1. Save the current page state
// 1.1. Create ID
string id = Guid.NewGuid().ToString();
// 1.2 Save the current state in the Application State.
HouseDescription hd = GetPageState();
Application[id] = hd;
// 2. Create url
string pageUrl = System.Web.HttpContext.Current.Request.Url.AbsoluteUri;
string pageUrlWithQuerry = string.Format("{0}?id={1}", pageUrl, id);
// 3. Get PDF
SautinSoft.PdfVision v = new SautinSoft.PdfVision();
// Set "Edge mode" to support all modern CSS.
SautinSoft.PdfVision.TrySetBrowserModeEdgeInRegistry();
byte[] pdf = v.ConvertHtmlFileToPDFStream(pageUrlWithQuerry);
// 4. Show PDF result
if (pdf != null)
{
Response.Buffer = true;
Response.Clear();
Response.ContentType = "application/PDF";
//Response.AddHeader("Content-Disposition:", "attachment; filename=Result.pdf");
Response.AddHeader("Content-Disposition:", "inline; filename=Result.pdf");
Response.BinaryWrite(pdf);
Response.Flush();
Response.End();
}
}
protected void SetPageState(HouseDescription hd)
{
txtHouseSpace.Text = hd.HouseSpace.ToString();
lstFloorsNum.SelectedValue = hd.FloorsNumber.ToString();
chkBathroom.Checked = hd.IsBathroom;
chkToilet.Checked = hd.IsToilet;
chkSwimmingPool.Checked = hd.IsSwimmingPool;
}
protected HouseDescription GetPageState()
{
HouseDescription hd = new HouseDescription();
float houseSpace = 0f;
if (float.TryParse(txtHouseSpace.Text, out houseSpace))
hd.HouseSpace = houseSpace;
int floorsNum = 1;
if (Int32.TryParse(lstFloorsNum.SelectedValue, out floorsNum))
hd.FloorsNumber = floorsNum;
hd.IsBathroom = chkBathroom.Checked;
hd.IsToilet = chkToilet.Checked;
hd.IsSwimmingPool = chkSwimmingPool.Checked;
return hd;
}
}
Метод "GetPageState" получает все данные из элементов управления и сохраняет их в качестве объекта пользовательского класса.
Метод "SetPageState" заполняет все элементы управления страницами из объекта пользовательского класса.
Метод "GetPDF_Click" вставляет объект пользовательского класса внутрь страницы. Приложение, использующее уникальный ID. Далее этот метод запускает преобразование в PDF, но требует ID.
А метод "Page_Load" воссоздает состояние страницы (заполняет все элементы управления) в том случае, если он встретил ID и нашел объект пользовательского класса, соответствующий этому ID.
Вот как это работает /проект работает в режиме реального времени 🙂/: