সরাসরি জাভাস্ক্রিপ্ট থেকে পিডিএফ প্রিন্ট করুন


94

আমি এইচটিএমএলে পিডিএফগুলির একটি তালিকা তৈরি করছি। তালিকায় আমি একটি ডাউনলোড লিঙ্ক এবং একটি মুদ্রণ বোতাম / লিঙ্ক অন্তর্ভুক্ত করতে চাই। ব্যবহারকারী পিডিএফ না দেখে বা পিডিএফ ভিউয়ার না খোলার জন্য পিডিএফটির জন্য সরাসরি মুদ্রণ ডায়ালগ খোলার কোনও উপায় আছে?

কোনও লুকানো ইফ্রামে পিডিএফ ডাউনলোড করার এবং জাভাস্ক্রিপ্ট দিয়ে মুদ্রণের জন্য এটি ট্রিগার করার কিছু প্রকরণ?

উত্তর:


57

নীচের মন্তব্যের ভিত্তিতে, এটি আর আধুনিক ব্রাউজারগুলিতে আর কাজ করে না
এই প্রশ্নটি আপনার পক্ষে সহায়ক হতে পারে এমন একটি দৃষ্টিভঙ্গি প্রদর্শন করে: নীরব একটি এম্বেড এমডিএফডি প্রিন্ট করুন

এটি <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();
    }
}

আপনি একটি নিখরচায় অভিজ্ঞতা দিয়ে কোনও লুকানো ইফ্রেমে এম্বেড স্থাপন করতে এবং সেখান থেকে এটি মুদ্রণ করতে পারেন।


4
এই সমাধানটি কাজ করে না ... আমি ক্রোম, এফএফ
ব্যবহারকারী 1428716

8
এম্বেড করা ডকুমেন্টটি অন্য কোনও ডোমেনে থাকলে এটি কাজ করবে না।
nullability

4
যখন রেন্ডার করা হয় তখন মুদ্রণের জন্য পিডিএফ-তে কেবল জাভাস্ক্রিপ্ট যুক্ত করা সহজ। গুগল ডক্স এটি করে। এইভাবে হয় ব্রাউজারটি এটি লোড করে এবং মুদ্রণ করে, বা অ্যাডোব প্লাগইন।
রাহলি

4
আপনি সম্ভবত এটি গুগল করতে পারেন, তবে এটি হ'ল পিডিএফ-তে যুক্ত হওয়া একটি নতুন স্ক্রিপ্ট অবজেক্ট, যেখানে জাভাস্ক্রিপ্টটি কেবল "উইন্ডো.প্রিন্ট ()"
রাহলি

6
হ্যাঁ, আমি মুদ্রণ () পদ্ধতিটি সংজ্ঞায়িত যেখানে সমস্ত ব্রাউজারগুলিতে সমস্যাটি রয়েছে। এই পদ্ধতি কি পুরানো? অন্য কোন সমাধান আছে?
জ্যাকব এনসোর

40

একটি 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;
}

4
আমি আপনাকে ধন্যবাদ জানাই, যেমন আপনি আমাকে একটি বড় সমস্যার সমাধান করতে সহায়তা করেছেন: ছাড়া setTimeout, মুদ্রণ ফাংশন কখনও কখনও ব্যর্থ হয়। কেন এবং আশা করি কেউ এটি খুঁজে পাবেন।
ইভান হু

মুদ্রণ পদ্ধতিটিতে কলব্যাক সমর্থন রয়েছে তবে আপনি 2014 সালে এই উত্তরটি লেখার সময় এটি ব্যাপকভাবে সমর্থিত হয়নি; এটি এখন, যদিও; সমস্ত বড় ডেস্কটপ ব্রাউজার সমর্থন করে onafterprint। আমি কিছুটা উদ্বিগ্ন যে কোনও আইফ্রেমে পুনরায় ব্যবহার করা জাতিগুলির শর্তগুলির পরিচয় দিতে পারে যেখানে কেউ দ্রুত দুটি বোতামে ক্লিক করে দ্বিতীয় পিডিএফ প্রিন্ট করে শেষ করে দেয় কারণ ইফ্রামের ইউআরএল ইতিমধ্যে প্রথম মুদ্রণ ডায়ালগটি উপস্থিত হওয়ার আগেই মুছে ফেলা হয়েছিল।
এমেরি

18

থেকে Print.js ডাউনলোড http://printjs.crabbly.com/

$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
আইই, এজ বা ফায়ারফক্সে পিডিএফ প্রিন্ট করে না।
রিচার্ড কললেট

সার্ভার থেকে পিডিএফ-এর বাইট পেতে jQuery get ব্যবহার করে আজকে চেষ্টা করে দেখুন, তারপরে ব্লবটি তৈরি করুন এবং উপরের মতো 'createOvjectURL' তৈরি করুন। এই ক্ষেত্রে প্রিন্ট জেএস মুদ্রণ ডায়ালগটি দেখায় না। :)
ওহাহু

আমি একক ক্লিকে একাধিক পিডিএফ ফাইল মুদ্রণ করতে পারি?
সুনীল গার্গ

12

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

একটি লাইভ ডেমো জন্য http://mozilla.github.io/pdf.js/

এটি সম্ভবত আপনি যা চান তা কিন্তু আমি দেখতে পেলাম না যেহেতু আধুনিক ব্রাউজারগুলিতে এই জাতীয় কার্যকারিতা অন্তর্ভুক্ত রয়েছে, এটি মোবাইল ডিভাইসের মতো স্বল্প-শক্তিযুক্ত ডিভাইসগুলিতে মারাত্মক ধীর গতিতে চলবে যা উপায়গুলি দ্বারা তাদের নিজস্ব অনুকূলিত প্লাগইন এবং অ্যাপ্লিকেশন রয়েছে ।


80 এমবি + এর মতো বড় ডকুমেন্টগুলি প্রিন্ট করার সময় পিডিএফ.জেএস খুব মারাত্মক ধীর হয়
রুডল্ফ

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

5

বেস 64 স্ট্রিং থেকে পিডিএফ প্রিন্ট করার জন্য ক্রস ব্রাউজার সমাধান:

  • ক্রোম: মুদ্রণ উইন্ডো খোলা আছে
  • এফএফ: পিডিএফ সহ নতুন ট্যাব খোলা আছে
  • আইই ১১: ওপেন / সেভ প্রম্পট খোলা আছে

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

বোনাস - আইইডির জন্য নতুন ট্যাবে ব্লব ফাইলটি খোলার জন্য

আপনি যদি সার্ভারে বেস 64 স্ট্রিংটির কিছু প্রিপ্রোসেসিং করতে সক্ষম হন তবে আপনি এটি কিছু url এর অধীনে প্রকাশ করতে পারেন এবং লিঙ্কটি এতে ব্যবহার করতে পারেন printJS:)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.