जावास्क्रिप्ट से सीधे पीडीएफ प्रिंट करें


93

मैं HTML में PDF की सूची बना रहा हूं। सूची में मैं एक डाउनलोड लिंक और एक प्रिंट बटन / लिंक शामिल करना चाहूंगा। क्या पीडीएफ को देखने या पीडीएफ दर्शक खोलने के बिना पीडीएफ के लिए प्रिंट संवाद को सीधे खोलने का कोई तरीका है?

एक छिपे हुए आइफ्रेम में पीडीएफ को डाउनलोड करने और जावास्क्रिप्ट के साथ प्रिंट करने के लिए ट्रिगर करने के कुछ बदलाव?

जवाबों:


56

नीचे टिप्पणियों के आधार पर, यह अब आधुनिक ब्राउज़रों में काम नहीं करता है।
यह प्रश्न एक दृष्टिकोण को दर्शाता है जो आपके लिए उपयोगी हो सकता है: एक एम्बेडेड पीडीएफ को साइलेंट प्रिंट करें

यह <embed>दस्तावेज़ में पीडीएफ को एम्बेड करने के लिए टैग का उपयोग करता है :

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

फिर आप .print()पीडीएफ लोड होने पर जावास्क्रिप्ट में तत्व को विधि कहते हैं :

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
यह समाधान काम नहीं करता है ... मुझे Chrome, FF
user1428716

8
यदि एम्बेडेड दस्तावेज़ किसी अन्य डोमेन पर है तो यह काम नहीं करेगा।
nullability

5
प्रदान करने के लिए प्रिंट करने के लिए बस जावास्क्रिप्ट को पीडीएफ में जोड़ना आसान है। Google डॉक्स यही करता है। इस तरह या तो ब्राउज़र लोड होता है और इसे प्रिंट करता है, या एडोब प्लगइन।
रहली

2
आप शायद इसे Google कर सकते हैं, लेकिन यह सब है, पीडीएफ में जोड़ी गई एक नई स्क्रिप्ट ऑब्जेक्ट है, जहां जावास्क्रिप्ट सिर्फ "window.print ()" है
Rahly

6
हाँ, मैं उन सभी ब्राउज़रों पर समस्या रख रहा हूँ जहाँ प्रिंट () विधि अपरिभाषित है। क्या यह तरीका पुराना है? क्या कोई और उपाय है?
याकूब एंसर

38

यहां एक iframe से एक पीडीएफ प्रिंट करने के लिए एक फ़ंक्शन है।

आपको फ़ंक्शन के लिए बस पीडीएफ के URL को पास करना होगा। पीडीएफ लोड होते ही यह एक आइफ्रेम और ट्रिगर प्रिंट तैयार करेगा।

ध्यान दें कि फ़ंक्शन 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, प्रिंट फ़ंक्शन कभी-कभी विफल हो जाएगा। पता नहीं क्यों और उम्मीद है कि कोई इसे ढूंढ लेगा।
इवान हू

प्रिंट पद्धति में कॉलबैक समर्थन है, लेकिन 2014 में जब आपने यह उत्तर लिखा था, तब यह व्यापक रूप से समर्थित नहीं था। यह अब, हालांकि है; सभी प्रमुख डेस्कटॉप ब्राउज़रों के नवीनतम संस्करण समर्थन करते हैं onafterprint। मैं थोड़ा चिंतित हूं कि एक iframe का पुन: उपयोग करने से दौड़ की स्थिति शुरू हो सकती है जहां कोई व्यक्ति दो बटनों पर जल्दी से क्लिक करता है और दूसरी पीडीएफ को दो बार प्रिंट करता है, क्योंकि पहले प्रिंट संवाद दिखाई देने से पहले iframe URL पहले ही स्वैप हो गया था।
मार्क अमेरी

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")
});

3
IE, एज या फ़ायरफ़ॉक्स पर पीडीएफ प्रिंट नहीं करता है।
रिचर्ड कोलेट

आज कोशिश की कि सर्वर से पीडीएफ के बाइट्स प्राप्त करने के लिए jQuery का उपयोग करें, फिर ऊपर के रूप में बूँद और 'createOvjectURL' बनाएं। PrintJS इस मामले में प्रिंट संवाद नहीं दिखाता है। :)
woohoo

क्या मैं एक क्लिक के साथ कई पीडीएफ फाइलें प्रिंट कर सकता हूं?
सुनील गर्ग

12

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

लाइव डेमो के लिए http://mozilla.github.io/pdf.js/

यह शायद आप क्या चाहते हैं, लेकिन मैं इसके बारे में नहीं देख सकता क्योंकि आधुनिक ब्राउज़रों में ऐसी कार्यक्षमता शामिल है, यह भी मोबाइल उपकरणों जैसे कम-शक्ति वाले उपकरणों पर बहुत धीमी गति से चलेगा, वैसे, अपने स्वयं के अनुकूलित प्लगइन्स और एप्लिकेशन हैं ।


Pdf.js भी बहुत धीमी गति से जब बड़ा दस्तावेजों मुद्रण, 80MB की तरह + है
रुडोल्फ Dvoracek

6

मैंने सर्वर से पीडीएफ स्ट्रीम डाउनलोड करने के लिए इस फ़ंक्शन का उपयोग किया।

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)
    }

4

बेस64 स्ट्रिंग से पीडीएफ को प्रिंट करने के लिए क्रॉस ब्राउज़र समाधान:

  • क्रोम: प्रिंट विंडो खोली जाती है
  • FF: पीडीएफ के साथ नया टैब खोला गया है
  • 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 के लिए नए टैब में खुलने वाली बूँद फ़ाइल

यदि आप सर्वर पर बेस 64 स्ट्रिंग के कुछ प्रीप्रोसेसिंग करने में सक्षम हैं, तो आप इसे कुछ यूआरएल के तहत उजागर कर सकते हैं और लिंक का उपयोग कर सकते हैं printJS:)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.