2010-02-24 50 views
1

我有一个网页,它使用gridviews和html元素的组合来创建报表。我想给用户一个选择点击,它会导出到PDF。我不希望在服务器上创建pdf,因为这需要我编写另一个进程来清理文件。如何将当前ASPX页面导出为PDF

理想情况下,我希望当前页面打开一个呈现pdf并提示用户保存/打开的新页面。

我已经看过iTextSharp,并有兴趣使用它,如果我不必指定每个元素。如果有方法来指定一个面板及其所有内容或替代方案,我也可以这样做。

谢谢!

回答

2

这将是这样的方式容易,如果你能说服用户安装一个PDF打印机像CutePDfFoxit PDF Creator

+0

没错。同意。不过这是一个面向外部的网站。 – 2010-02-24 22:42:32

+0

这真的是最好的选择。它将使用户能够从任何网页获取创建的PDF文件,这些文件稍后将由他们以及您自己进行欣赏。 – David 2010-02-24 22:53:21

+0

事实上,您可以很容易地将其作为Word文档提供。http://www.c-sharpcorner.com/UploadFile/sgersh01/HTMLtoWord12032005012527AM/HTMLtoWord.aspx?ArticleID=37db62a9-1d4f-4571-b17a-f7cd1a157166 – David 2010-02-24 23:04:32

1

我知道这是一个老问题,但我的公司确实非常相似,你所需要的东西。我们使用ExpertPDF将html转换为pdf,并执行以下操作来获取html。因为向服务器返回html是一种安全风险,因此将EnableEventValidation =“false”很重要。

ASPX

<%@ Page Language="C#" **EnableEventValidation="false"** Inherits="MyProject.Default" 
     Title="PDF Generation" CodeBehind="~/Default.aspx.cs" %> 
<html> 
<head> 
</head> 
<body> 
<script type="text/javascript" language="JavaScript"> 
function getHtml() { 
var theHtml = document.getElementById('ReportContent').innerHTML; 
document.getElementById('<%=hdnHtml.ClientID %>').value = theHtml; 
return true; 
     } 

    </script> 
<div id='ReportContent'>  
...Some html content you want turned into a pdf 
</div>  
<asp:Button ID="btnSend" OnClick="btnSend_Click" OnClientClick="return getHtml();" 
                 runat="server" Text="Send" /> 

</body> 
</html> 




您也将有一个参考发送到你的CSS样式表,以及

CS

protected void BtnExport_Click(object sender, EventArgs e)<br/> 
{ 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateAndDownloadPDF(this.Request, hdnHtml.Value, Page.ResolveUrl("~/css/MAIN.css"), "NameOfTheFile", "Name of the Report");<br/> 
} 

public static void CreateAndDownloadPDF(System.Web.HttpRequest ServerRequest, string HTML, string cssfile, string FileName, string Footer) 
{ 
string downloadName = FileName + ".pdf";<br/> 
try 
{ 
PdfConverter pdfConverter = new PdfConverter();</br> 
pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.Letter; 
pdfConverter.PdfDocumentOptions.FitWidth = false; 
pdfConverter.PdfDocumentOptions.PdfCompressionLevel = PdfCompressionLevel.Normal; 
pdfConverter.PdfDocumentOptions.ShowFooter = true; 
pdfConverter.PdfDocumentOptions.LeftMargin = 25; 
pdfConverter.PdfDocumentOptions.RightMargin = 25; 
pdfConverter.PdfDocumentOptions.TopMargin = 25; 
pdfConverter.PdfDocumentOptions.BottomMargin = 15; 
pdfConverter.PdfDocumentOptions.GenerateSelectablePdf = true; 
pdfConverter.AvoidImageBreak = true; 

pdfConverter.PdfDocumentOptions.ShowHeader = false; 

pdfConverter.PdfFooterOptions.FooterText = Footer; 
pdfConverter.PdfFooterOptions.FooterTextColor = Color.Black; 
pdfConverter.PdfFooterOptions.DrawFooterLine = true; 
pdfConverter.PdfFooterOptions.PageNumberText = "Page"; 
pdfConverter.PdfFooterOptions.ShowPageNumber = true; 

pdfConverter.LicenseKey = "LICENSE_KEY_HERE"; 
string strHTML = "<html><head><link href='" + cssfile + "' rel='stylesheet' type='text/css' /></head><body>" + HTML + "</body></html>"; 


//set page url 
string url = "http://" + ServerRequest.ServerVariables["SERVER_NAME"] + port + ServerRequest.ServerVariables["SCRIPT_NAME"]; 
//end set page url 
byte[] downloadBytes = pdfConverter.GetPdfBytesFromHtmlString(strHTML, rmsPath); 

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
response.Clear(); 
response.AddHeader("Content-Type", "binary/octet-stream"); 
response.AddHeader("Content-Disposition", "attachment; filename=" + downloadName + "; size=" + downloadBytes.Length.ToString()); 
response.BinaryWrite(downloadBytes); 
response.End(); 
} 
catch (System.Threading.ThreadAbortException) { } //for response.End() 
catch (Exception ex) 
{ 
//Error handling 
} 
finally 
{ 
if (File.Exists(ServerRequest.MapPath(downloadName))) 
    File.Delete(ServerRequest.MapPath(downloadName)); 
} 
} 
+1

Heads使用这种方法有许可证费用。 – 2016-08-18 08:15:41