Pdf.js: Kesalahan: Izin ditolak untuk mengakses properti 'print'

Dibuat pada 23 Nov 2018  ·  39Komentar  ·  Sumber: mozilla/pdf.js

Konfigurasi:

  • Browser web dan versinya: semua versi Firefox sejak PDF.js disertakan (5+ tahun)
  • Sistem operasi dan versinya: semua
  • Versi PDF.js: semua
  • Apakah ekstensi browser: n / a

Langkah-langkah untuk mereproduksi masalah:

  1. https://bugzilla.mozilla.org/show_bug.cgi?id=911444

Apa perilaku yang diharapkan?
Bahwa PDF dapat mencetak seperti di setiap browser selain Firefox

Apa yang salah?
Error: Permission denied to access property 'print'

Harap perbaiki ini karena solusi cetak universal PDF di browser telah rusak selama 5 tahun di Firefox sejak pdf.js disertakan di Firefox.

Komunitas pengembang web memiliki ratusan solusi buruk untuk ini, karena satu proyek, pdf.js.

4-printing

Komentar yang paling membantu

@dotnetCarpenter intinya adalah, lebih dari setahun yang lalu, salah satu pengembang mengeluh bahwa semua komentar +1 mempersulit untuk melihat diskusi teknis dan oleh karena itu lebih sulit untuk menyelesaikan bug. Seolah itu sebabnya sudah terbuka selama lebih dari 6 tahun dan terus bertambah. Tanpa sistem pemungutan suara, komentar semacam itu sekarang menjadi SATU-SATUNYA cara untuk menarik perhatian pada suatu masalah, jadi saya tidak melihat alternatif lain.

Semua 39 komentar

Mirip dengan https://github.com/mozilla/pdf.js/issues/5397 , tetapi tidak masalah jika Anda menggunakan iframe atau tidak.

Masalah yang sama jika menggunakan <object>

<object type="application/pdf"
    data="/media/examples/In-CC0.pdf"
    width="250"
    height="200">
</object>

Langkah-langkah untuk mereproduksi masalah:

1. https://bugzilla.mozilla.org/show_bug.cgi?id=911444#c53

Mengapa membuka masalah duplikat di sini, padahal ini sudah terlacak dengan jelas di Bugzilla !?
Terutama karena ini bahkan bukan bug di pustaka (umum) PDF.js itu sendiri, tetapi lebih merupakan batasan di browser Firefox (seperti yang dijelaskan dalam bug yang ditautkan, dan perbaikan tidak akan terjadi di repositori ini).

@Snuffleupagus Karena bug Firefox dilaporkan 5 tahun yang lalu dan akar penyebabnya adalah pdf.js dan bukan Firefox. Tidak ada pengembang Firefox yang menyentuh ini dan saya telah mengalami masalah ini beberapa kali dan ini hanya dapat diselesaikan dengan mengubah pdf.js bukan Firefox.

Untuk memperjelas, cara kerja pdf.js adalah bahwa pencetakan dokumen normal (15+ tahun), print() , dalam hal ini PDF, menampilkan kesalahan ketika pdf.js digunakan, yang merupakan cara default untuk menampilkan PDF di Firefox selama 5 tahun terakhir.

Saya mungkin salah bahwa kesalahan sebenarnya adalah bagaimana pdf.js disematkan ke Firefox. Tapi saya berasumsi bahwa pdf.js bisa lebih mudah mendengarkan print() dan menggunakan logika internalnya untuk mencetak dokumen PDF.

window.onbeforeprint = function() {
    console.log('This will be called before the user prints.');
};
window.onafterprint = function() {
    console.log('This will be called after the user prints');   
};

Seharusnya berfungsi sejak Firefox 6

window.matchMedia('print') mungkin tidak akan berfungsi karena bug https://bugzilla.mozilla.org/show_bug.cgi?id=774398 tidak ditandai sebagai diperbaiki atau diselesaikan.

Ini adalah duplikat dari # 5397 - akar penyebab masalahnya adalah pdf.js disematkan ke dalam dokumen dengan prinsip keamanan " resource: //pdf.js ". Ini berbeda dari prinsip penyematan, jadi kebijakan asal yang sama memblokir akses ke properti cetak dan lainnya. Tidak masalah jika itu disematkan dalam iframe atau objek.

@Snuffleupagus adalah bagian folder web dari bundel pdf.js yang disematkan di Firefox?
Satu-satunya logika pencetakan yang saya temukan ada di https://github.com/mozilla/pdf.js/blob/master/web/firefox_print_service.js

Masalah utama dengan # 5397 adalah bahwa ini setengah tentang mencetak saat menggunakan pdf.js dan setengahnya tentang cara mencetak dokumen di Firefox saat pdf.js merender dokumen, seperti pada tiket ini. @automatedbugreportingfacility Anda benar tetapi saya merasa ini memerlukan masalah baru karena # 5397 mengotori perairan.

Mengubah URI seharusnya terjadi di https://bugzilla.mozilla.org/show_bug.cgi?id=911444#c53 tetapi sebagai pengganti perbaikan di Firefox (belum terjadi dalam 5 tahun), solusinya adalah mendengarkan untuk acara beforeprint dan mulai mencetak melalui pdf.js. Jika beforeprint diblokir oleh Firefox, karena kebijakan keamanan yang sama, maka itu hanya dapat terjadi di Firefox.
Mungkin salah satu dari Anda dapat menjelaskan masalah ini?

pekerjaan selanjutnya adalah mendengarkan acara sebelum cetak dan mulai mencetak melalui pdf.js.

Bisakah Anda menjelaskan? Untuk acara beforeprint yang akan dikirim ke dokumen pdf.js yang disematkan, Anda perlu memanggil print() dalam konteks jendela induk. Browser kemudian akan mencetak konten dari jendela induk. Anda tidak dapat "mulai mencetak" di event handler, karena sudah mulai mencetak dokumen induk.

Solusi potensial di sisi pdf.js adalah menerapkan penangan onmessage untuk memungkinkan pencetakan melalui pdfWindow.postMessage("print"); , tetapi saya tidak yakin apakah itu solusi yang diinginkan.

Solusi potensial di sisi pdf.js adalah dengan menerapkan penangan onmessage untuk memungkinkan pencetakan melalui pdfWindow.postMessage ("print") ;, tetapi saya tidak yakin apakah itu solusi yang diinginkan.

@automatedbugreportingfacility uf, tidak, itu sama sekali tidak diinginkan. Solusi sempurna adalah memiliki kesamaan DOM API dengan semua browser lain, di mana Anda dapat menggunakan .print() pada wadah dokumen PDF.

Saya tidak membuat masalah ini karena saya menggunakan pdf.js tetapi karena Firefox menggunakan pdf.js dan print() tidak berfungsi sejak pdf.js menjadi standar untuk merender PDF di Firefox.

Saya akan senang jika ini diperbaiki di Firefox dan bukan pdf.js atau sebaliknya - saya akan senang 😃

[...] maka itu hanya dapat terjadi di Firefox.
Mungkin salah satu dari Anda dapat menjelaskan masalah ini?

Saya sudah menyatakan di https://github.com/mozilla/pdf.js/issues/10290#issuecomment -441132851 bahwa itu tidak relevan dengan repositori ini , dan https://github.com/mozilla/pdf.js/issues/ 10290 # Issuecomment -441202543 menguraikan (secara rinci) mengapa demikian. Sekali lagi, harap diperhatikan bahwa tidak perlu / diinginkan untuk membuka masalah duplikat.

Bahkan untuk menyentuh .print tanpa adanya kesalahan keamanan, diperlukan perbaikan untuk situasi resource://pdf.js saya jelaskan di atas, dan ini akan dilakukan di Firefox. Kami dapat menutup masalah ini karena tidak ada pekerjaan pdf.js yang harus dilakukan di sini, dan bug upstream dicerminkan di # 5397.

@Snuffleupagus dan @automatedbugreportingfacility hanya untuk memastikan saya mengerti apa yang Anda katakan.

Tidak ada cara untuk membuat kebijakan keamanan Firefox yang dapat mengatasi masalah di pdf.js, ketika print() dipanggil.

Apakah yang di atas benar?

Ya, Anda tidak dapat membuat lubang dalam mekanisme keamanan browser. Menyematkan pdf.js dalam dokumen semi-hak istimewa adalah kesalahan besar sejak awal, tetapi tidak ada jalan untuk mundur, dan sayangnya Mozilla lebih suka menghabiskan uang untuk hal-hal singkat seperti "Project Mortar". Tapi saya ngelantur.

Eksperimen Mortar telah selesai. Mozilla tidak menganggap kasus penggunaan PDF membenarkan beban penerapan dan pemeliharaan PDFium dan implementasi API Pepper di Gecko.

Setidaknya Motar dihentikan .

Masalah ini pasti bisa ditutup tapi sebelum saya (Anda) melakukannya, karena saya punya 2 ahli pdf.js di sini, saya punya dua pertanyaan yang mungkin bisa membantu https://bugzilla.mozilla.org/show_bug.cgi?id=911444 bersama ke arah yang benar.

  1. Bagaimana pdf.js harus disematkan di Firefox, jika bukan sebagai dokumen khusus (_resource: // protocol_)?
  2. Apa tata letak cetak kertas ketika Firefox mencetak pdf.js, bilah alat, dll?

Menyematkan pdf.js dalam dokumen semi-hak istimewa adalah kesalahan besar sejak awal, tetapi tidak ada jalan untuk mundur

@automatedbugreportingfacility Mengapa keputusan ini tidak dapat diubah?

Tidak bisakah Anda membuat dokumen kosong baru dengan pdf.js dan asal yang sama dengan jendela induk dan memberi makan file PDF ke pdf.js?

<iframe id="pdf" src="some-same-origin.pdf"></iframe>
<script>
  document.getElementById('pdf').print()
</script>

Poin bonus, jika pdf.js mendengarkan beforeprint , batalkan acara dan cetak <canvas> (dokumen PDF) dan jangan biarkan FIrefox mencetak UI pdf.js.

Saya membayangkan, jika pdf.js disematkan sebagai dokumen biasa, Anda akan dapat mendengarkan jendela induk.

window.opener.addEventListener('beforeprint', event => {
  event.preventDefault()

  window.print() // pdf.js overrides the native print function already
})

Atau ubah pdf.js menjadi:

let print = (window.opener || window).print;
window.print = function print() {
  if (activeService) {
    console.warn('Ignored window.print() because of a pending print job.');
    return;
  }
  ...

Setelah dipikir-pikir, ini berarti pdf.js akan menelan cetakan dari induknya yang bukan yang kita inginkan.

Sebenarnya pdf.js sudah melakukan hal yang benar. Kami hanya perlu firefox untuk mengirimkan print() pada dokumen yang menyematkan pdf.js.

Kutipan dari _pdf_print_service.js_ (ditemukan di https://mozilla.github.io/pdf.js/web/viewer.html):

let print = window.print;
window.print = function print() {
  if (activeService) {
    console.warn('Ignored window.print() because of a pending print job.');
    return;
  }
  ensureOverlay().then(function() {
    if (activeService) {
      overlayManager.open('printServiceOverlay');
    }
  });

  try {
    dispatchEvent('beforeprint');
  } finally {
    if (!activeService) {
      console.error('Expected print service to be initialized.');
      ensureOverlay().then(function() {
        if (overlayManager.active === 'printServiceOverlay') {
          overlayManager.close('printServiceOverlay');
        }
      });
      return; // eslint-disable-line no-unsafe-finally
    }
    let activeServiceOnEntry = activeService;
    activeService.renderPages().then(function() {
      return activeServiceOnEntry.performPrint();
    }).catch(function() {
      // Ignore any error messages.
    }).then(function() {
      // aborts acts on the "active" print request, so we need to check
      // whether the print request (activeServiceOnEntry) is still active.
      // Without the check, an unrelated print request (created after aborting
      // this print request while the pages were being generated) would be
      // aborted.
      if (activeServiceOnEntry.active) {
        abort();
      }
    });
  }
};

function dispatchEvent(eventType) {
  let event = document.createEvent('CustomEvent');
  event.initCustomEvent(eventType, false, false, 'custom');
  window.dispatchEvent(event);
}

function abort() {
  if (activeService) {
    activeService.destroy();
    dispatchEvent('afterprint');
  }
}

@Ugoku dan @jtraulle Harap https://bugzilla.mozilla.org/show_bug.cgi?id=911444 agar dapat diketahui oleh para pengembang Firefox.

Terima kasih @dotnetCarpenter , saya telah memilih Bugzilla 🐞

Punya masalah yang sama menggunakan firefox. Memecahkannya termasuk pdf ke dalam iframe seperti ini (kuncinya adalah cara pdf ditautkan):

`$ (". div_class "). html ('