Introduction
This project uses an HTML to PDF exe from ESP. Please read the GNU license agreement for more information. HTMLDOC is a desktop application to create PDF documents from a HTML page. I wrote some code to use it from a web application. The best used is from a Web Report to add a PRINT to PDF button to use the C# class.
Using the code
public string Run(string sRawUrl)
{
string sFileName = GetNewName();
string sPage = Server.MapPath("" + sFileName + ".html");
string sUrlVirtual = sRawUrl;
StringWriter sw = new StringWriter();
Server.Execute(sUrlVirtual, sw);
StreamWriter sWriter = File.CreateText(sPage);
sWriter.WriteLine(sw.ToString());
sWriter.Close();
System.Diagnostics.Process pProcess
= new System.Diagnostics.Process();
pProcess.StartInfo.FileName = m_sDrive + ":" + m_Directory +
"\\ghtmldoc.exe";
pProcess.StartInfo.Arguments = "--webpage --quiet " + sFontSize +
m_sWaterMark + " --bodyfont Arial " + sLandScape +
" -t pdf14 -f " + sFileName + ".pdf " + sFileName + ".html";
pProcess.StartInfo.WorkingDirectory = m_sDrive + ":" + m_Directory;
pProcess.Start();
return(sFileName + ".pdf");
}
The class PDFGenerator
contains a public method called Run
that will call the process hghtmldoc.exe with the arguments you choose. The most important part is to set a working directory where the Web application has permission to read, write and execute, otherwise the program won't work, and the function pProcess
.Start will raise a Win32 Exception "access denied".
StreamWriter
will save the page into a HTML file on the hard disk.
The file DisplayPDF.aspx and DisplayPDF.aspx.cs will do just that, displays the generated PDF file when ready.
private void Page_Load(object sender, System.EventArgs e)
{
if ( Request.Params["File"] != null )
{
bool bRet = false;
int iTimeout = 0;
while ( bRet == false )
{
bRet = CheckIfFileExist(Request.Params["File"].ToString());
Thread.Sleep(1000);
iTimeout++;
if ( iTimeout == 10 )
break;
}
if ( bRet == true )
{
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "Application/pdf";
try
{
Response.WriteFile( MapPath( "" +
Request.Params["File"].ToString() ) );
Response.Flush();
Response.Close();
}
catch
{
Response.ClearContent();
}
}
else
{
if ( Request.Params["Msg"] != null )
{
LabelMsg.Text = Request.Params["Msg"].ToString();
}
}
}
}
The page accepts a parameter, FILE
, previously saved in the hard disk by StreamWriter
. The Response.Redirect
will include application/PDF, so the browser knows what kind of file is downloading and ask you to SAVE or OPEN. If you have Adobe plug-in installed on your browser, you'll be able to see the PDF from your browser.
Points of Interest
It is important you create a directory to save the HTML file and generate the PDF, also give that directory all the permissions you need to run the EXE.
History
Remember the HTMLDOC is copywrite ESP. Please go to this link and download the latest version. The GNU license agreement is included in the project.