Pdf.js: رد الاتصال عند انتهاء عرض PDF؟

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

أحتاج إلى تقديم تدرج لوني لتغطية النصف السفلي من ملف PDF المعروض. أنا أعمل في صحيفة ونقوم بعمل تطبيق يعرض الصحيفة بإعلان تشويقي قبل الاشتراك.

تكمن المشكلة في أن التدرج اللوني يحتاج إلى أن يُطلى أعلى ملف PDF ، لذلك يجب أن ينتظر حتى ينتهي تجسيد ملف PDF. في الواقع ، على متصفحات الأجهزة المحمولة التي تحاول عرض التدرج قبل الانتهاء من ملف PDF ، ينتج عنها سلوك متوحش للغاية (يعيد عرض اللوحة القماشية ويومض في كل مرة يتم فيها تمرير الصفحة ولو قليلاً) مما يؤدي إلى عمليات إعادة طلاء ثابتة وسيظهر المحتوى رأسًا على عقب أحيانا.

بكل بساطة ، أحتاج إلى تشغيل رد اتصال عندما ينتهي ملف PDF من العرض.

يمكنك يا رفاق دعم الاسترجاعات؟ أو إرسال حدث عند الانتهاء من العرض؟

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

استخدام الحدث textlayerrendered يناسبني:

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

ال 17 كومينتر

لدينا حدث "عرض صفحة" أو وعد بإرجاع (). لا يعرض العارض العام جميع الصفحات مطلقًا ، لذلك لن يكون هذا قابلاً للإصلاح للمشاهد ، ما لم نقدم وضعًا لكائن PDFViewer عندما يعرض جميع الصفحات.

حسنًا ، من أي كائن يتم تشغيل حدث "مرتبط بالصفحات"؟ تضمين التغريدة

راجع https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.js#L225 ومثال على الاستخدام على https://github.com/mozilla/pdf.js/blob/master/web /viewer.js#L1733

يرجى ملاحظة أنه ليس لدينا واجهة برمجة تطبيقات للمشاهد. واجهة برمجة التطبيقات (API) التي أصدرناها فقط هي للعرض الأساسي والقماش (انظر src / display / api.js).

yurydelendik أنا أستخدم هذا مع قماش ، في المتصفح. أنا مرتبك نوعًا ما بشأن الأماكن الأخرى ذات الصلة بـ PDF JS. لقد أربكني ذلك على الفور ، لكن على أي حال ، يبدو أن لديك ما أبحث عنه. شكرا جزيلا!

إغلاق كما تم حلها.

أواجه مشكلة في التقاط هذا الحدث.

أستمع (Jquery) لحدث pagerendered كما هو موضح في المستندات أعلاه:

$(document).bind('pagerendered', function (e) {
    console.log('Page rendering complete.');
    //do stuff
});

وعرض ملف PDF على القماش:

PDFJS.getDocument('my_file.pdf').then(function(pdf) {
    pdf.getPage(1).then(function(page) {
        /* .. snip .. */
        var scaledViewport = page.getViewport(scale);
        var canvas = document.getElementById('the-canvas');
        var context = canvas.getContext('2d');
        canvas.height = scaledViewport.height;
        canvas.width = scaledViewport.width;
        var renderContext = {
            canvasContext : context,
            viewport : scaledViewport
        };
        page.render(renderContext);
});

تشغيل الحدث بنفسي يعمل بنجاح ، لذلك تم إعداد المستمع الخاص بي بشكل صحيح ، ويتم إرفاقه قبل وقت طويل من استدعاء page.render(renderContext) .

ربما أسأت فهم سبب الحدث. متى يجب بالضبط تشغيل الحدث pagerendered من المستند؟

تضمين التغريدة

إذا كنت لا تستخدم العارض العام ، فلن يتم تشغيل الحدث. آسف ، لا أفهم ما تطلب.

راجع https://github.com/mozilla/pdf.js/blob/master/examples/learning/prevnext.html#L76 لمعرفة كيفية انتظار انتهاء العرض. سيكون jQuery أقل فائدة هنا ، حاول أن تتعلم كيفية استخدام Promises.

yurydelendik أفهم الآن ، شكرًا جزيلاً على وقتك!

استخدام الحدث textlayerrendered يناسبني:

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

باستخدام المقتطف أعلاه ، يمكنك ببساطة القيام بما يلي:

page.render(renderContext).then(function() {
  console.log("FINISHED RENDERING!");
}, function() {
  console.log("ERROR");
});

brendandahl شكرا)

شكرا لك @ lucdetellis ! لقد كنت أحاول الحصول على زر خارجي للمشاهد لتشغيل وظيفة الطباعة ، لكنه لن يعمل أبدًا بسبب الخطأ المعطى. سمح لي استخدام الحل الخاص بك داخل دالة بتشغيل هذه الوظيفة من الإطار الأصلي ثم window.focus () و window.print () عند الانتهاء من العرض ، وتم حل المشكلة BAM .. كان يبحث في كل مكان عن حل لهذا الأمر :)

document.addEventListener('textlayerrendered', function (e) {
  if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
  }
}, true);

لم يدعوني ابدا ...

أنا أسميها هكذا (في النهاية viewer.js ):

document.addEventListener('textlayerrendered', function (e) {
      console.log("textlayerrendered event called!");
    if (e.detail.pageNumber === PDFViewerApplication.page) {
    // finished rendering
      console.log("FINISHED RENDERING!");
      Android.makeWebViewVisible();
     } else {
     console.log("NOT DONE RENDERING!");
     }
}, true);

document.addEventListener('DOMContentLoaded', webViewerLoad, true);

يرجى مسامحة جهلي في جافا سكريبت ، فأنا مطور Android أحاول الحصول على ردود نداء js عندما ينتهي ملف PDF من العرض لأنني أواجه بعض المشكلات الخاصة بنظام Android ... أي مساعدة ستكون موضع تقدير كبير.

محدث:
كانت المشكلة أن ظهور Android WebView الخاص بي لم يتم تعيينه على VISIBLE ، لذلك لم يتم تشغيل أي من أحداث JS.

باستخدام العارض المتوفر مع pdf.js ، نجح الحدث pagesloaded بالنسبة لي (أقوم بفتح مربع حوار الطباعة بمجرد الانتهاء من التحميل):

document.addEventListener('pagesloaded', function (e) {
    window.print();
}, true);

@ turquoise-turtle هل قمت بإرفاق مستمع الحدث بالمستند الرئيسي أم بإطار iframe حيث يوجد المشاهد؟

var iframe = document.getElementById('iframe').contentDocument;

                            iframe.addEventListener('pagesloaded', function (e) {
                                alert("loaded");
                            }, true);

أفعل هذا ولا يبدو أنه يعمل

اضبط "eventBusDispatchToDOM": صحيح في viewer.js لماذا لا يخبر أحد بذلك!

يبدو أنه تم تغيير الإعداد الافتراضي لعدم إرسال الأحداث إلى DOM في الفترة من أغسطس إلى سبتمبر تقريبًا ، بالنظر إلى # 10019

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

dmisdm picture dmisdm  ·  3تعليقات

anggikolo11 picture anggikolo11  ·  3تعليقات

xingxiaoyiyio picture xingxiaoyiyio  ·  3تعليقات

smit-modi picture smit-modi  ·  3تعليقات

AlexP3 picture AlexP3  ·  3تعليقات