Pdf.js: PDF ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์ฝœ๋ฐฑ?

์— ๋งŒ๋“  2014๋…„ 12์›” 30์ผ  ยท  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 ๋Œ“๊ธ€

'pagerendered' ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ render()๊ฐ€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ทฐ์–ด๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ PDFViewer ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“œ๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ทฐ์–ด์— ๋Œ€ํ•ด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž, ๊ทธ๋Ÿผ 'pagerendered' ์ด๋ฒคํŠธ๋Š” ์–ด๋–ค ๊ฐ์ฒด์—์„œ ๋ฐœ์ƒํ• ๊นŒ์š”? @yurydelendik

https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.js#L225 ๋ฐ ์‚ฌ์šฉ ์˜ˆ๋Š” https://github.com/mozilla/pdf.js/blob/master/web ์—์„œ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ทฐ์–ด์šฉ API๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฆด๋ฆฌ์Šคํ•œ API๋งŒ ์ฝ”์–ด ๋ฐ ์บ”๋ฒ„์Šค ๋ Œ๋”๋ง์šฉ์ž…๋‹ˆ๋‹ค(src/display/api.js ์ฐธ์กฐ).

@yurydelendik ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์บ”๋ฒ„์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. PDF JS๊ฐ€ ๋‹ค๋ฅธ ๊ณณ๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ฆ‰์‹œ ๋‚˜๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒํ–ˆ์ง€๋งŒ ์–ด์จŒ๋“  ๋‹น์‹ ์€ ๋‚ด๊ฐ€ ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊ณ ๋งˆ์›Œ!

ํ•ด๊ฒฐ๋œ ๋Œ€๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์ด ์ด๋ฒคํŠธ๋ฅผ ์žก๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ฌธ์„œ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ pagerendered ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค(Jquery).

$(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 ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@yurydelendik

์ผ๋ฐ˜ ๋ทฐ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€ 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 ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ Android ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— PDF ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ js ์ฝœ๋ฐฑ์„ ์–ป์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋„์›€์ด๋ผ๋„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๋จ:
๋ฌธ์ œ๋Š” ๋‚ด 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);

๋‚˜๋Š” ์ด๊ฒƒ์„ํ•˜๊ณ  ์žˆ๊ณ  ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

set "eventBusDispatchToDOM": viewer.js์—์„œ true์ธ ์ด์œ ๋Š” ์•„๋ฌด๋„ ์ด๊ฒƒ์„ ๋งํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค!

#10019๋ฅผ ๋ณด๋ฉด 8์›”์—์„œ 9์›” ์‚ฌ์ด์— DOM์— ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์†กํ•˜์ง€ ์•Š๋„๋ก ๊ธฐ๋ณธ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰