JavaScript에서 직접 PDF 인쇄


94

HTML로 PDF 목록을 작성 중입니다. 목록에 다운로드 링크와 인쇄 버튼 / 링크를 포함하고 싶습니다. 사용자가 PDF를 보거나 PDF 뷰어를 열지 않고 PDF의 인쇄 대화 상자를 직접 열 수있는 방법이 있습니까?

PDF를 숨겨진 iframe으로 다운로드하고 JavaScript로 인쇄하도록 트리거하는 변형이 있습니까?

답변:


57

아래 설명에 따르면 최신 브라우저에서는 더 이상 작동하지 않습니다.
이 질문은 도움이 될 수있는 접근 방식을 보여줍니다 . 포함 된 PDF를 자동 인쇄

<embed>태그를 사용하여 문서에 PDF를 포함합니다.

<embed
    type="application/pdf"
    src="path_to_pdf_document.pdf"
    id="pdfDocument"
    width="100%"
    height="100%" />

그런 다음 .print()PDF가로드 될 때 Javascript의 요소에 대해 메소드 를 호출합니다 .

function printDocument(documentId) {
    var doc = document.getElementById(documentId);

    //Wait until PDF is ready to print    
    if (typeof doc.print === 'undefined') {    
        setTimeout(function(){printDocument(documentId);}, 1000);
    } else {
        doc.print();
    }
}

임베드를 숨겨진 iframe에 배치하고 거기에서 인쇄하여 원활한 경험을 제공 할 수 있습니다.


3
이 솔루션이 작동하지 않음 ... 나는 크롬, FF 거부 허가를 얻고있다
— user1428716

8
포함 된 문서가 다른 도메인에있는 경우에는 작동하지 않습니다.
— null 허용

5
렌더링 할 때 인쇄 할 pdf에 자바 스크립트를 추가하는 것이 더 쉽습니다. 이것이 Google 문서가하는 일입니다. 이렇게하면 브라우저가이를로드하고 인쇄하거나 Adobe 플러그인을 실행합니다.
— Rahly

2
당신은 아마 그것을 구글 할 수있을 것이다. 그러나 그것이 전부는 자바 스크립트가 단지 "window.print ()"인 PDF에 추가 된 새로운 스크립트 객체이다
— Rahly

6
예, print () 메서드가 정의되지 않은 모든 브라우저에서 문제가 있습니다. 이 방법은 구식입니까? 다른 해결책이 있습니까?
— Jacob Ensor 2017 년

39

다음은 iframe에서 PDF를 인쇄하는 기능입니다.

PDF의 URL을 함수에 전달하기 만하면됩니다. PDF가로드되면 iframe을 생성하고 인쇄를 트리거합니다.

이 함수는 iframe을 파괴하지 않습니다. 대신 함수가 호출 될 때마다 다시 사용합니다. 인쇄가 완료 될 때까지 필요하고 인쇄 메서드에는 콜백 지원이 없기 때문에 iframe을 파괴하기가 어렵습니다 (내가 아는 한).

printPdf = function (url) {
  var iframe = this._printIframe;
  if (!this._printIframe) {
    iframe = this._printIframe = document.createElement('iframe');
    document.body.appendChild(iframe);

    iframe.style.display = 'none';
    iframe.onload = function() {
      setTimeout(function() {
        iframe.focus();
        iframe.contentWindow.print();
      }, 1);
    };
  }

  iframe.src = url;
}

3
큰 문제를 해결할 수 있도록 도와 주신 여러분 께 감사드립니다. 없이는 setTimeout인쇄 기능이 때때로 실패 할 것입니다. 왜 그런지 모르고 누군가가 그것을 알기를 바랍니다.
— Evan Hu

print 메서드는 콜백을 지원하지만 2014 년에이 답변을 작성할 때는 아직 널리 지원되지 않았습니다.하지만 지금은 그렇습니다. 모든 주요 데스크탑 브라우저의 최신 버전은 onafterprint. iframe을 재사용하면 누군가가 두 개의 버튼을 빠르게 클릭하고 첫 번째 인쇄 대화 상자가 나타나기 전에 iframe URL이 이미 교체 되었기 때문에 두 번째 PDF를 두 번 인쇄하는 경합 상태가 발생할 수 있다는 점이 약간 걱정됩니다.
— Mark Amery

18

http://printjs.crabbly.com/ 에서 Print.js를 다운로드 하십시오.

$http({
    url: "",
    method: "GET",
    headers: {
        "Content-type": "application/pdf"
    },
    responseType: "arraybuffer"
}).success(function (data, status, headers, config) {
    var pdfFile = new Blob([data], {
        type: "application/pdf"
    });
    var pdfUrl = URL.createObjectURL(pdfFile);
    //window.open(pdfUrl);
    printJS(pdfUrl);
    //var printwWindow = $window.open(pdfUrl);
    //printwWindow.print();
}).error(function (data, status, headers, config) {
    alert("Sorry, something went wrong")
});

4
IE, Edge 또는 Firefox에서 PDF를 인쇄하지 않습니다.
— Richard Collette 2018 년

오늘 jQuery를 사용하여 서버에서 pdf의 바이트를 가져온 다음 위와 같이 blob 및 'createOvjectURL'을 생성했습니다. 이 경우 PrintJS는 인쇄 대화 상자를 표시하지 않습니다. :)
— woohoo

한 번의 클릭으로 여러 pdf 파일을 인쇄 할 수 있습니까?
— Sunil Garg

12

https://github.com/mozilla/pdf.js/

라이브 데모 http://mozilla.github.io/pdf.js/

아마도 여러분이 원하는 것일 수도 있지만, 최신 브라우저에는 이러한 기능이 포함되어 있기 때문에 요점을 알 수 없습니다. 또한 자체 최적화 된 플러그인과 앱이있는 모바일 장치와 같은 저전력 장치에서도 매우 느리게 실행됩니다. .


80메가바이트 같은 +, 큰 문서를 인쇄 할 때 Pdf.js은 대단히 느린도
— 루돌프 Dvoracek

6

이 기능을 사용하여 서버에서 pdf 스트림을 다운로드했습니다.

function printPdf(url) {
        var iframe = document.createElement('iframe');
        // iframe.id = 'pdfIframe'
        iframe.className='pdfIframe'
        document.body.appendChild(iframe);
        iframe.style.display = 'none';
        iframe.onload = function () {
            setTimeout(function () {
                iframe.focus();
                iframe.contentWindow.print();
                URL.revokeObjectURL(url)
                // document.body.removeChild(iframe)
            }, 1);
        };
        iframe.src = url;
        // URL.revokeObjectURL(url)
    }

5

base64 문자열에서 pdf를 인쇄하기위한 크로스 브라우저 솔루션 :

  • Chrome : 인쇄 창이 열립니다.
  • FF : pdf가있는 새 탭이 열립니다.
  • IE11 : 열기 / 저장 프롬프트가 열립니다.

.

const blobPdfFromBase64String = base64String => {
   const byteArray = Uint8Array.from(
     atob(base64String)
       .split('')
       .map(char => char.charCodeAt(0))
   );
  return new Blob([byteArray], { type: 'application/pdf' });
};

const isIE11 = !!(window.navigator && window.navigator.msSaveOrOpenBlob); // or however you want to check it

const printPDF = blob => {
   try {
     isIE11
       ? window.navigator.msSaveOrOpenBlob(blob, 'documents.pdf')
       : printJS(URL.createObjectURL(blob)); // http://printjs.crabbly.com/
   } catch (e) {
     throw PDFError;
   }
};

printPDF(blobPdfFromBase64String(base64String))

보너스-IE11의 새 탭에서 Blob 파일 열기

서버에서 base64 문자열의 일부 전처리를 수행 할 수 있다면 일부 URL 아래에 노출하고 링크를 사용할 수 있습니다. printJS:)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.