Как сделать многократную печать отчета crystal в ASP.NET
привет разработчики, моя проблема в том, что я могу распечатать несколько страниц, но то, что я собираюсь сделать, это то, что я сначала загружу его в формате pdf и напечатаю все это, я сделал кнопку одним щелчком мыши с помощью javascript, но я не могу сделать несколько страниц вот мой код ниже.
protected void Page_Load(object sender, EventArgs e) { try { Session["pager"] = ((DataTable)Session["table"]).Rows.Count; rptDoc.Load(Server.MapPath(Session["path"].ToString())); string aaa = Session["path"].ToString(); rptDoc.SetDataSource((DataTable)Session["table"]); reportViewer.ReportSource = rptDoc; reportViewer.RefreshReport(); if (!IsPostBack) { Session["index"] = 1; lblback.Text = Session["back"].ToString(); } } catch (Exception ex) { error.ErrorLogs(Session["UserName"].ToString(), url, ex); ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertmessage", "alert('" + ConString.ErrorMessage() + "')", true); } }
<input id="btnPrint" type="button" value="Print" onclick="Print()" />
<div id="dvReport"> <CR:CrystalReportViewer ID="reportViewer" runat="server" AutoDataBind="true" BestFitPage="False" EnableDatabaseLogonPrompt="False" EnableParameterPrompt="False" PrintMode="ActiveX" HasGotoPageButton="False" HasPageNavigationButtons="False" /> </div>
<script type="text/javascript"> function Print() { var dvReport = document.getElementById("dvReport"); var frame1 = dvReport.getElementsByTagName("iframe")[0]; if (navigator.appName.indexOf("Internet Explorer") != -1 || navigator.appVersion.indexOf("Trident") != -1) { frame1.name = frame1.id; window.frames[frame1.id].focus(); window.frames[frame1.id].print(); } else { var frameDoc = frame1.contentWindow ? frame1.contentWindow : frame1.contentDocument.document ? frame1.contentDocument.document : frame1.contentDocument; frameDoc.print(); } } </script>
Что я уже пробовал:
мой исходный код таков.
protected void btnPrint_Click(object sender, EventArgs e) { Session["pager"] = ((DataTable)Session["table"]).Rows.Count; rptDoc.Load(Server.MapPath(Session["path"].ToString())); string aaa = Session["path"].ToString(); rptDoc.SetDataSource((DataTable)Session["table"]); reportViewer.ReportSource = rptDoc; reportViewer.RefreshReport(); PrinterSettings printerSettings = new PrinterSettings(); PrintDocument localPrinter = new PrintDocument(); printerSettings.PrinterName = localPrinter.PrinterSettings.PrinterName; rptDoc.PrintToPrinter(printerSettings, new PageSettings(), false); }
я меняю его на javascript из-за какой-то проблемы с принтером на моей стороне, я могу использовать это и печатать несколько страниц, но всякий раз, когда я запускал это, клиент пытался использовать мой сайт
PrintDocument localPrinter = new PrintDocument();это вызывает ошибку, которую я не могу обнаружить клиентской печати, но когда я попробовал ее работу, она отлично работает, поэтому я попробовал javascript.
Richard Deeming
Исходный код не будет работать, потому что он работает на сервере. Он будет способен печатать только на принтере, подключенном к вашему серверу и установленном для пользователя AppPool. Если это не приложение интрасети, с сервером и пользователями, находящимися в одном офисе, это не будет делать то, что вы хотите.
Печать с Javascript, как известно, очень сложна. Судя по тому, что PrintMode="ActiveX"
, Средство просмотра Crystal Reports использует решение, которое будет работать только в Internet Explorer на Windows и только в том случае, если пользователь разрешил вашему сайту "инициализация и использование элементов ActiveX, не помеченных как безопасные для использования".
Ваш лучший выбор, вероятно, состоит в том, чтобы экспортировать отчет в PDF и позволить пользователю загрузить его и распечатать самостоятельно.