在IFrame中打印PDF后自动关闭窗口

本文关键字:窗口 IFrame 打印 PDF | 更新日期: 2023-09-27 18:24:50

我正在开发一个web应用程序,该应用程序要求用户能够运行报告,并让它在客户端机器上自动显示打印对话框以进行打印。

我已经把这些都做好了。

当用户单击打印按钮时,将生成RDLC LocalReport,并在iTextSharp的帮助下在新窗口/表单中以pdf文档的形式返回,并显示打印对话框。

我希望能够在用户打印或从打印对话框中取消后自动关闭表单。

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关闭窗口的各种方法,但迄今为止都没有成功。

任何想法都将不胜感激。

在IFrame中打印PDF后自动关闭窗口

我最终自己找到了解决方案。

使用我在其他地方找到的一些代码来处理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);

除了用户在打印对话框中单击"取消"(我找不到任何检测方法)之外,这一操作效果很好。