2015-11-27 2 views
0

Я работаю над веб-приложением, которое требует от пользователя возможности запуска отчета и автоматического отображения диалогового окна печати на клиентской машине для печати.Автоматическое закрытие окна после печати PDF в IFrame

У меня есть все, что работает.

Когда пользователь нажимает кнопку печати, создается RDLC LocalReport и возвращается в виде PDF-документа при помощи iTextSharp в новом окне/форме и отображается диалоговое окно печати.

Я хотел бы иметь возможность автоматически закрывать форму после того, как пользователь распечатает или отменяет его в диалоговом окне печати.

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 но до сих пор не увенчались успехом.

Любые идеи были бы весьма признательны.

ответ

0

Я нашел решение в конце концов.

Использование некоторого кода, который я нашел в другом месте для обработки сообщений из документа 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); 

Это хорошо работает, кроме, если пользователь нажимает отменить в диалоговом окне печати, из которых я не нашел способ обнаружения ,

Смежные вопросы