2013-07-11 2 views
3

현재 비 IE 브라우저 (Chrome, Firefox, Opera, Safari)의 경우 해당 PDF에 대한 URL이 제공된 PDF 문서를 프린터로 보내고 싶습니다.iframe을 통해 브라우저의 PDF URL을 프린터로 보냅니다.

불필요한 창이 나타나지 않도록하려면 현재 으로 처리하고 있지만 인쇄가 완료되면 iframe을 닫고 싶습니다. 그렇지 않으면 페이지를 벗어날 때 일부 브라우저에서 대화 상자가 나타납니다. 때 하나

var _print_url, _remove_iframe, _set_print; 

_print_url = function(src_url) { 
    $("<iframe src='" + src_url + "' type='application/pdf'>").css({ 
    visibility: 'hidden', 
    position: 'fixed', 
    right: '0', 
    bottom: '0' 
    }).on('load', _set_print).appendTo(document.body); 
}; 

_remove_iframe = function(iframe) { 
    return $(iframe).parent().find(iframe).detach(); 
}; 

_set_print = function() { 
    this.contentWindow.print(); 
/* 
* Where we could do @contentWindow.close() with a window, we must remove the 
* print iframe from the DOM. We have to engage in some async madness 
* it seems, for no apparent reason other than this won't work 
* synchronously (@cw.print above must be async, it seems) - even though 
* window.close() appears to work synchronously. 
*/ 
    _.delay(_.partial(_remove_iframe, this), 100); 
}; 

때때로는 인쇄 대화 상자가 올바르게 PDF를 보여주는 끝 구글 크롬으로 보이지만, 다음은

는 지금까지 (단순에 대한 lodash 및 jQuery를 사용)와 온 것입니다 프린터를 선택하고 인쇄 의도를 확인하면 실제로 프레임의 상위 페이지 내용을 PDF 자체 대신 프린터로 보냅니다.

suggestions on the Mozilla page 링크가 있지만이 문서는 현재 폐기 된 것 같습니다. 필자가 볼 수있는 가장 좋은 예는 Amazon Web Services 인쇄 대화 상자에서 인보이스를 리버스 엔지니어링하는 것이었지만 창이 열립니다.

제가 생각한 또 다른 대안은 Google Cloud Print입니다.하지만 분명히 추가 소프트웨어 또는 Google 계정 구성이 필요하며, 필요하지 않으면 사용자에게 부여하지 않아야합니다.

URL과 함께, 특히 Javascript를 사용하여 PDF를 인쇄하는 방법에 대한 다른 예가 있습니까? 추가로 브라우저 추가 기능이나 창문과 같은 인위적인 부분이 없으면 어떻게해야합니까?

+0

이것은 단지 의문이지만,'print()'를 호출하기 전에'this.contentWindow.focus()'를 호출하면 어떻게 될까요? –

+0

@YatinSaraiya iframe을 참조합니다. jQuery는 이벤트 처리기가 정의 된 요소에 'this'를 바인딩합니다. ([여기, 마지막 단락을 참조하십시오] (http://api.jquery.com/on/#event-handler). –

답변

3

-

내가 몇 달 전에 아약스 응용 프로그램 사랑의 비슷한 문제로 실행, 문제는 내가 PDF를 작성해야했다 직면했다 - 당신이 팝업 차단기를 볼 수없고이 방법을 참고 오순절 파일 및 저장하기 전에 인쇄하려면, 내가 한 일은 다음과 같습니다 :

나는 iframe을 사용하지 않았습니다. 이 응용 프로그램은 pdf를 만들기위한 PHP TCPDF 및 템플릿 시스템 용 및 underscore과 함께 작동합니다.

'당신은 내가 모든 아약스 있다는 문제에 직면하기 때문에

  1. 는이를 위해 JSON (아약스)를 통해 정보를 전송 http://www.screenr.com/Ur07 (2시 18분 분)의 데모 비디오를 볼 수 있습니다, 그래서 나오지 않았어 그 정보로 게시물을 만들었으므로 DOM에 숨겨진 form을 추가 한 다음 target = "_ blank"를 사용하여 게시물을 새 윈도우로 만들어 프로세스의 끝 부분을 닫습니다.

HTML 숨겨진 가상 형태

<form method='<%= method %>' 
     action="<%= action %>" 
     name="<%= name %>" 
     id="<%= id %>" 
     target="_blank"> 
    <input type='hidden' name='json' id='<%= valueId %>' /> 
</form> 

자바 스크립트

function makePost(){ 
    var _t = _.template(_JS_Templates["print.form.hidden"]); //this the html of the form 

    var o = { 
    method : "POST", 
    action : js_WEB_ + "/print.php", 
    name : "print_virtual_form", 
    id : "print_virtual_form_id", 
    valueId : "print_virtual_value" 
    } 

var form = _t(o); 
$(".warp").append(form); //appending the form to the dom 

    var json = { 
    data : data // some data 
    }  

$("#print_virtual_value").val(JSON.stringify(json)); //assing to the hidden input the value and stringify the json 
$("#print_virtual_form_id").submit(); //make the post submmitting the form 
$("#print_virtual_form_id").remove(); //removing the "virtual hidden form" 

} 

2.- 당신은 당신이 만들 필요가 무엇이든 만들 PHP를 사용하고 내 경우에는 JSON을받을 때, 나는이 방법으로 그것을했다 당신은

Generate PDF using TCPDF on ajax call

3 (내 대답은)이 예에서 PHP 코드를 볼 수 있습니다 .- 마지막으로 이것이 멋진 부분이 응답 인 부분입니다.이 부분에서는 PHP 파일을 사용하여 부모 창을 닫고 특정 기능에 대한 json 응답을보고해야한다는 javascript 코드를 작성했습니다. 친절합니다. 콜백.

switch($_SERVER['REQUEST_METHOD']){ 
    case "GET": 
     echo "Denied"; 
    break; 

    case "POST": 
     if(isset($_POST["json"])){ 
      if(!empty($_POST["json"])){ 
       $json = $_POST["json"];    
       $hash = PDF::makePDF($json); 
       echo "<script> 
        function init() { 
         //calling callback 
             //returning control to the previous browser 
           window.opener.someclass.finish('".$hash."'); 
           window.close(); 
        } 
       window.onload = init;      
      </script>"; 
      }else{ 
       echo "not json detected"; 
      } 
     }else{ 
      echo "not json detected"; 
     } 
    break; 

4. 컨트롤을 사용하여 끝내려면 창 브라우저에서 수행 할 수 있습니다. 내가 아는

var someobject = (function(name){ 
    //private 
    var finish(data){ 
    //do whatever you want with the json data 
    } 

    //public 
    var $r = {}; 
    $r.finish = function(data){ 
    finish(data); //you will pass the data to the finish function and that is..!! voila!! 
    } 

    return $r; 
})("someobject"); 

나는 브라우저의 많은 작동을 보장 할 수있는 사용자는 당신이 길을 사랑합니다, 당신이 물어 정확히 아니지만 나는이 좀 더 복잡하다 생각하면서 같은 문제에 대한 또 다른 접근 방법이다 그것. 그들은 무슨 일이 일어나고 있는지 결코 보지 않을 것이며 파일을 다운로드 할 것입니다. 링크를 클릭하고 파일을 저장하는 것만 큼 기대됩니다.

그냥 내 두 센트와 행복한 코딩.

+1

대단히 감사합니다. 이것은 실제 틈새 문제로 보이는 것 같아서 어떤 생각이나 아이디어에 감사 드리며 훌륭한 아이디어입니다. 건배. –

관련 문제