在 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);

如果用户在打印对话框中单击“取消”,我发现无法检测到这种情况,但效果很好。