在 IFrame 中打印 PDF 后自动关闭 window
Auto close window after print PDF within IFrame
我正在开发一个 Web 应用程序,该应用程序要求用户能够 运行 报告并让它自动在客户端计算机上显示打印对话框以进行打印。
我已经搞定了,一切正常。
当用户单击打印按钮时,将生成一个 RDLC LocalReport,并在 iTextSharp 的帮助下以 pdf 文档形式返回 window/form,并显示打印对话框。
我希望能够在用户打印或从打印对话框中取消后自动关闭表单。
aspx 目前如下(略微精简版):
<body>
<form id="form1" runat="server">
<div>
<iframe id="frmPrint" name="IframeName" width="500" height="200" runat="server"> </iframe>
</div>
</form>
</body>
aspx.cs内的代码:
FileStream LFileStream = new FileStream(HttpContext.Current.Server.MapPath(Session[LReportNameSrcString].ToString()), FileMode.Create);
LFileStream.Write(LResult, 0, LResult.Length);
LFileStream.Close();
//Open existing PDF
Document LDocument = new Document(PageSize.A4);
PdfReader LPdfReader = new PdfReader(HttpContext.Current.Server.MapPath(Session[LReportNameSrcString].ToString()));
//Getting a instance of new PDF writer
PdfWriter LPdfWriter = PdfWriter.GetInstance(LDocument, new FileStream(HttpContext.Current.Server.MapPath(Session[LReportNameString].ToString()), FileMode.Create));
LDocument.Open();
PdfContentByte LPdfContentByte = LPdfWriter.DirectContent;
int LPageNumber = 0;
int LNumberOfPages = LPdfReader.NumberOfPages;
//Add Page to new document
while (LPageNumber < LNumberOfPages)
{
LDocument.NewPage();
LPageNumber++;
PdfImportedPage LPdfImportedPage = LPdfWriter.GetImportedPage(LPdfReader, LPageNumber);
LPdfContentByte.AddTemplate(LPdfImportedPage, LLocalReport.GetDefaultPageSettings().Margins.Left, LLocalReport.GetDefaultPageSettings().Margins.Top);
}
//Attach javascript to the document
//PdfAction LPdfAction = PdfAction.JavaScript("alert('loaded');parent.beginPrint();\r", LPdfWriter);
PdfAction LPdfAction = PdfAction.JavaScript("this.print();\r", LPdfWriter);
LPdfWriter.AddJavaScript(LPdfAction);
LDocument.Close();
//Attach pdf to the iframe
frmPrint.Attributes["src"] = Session[LReportNameString].ToString();
我尝试了各种使用 JavaScript 关闭 window 的方法,但到目前为止都没有成功。
如有任何想法,我们将不胜感激。
最后我自己找到了解决方案。
使用我在其他地方找到的一些代码来处理来自 PDF 文档的消息。这使我能够为 PDF 打印事件添加一个侦听器,并在主机容器中触发一条消息,该消息可以被 JavaScript.
拾取
在 ASPX 中:
// Acrobat JavaScript event handler to handle messages returned from Acrobat document
function messageFunc(messageArray) {
window.close();
}
// Waits until the HTML objects ready / loaded state has been reached
// then add a listener for JavaScript messages being returned from Acrobat document
function loadListener() {
var pdfObject = document.getElementById("pdfObj");
if (typeof pdfObject.readyState === 'undefined') { // ready state only works for IE, which is good because we only need to do this for IE because IE sucks in the first place
pdfObject.messageHandler = { onMessage: messageFunc };
return;
}
if (pdfObject.readyState == 4) {
pdfObject.messageHandler = { onMessage: messageFunc };
} else {
setTimeout(loadListener, 500);
}
}
// Wait until main HTML document has loaded then call function to set up JavaScript event listeners
jQuery(document).ready(function() {
loadListener();
});
在后面的代码中:
// Add event listener to detect when the print has begun then return a message (in this case an empty string) to the browser
// window to be picked up by a JavaScript event listener which can then close the window
const string LPostMessageString = "try { this.hostContainer.postMessage(['']); } catch(e) {app.alert(e.message);}";
LPdfAction = PdfAction.JavaScript(LPostMessageString, LPdfWriter);
LPdfWriter.SetAdditionalAction(PdfWriter.DID_PRINT, LPdfAction);
如果用户在打印对话框中单击“取消”,我发现无法检测到这种情况,但效果很好。
我正在开发一个 Web 应用程序,该应用程序要求用户能够 运行 报告并让它自动在客户端计算机上显示打印对话框以进行打印。
我已经搞定了,一切正常。
当用户单击打印按钮时,将生成一个 RDLC LocalReport,并在 iTextSharp 的帮助下以 pdf 文档形式返回 window/form,并显示打印对话框。
我希望能够在用户打印或从打印对话框中取消后自动关闭表单。
aspx 目前如下(略微精简版):
<body>
<form id="form1" runat="server">
<div>
<iframe id="frmPrint" name="IframeName" width="500" height="200" runat="server"> </iframe>
</div>
</form>
</body>
aspx.cs内的代码:
FileStream LFileStream = new FileStream(HttpContext.Current.Server.MapPath(Session[LReportNameSrcString].ToString()), FileMode.Create);
LFileStream.Write(LResult, 0, LResult.Length);
LFileStream.Close();
//Open existing PDF
Document LDocument = new Document(PageSize.A4);
PdfReader LPdfReader = new PdfReader(HttpContext.Current.Server.MapPath(Session[LReportNameSrcString].ToString()));
//Getting a instance of new PDF writer
PdfWriter LPdfWriter = PdfWriter.GetInstance(LDocument, new FileStream(HttpContext.Current.Server.MapPath(Session[LReportNameString].ToString()), FileMode.Create));
LDocument.Open();
PdfContentByte LPdfContentByte = LPdfWriter.DirectContent;
int LPageNumber = 0;
int LNumberOfPages = LPdfReader.NumberOfPages;
//Add Page to new document
while (LPageNumber < LNumberOfPages)
{
LDocument.NewPage();
LPageNumber++;
PdfImportedPage LPdfImportedPage = LPdfWriter.GetImportedPage(LPdfReader, LPageNumber);
LPdfContentByte.AddTemplate(LPdfImportedPage, LLocalReport.GetDefaultPageSettings().Margins.Left, LLocalReport.GetDefaultPageSettings().Margins.Top);
}
//Attach javascript to the document
//PdfAction LPdfAction = PdfAction.JavaScript("alert('loaded');parent.beginPrint();\r", LPdfWriter);
PdfAction LPdfAction = PdfAction.JavaScript("this.print();\r", LPdfWriter);
LPdfWriter.AddJavaScript(LPdfAction);
LDocument.Close();
//Attach pdf to the iframe
frmPrint.Attributes["src"] = Session[LReportNameString].ToString();
我尝试了各种使用 JavaScript 关闭 window 的方法,但到目前为止都没有成功。
如有任何想法,我们将不胜感激。
最后我自己找到了解决方案。
使用我在其他地方找到的一些代码来处理来自 PDF 文档的消息。这使我能够为 PDF 打印事件添加一个侦听器,并在主机容器中触发一条消息,该消息可以被 JavaScript.
拾取在 ASPX 中:
// Acrobat JavaScript event handler to handle messages returned from Acrobat document
function messageFunc(messageArray) {
window.close();
}
// Waits until the HTML objects ready / loaded state has been reached
// then add a listener for JavaScript messages being returned from Acrobat document
function loadListener() {
var pdfObject = document.getElementById("pdfObj");
if (typeof pdfObject.readyState === 'undefined') { // ready state only works for IE, which is good because we only need to do this for IE because IE sucks in the first place
pdfObject.messageHandler = { onMessage: messageFunc };
return;
}
if (pdfObject.readyState == 4) {
pdfObject.messageHandler = { onMessage: messageFunc };
} else {
setTimeout(loadListener, 500);
}
}
// Wait until main HTML document has loaded then call function to set up JavaScript event listeners
jQuery(document).ready(function() {
loadListener();
});
在后面的代码中:
// Add event listener to detect when the print has begun then return a message (in this case an empty string) to the browser
// window to be picked up by a JavaScript event listener which can then close the window
const string LPostMessageString = "try { this.hostContainer.postMessage(['']); } catch(e) {app.alert(e.message);}";
LPdfAction = PdfAction.JavaScript(LPostMessageString, LPdfWriter);
LPdfWriter.SetAdditionalAction(PdfWriter.DID_PRINT, LPdfAction);
如果用户在打印对话框中单击“取消”,我发现无法检测到这种情况,但效果很好。