Pdf.js: خطأ: تم رفض الإذن للوصول إلى الخاصية "طباعة"

تم إنشاؤها على ٢٣ نوفمبر ٢٠١٨  ·  39تعليقات  ·  مصدر: mozilla/pdf.js

ترتيب:

  • مستعرض الويب وإصداره: جميع إصدارات Firefox منذ تضمين PDF.js (أكثر من 5 سنوات)
  • نظام التشغيل ونسخته: الكل
  • إصدار PDF.js: الكل
  • امتداد المتصفح: n / a

خطوات إعادة إظهار المشكلة:

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

ما هو السلوك المتوقع؟
يمكن طباعة ملف PDF كما هو الحال في أي متصفح آخر غير Firefox

ماذا حصل؟
Error: Permission denied to access property 'print'

الرجاء إصلاح هذا لأن الانتقال إلى حل الطباعة الشامل لملفات PDF في المتصفح قد تم تعطيله لمدة 5 سنوات في Firefox منذ أن تم تضمين ملف pdf.js في Firefox.

مجتمع مطوري الويب لديه مئات الحلول السيئة لهذا ، بسبب مشروع واحد ، pdf.js.

4-printing

التعليق الأكثر فائدة

dotnetCarpenter إن يميز الكعكة هو أنه منذ أكثر من عام ، اشتكى أحد المطورين من أن جميع تعليقات +1 تجعل من الصعب رؤية المناقشة الفنية وبالتالي يصعب حل الخطأ. كما لو أن هذا هو السبب في أنها كانت مفتوحة لأكثر من 6 سنوات وما زالت مستمرة. بدون نظام التصويت ، فإن هذه التعليقات هي الآن الطريقة الوحيدة للفت الانتباه إلى قضية ما ، لذلك لا أرى بديلاً.

ال 39 كومينتر

مشابه لـ https://github.com/mozilla/pdf.js/issues/5397 ، لكن لا يهم إذا كنت تستخدم iframe أم لا.

نفس المشكلة في حالة استخدام <object>

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

خطوات إعادة إظهار المشكلة:

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

لماذا تفتح مشكلة مكررة هنا ، بينما من الواضح أن هذا تم تتبعه بالفعل في Bugzilla !؟
خاصة وأن هذا ليس خطأ في مكتبة PDF.js (العامة) نفسها ، بل هو قيد في متصفح Firefox (كما هو موضح في الخطأ المرتبط ، وبالتالي لن يحدث الإصلاح في هذا المستودع على أي حال).

Snuffleupagus لأنه تم الإبلاغ عن خطأ Firefox منذ 5 سنوات والسبب الرئيسي هو pdf.js وليس Firefox. لم يلمس أي من مطوري Firefox هذا الأمر وقد اصطدمت بهذه المشكلة عدة مرات ولا يمكن حلها إلا عن طريق تغيير pdf.js وليس Firefox.

للتوضيح ، فإن الطريقة التي يعمل بها pdf.js هي أن الطباعة العادية ( print() ، في هذه الحالة ملف PDF ، تؤدي إلى حدوث خطأ عند استخدام pdf.js ، وهو الطريقة الافتراضية لعرض ملف PDF في Firefox خلال السنوات الخمس الماضية.

قد أكون مخطئًا في أن الخطأ هو حقًا كيفية تضمين pdf.js في Firefox. لكنني أفترض أن pdf.js يمكنه الاستماع بسهولة أكبر إلى print() واستخدام منطقه الداخلي لطباعة مستند 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');   
};

يجب أن يعمل منذ Firefox 6

window.matchMedia('print') على الأرجح لأن الخطأ https://bugzilla.mozilla.org/show_bug.cgi؟id=774398 لم يتم تمييزه على أنه تم إصلاحه أو حله.

هذه نسخة مكررة من # 5397 - السبب الجذري للمشكلة هو أن pdf.js مضمن في مستند بمبدأ أمان "

Snuffleupagus هل مجلد الويب جزء من حزمة pdf.js المضمنة في Firefox؟
منطق الطباعة الوحيد الذي وجدته موجود في https://github.com/mozilla/pdf.js/blob/master/web/firefox_print_service.js

المشكلة الرئيسية في # 5397 هي أن نصفها يتعلق بالطباعة عند استخدام pdf.js والنصف الآخر يتعلق بكيفية طباعة مستند في Firefox عندما يعرض pdf.js المستند ، كما في هذه البطاقة. automatedbugreportingfacility أنت على حق لكنني شعرت أن هذا يتطلب مشكلة جديدة لأن # 5397 يعكر المياه.

يجب أن يتم تغيير URI في https://bugzilla.mozilla.org/show_bug.cgi؟id=911444#c53 ولكن بدلاً من الإصلاح في Firefox (لم يحدث منذ 5 سنوات) ، سيكون الحل هو الاستماع للحدث beforeprint وابدأ الطباعة عبر pdf.js. إذا تم حظر beforeprint بواسطة Firefox ، بسبب سياسة الأمان من نفس المصدر ، فيمكن أن يحدث ذلك فقط في Firefox.
ربما يستطيع أحدكم توضيح الأمر؟

سيكون الحل هو الاستماع إلى حدث قبل الطباعة والبدء في الطباعة عبر pdf.js.

يمكنك توضيح؟ لكي يتم إرسال الحدث beforeprint إلى مستند pdf.js مضمن ، تحتاج إلى استدعاء print() في سياق النافذة الرئيسية. سيقوم المتصفح بعد ذلك بطباعة محتويات النافذة الأصلية. لا يمكنك "بدء الطباعة" في معالج الحدث ، لأنه قد بدأ بالفعل في طباعة المستند الأصلي.

قد يكون الحل المحتمل على جانب pdf.js هو تنفيذ معالج onmessage للسماح بالطباعة من خلال pdfWindow.postMessage("print"); ، لكنني لست متأكدًا مما إذا كان هذا هو الحل المرغوب.

قد يكون الحل المحتمل على جانب pdf.js هو تنفيذ معالج onmessage للسماح بالطباعة من خلال pdfWindow.postMessage ("print") ؛ لكنني لست متأكدًا مما إذا كان هذا هو الحل المرغوب.

automatedbugreportingfacility uf ، لا هذا غير مرغوب فيه على الإطلاق. سيكون الحل الأمثل هو الحصول على تكافؤ DOM API مع جميع المتصفحات الأخرى ، حيث يمكنك استخدام .print() في حاوية مستندات PDF.

لم أقم بإنشاء هذه المشكلة لأنني أستخدم pdf.js ولكن لأن Firefox يستخدم pdf.js و print() لم يعمل منذ أن أصبح pdf.js هو المعيار لتقديم ملفات PDF في Firefox.

سأكون سعيدًا إذا تم إصلاح هذا في Firefox وليس pdf.js أو العكس - في كلتا الحالتين سأكون سعيدًا 😃

[...] يمكن أن يحدث ذلك فقط في Firefox.
ربما يستطيع أحدكم توضيح الأمر؟

أصرح بالفعل في https://github.com/mozilla/pdf.js/issues/10290#issuecomment -441132851 أنه لا علاقة له بهذا المستودع ، و https://github.com/mozilla/pdf.js/issues/ يوضح 10290 # issuecomment -441202543 (بشيء من التفصيل) سبب ذلك. مرة أخرى ، يرجى ملاحظة أنه ليس من الضروري / المرغوب فيه فتح مشكلات مكررة.

من أجل لمس .print بدون ظهور خطأ أمني ، يلزم إصلاح الوضع resource://pdf.js الذي وصفته أعلاه ، وسيتم ذلك في Firefox. يمكننا إغلاق هذه المشكلة نظرًا لعدم وجود عمل pdf.js للقيام به هنا ، وينعكس الخطأ الرئيسي في # 5397.

Snuffleupagus و automatedbugreportingfacility فقط للتأكد من أنني أفهم ما تقوله.

لا توجد طريقة لإنشاء سياسة أمان بديلة لفايرفوكس في pdf.js ، عند استدعاء print() .

هل ما ورد أعلاه صحيح؟

نعم ، لا يمكنك إحداث ثغرة في آليات أمان المتصفح. كان تضمين pdf.js في مستند شبه مميز خطأً كبيرًا في المقام الأول ، ولكن لا عودة إلى الوراء ، وتفضل Mozilla للأسف إنفاق الأموال على أشياء سريعة الزوال مثل "Project Mortar". لكني استطرادا.

انتهت تجربة الهاون. لا تعتبر Mozilla أن حالة استخدام PDF تبرر عبء تنفيذ وصيانة PDFium وتطبيق Pepper API في Gecko.

حسنًا ، على الأقل توقف Motar .

يمكن بالتأكيد إغلاق هذه المشكلة ولكن قبل أن أقوم (أنت) بذلك ، نظرًا لأنني حصلت على خبيرين في pdf.js هنا ، لدي سؤالان يمكن أن يساعدا https://bugzilla.mozilla.org/show_bug.cgi؟id=911444 على طول في الاتجاه الصحيح.

  1. كيف يجب تضمين pdf.js في Firefox ، إن لم يكن كمستند خاص (_resource: // protocol_)؟
  2. ما هو تخطيط الطباعة الورقية عندما يطبع Firefox ملفات pdf.js وأشرطة الأدوات وما إلى ذلك؟

كان تضمين pdf.js في مستند شبه مميز خطأً كبيرًا في المقام الأول ، لكن لا عودة إلى الوراء

automatedbugreportingfacility لماذا هذا القرار لا رجوع فيه؟

ألا يمكنك فقط إنشاء مستند فارغ جديد باستخدام pdf.js ونفس الأصل مثل النافذة الأصلية وإدخال ملف PDF إلى pdf.js؟

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

نقاط المكافأة ، إذا استمع pdf.js لـ beforeprint ، فقم بإلغاء الحدث وطباعة <canvas> (مستند PDF) وعدم السماح لـ FIrefox بطباعة واجهة مستخدم pdf.js.

أتخيل ، إذا تم تضمين pdf.js كمستند عادي ، فستتمكن من الاستماع إلى النافذة الأصلية.

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

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

أو قم بتغيير pdf.js إلى:

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

عند التفكير الثاني ، قد يعني هذا أن pdf.js سيبتلع مطبوعات من الوالد وهو ما لا نريده.

في الواقع ، يقوم pdf.js بالفعل بعمل الشيء الصحيح. نحتاج فقط إلى Firefox لإرسال print() على المستند الذي يتضمن pdf.js.

مقتطف من _pdf_print_service.js_ (موجود في 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 و jtraulle يرجى التصويت على https://bugzilla.mozilla.org/show_bug.cgi؟id=911444 للحصول عليه على الرادار لمطوري Firefox.

شكرًا dotnetCarpenter ، لقد قمت بالتصويت على Bugzilla 🐞

واجهت نفس المشكلة باستخدام Firefox. تم حلها بما في ذلك ملف pdf في إطار iframe مثل هذا (المفتاح هو الطريقة التي يتم بها ربط ملف pdf):

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