Konfigurasi:
Langkah-langkah untuk mereproduksi masalah:
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.
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.
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 (' ');
$ ('# frame_id')
.attr ("src", "path_to / PDFJS / web / viewer.html? file = path_to / file.pdf")
.on ("load", function () {
setTimeout (printWhenReady, 3000);
});
}
function printWhenReady () {
document.getElementById (frame_id) .contentWindow.print ();
} `
Mengapa ini dibuka kembali, padahal telah dinyatakan berulang kali bahwa itu adalah duplikat dari https://bugzilla.mozilla.org/show_bug.cgi?id=911444 dan bukan sesuatu yang dapat diperbaiki dalam repositori ini !?
@timvandermeij Bisakah Anda menutup masalah ini?
Saya membukanya kembali sehingga dapat dilihat oleh ribuan pengembang web itu
akhirnya mengalami masalah ini. Itu membuatnya mudah untuk melihat dan membimbing orang
untuk masalah bugzilla. Saya pikir itu lebih baik daripada terus mendapatkan duplikat
tapi saya mundur.
Pada Sel, 8 Jan 2019 pukul 23.21 Tim van der Meij notifications@github.com
menulis:
Tutup # 10290 https://github.com/mozilla/pdf.js/issues/10290 .
-
Anda menerima ini karena Anda mengubah status buka / tutup.
Balas email ini secara langsung, lihat di GitHub
https://github.com/mozilla/pdf.js/issues/10290#event-2061484528 , atau nonaktifkan
utasnya
https://github.com/notifications/unsubscribe-auth/AACq8wR4vNFtCtaUI-VRshKnQyDCQoZVks5vBRoGgaJpZM4Yv9So
.
Punya masalah yang sama menggunakan firefox. Memecahkannya termasuk pdf ke dalam iframe seperti ini (kuncinya adalah cara pdf ditautkan):
`$ (". div_class "). html (' ');
$ ('# frame_id')
.attr ("src", "path_to / PDFJS / web / viewer.html? file = path_to / file.pdf")
.on ("load", function () {
setTimeout (printWhenReady, 3000);
});
}function printWhenReady () {
document.getElementById (frame_id) .contentWindow.print ();
} `
tidak, masih kesalahan SecurityError: Permission denied to access property "print" on cross-origin object
di konsol firefox
Punya masalah yang sama menggunakan firefox. Memecahkannya termasuk pdf ke dalam iframe seperti ini (kuncinya adalah cara pdf ditautkan):
$(".div_class").html('<iframe id="frame_id"></iframe>'); $('#frame_id') .attr("src", "path_to/PDFJS/web/viewer.html?file=path_to/file.pdf") .on("load", function(){ setTimeout(printWhenReady, 3000); }); } function printWhenReady(){ document.getElementById(frame_id).contentWindow.print(); }
tidak, masih kesalahan
SecurityError: Permission denied to access property "print" on cross-origin object
di konsol firefox
@shmilyoo Tolong bagaimana Anda mendapatkan path ke PDFjs ??
Masalahnya adalah penontonnya. Penampil tersemat menyebabkan masalah lintas sumber. Coba buat penampil Anda sendiri. Itu akan menyelesaikan masalah. misalnya dari sini: https://pspdfkit.com/blog/2019/implement-pdf-viewer-pdf-js/
Atau jika Anda membutuhkan penampil berfitur lengkap, Anda dapat menggunakan Mozilla dari sini: http://mozilla.github.io/pdf.js/web/viewer.html (untuk yang satu ini Anda perlu mengunduh pdf terbaru. js dan pdf.worker.js). Saya hanya melakukan itu untuk sebuah proyek di tempat kerja, dan itu bekerja seperti pesona.
@vaspervnp Jika saya boleh bertanya, apakah Anda dapat memanggil fungsi cetak secara terprogram?
@vaspervnp Ironisnya, itu adalah penampil Mozilla yang persis sama yang disematkan di Firefox !
Kami sangat membutuhkan seseorang untuk mengubah cara pdf.js disematkan di Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=911444#c58
@vaspervnp Jika saya boleh bertanya, apakah Anda dapat memanggil fungsi cetak secara terprogram?
Ya saya.
@vaspervnp alangkah baiknya jika Anda dapat memberikan sedikit potongan kode tentang bagaimana Anda melakukannya.
@id
Saya tidak menulis kode tambahan. Saya baru saja memasukkan javascript dan penampil dari sini: http://mozilla.github.io/pdf.js/web/viewer.html Kemudian, saat menggunakan penampil seperti cara yang disematkan digunakan, itu langsung berfungsi.
Apakah Anda memerlukan hak khusus untuk memilih bugzilla? Saya tidak melihat opsi itu di mana pun.
@ mdodge-ecgrow sepertinya bugzilla menghapus fitur pemungutan suara saat mereka membuat desain ulang. Saya tidak yakin bagaimana kita bisa mendapatkan perhatian pengembang firefox sekarang ...
@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.
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.