๋ ๋๋ง๋ PDF์ ์๋์ชฝ ์ ๋ฐ์ ๋ฎ๋๋ก ๊ทธ๋ผ๋์ธํธ๋ฅผ ๋ ๋๋งํด์ผ ํฉ๋๋ค. ์ ๋ ์ ๋ฌธ์ฌ์์ ์ผํ๊ณ ์์ผ๋ฉฐ ๊ตฌ๋ ํ๊ธฐ ์ ์ ํฐ์ ์ ํจ๊ป ์ ๋ฌธ์ ๋ณด์ฌ์ฃผ๋ ์ฑ์ ๋ง๋ค๊ณ ์์ต๋๋ค.
๋ฌธ์ ๋ ๊ทธ๋ผ๋์ธํธ๊ฐ PDF ์์ ๊ทธ๋ ค์ ธ์ผ ํ๋ฏ๋ก PDF ๋ ๋๋ง์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์ PDF๊ฐ ์๋ฃ๋๊ธฐ ์ ์ ๊ทธ๋ผ๋์ธํธ ๋ ๋๋ง์ ์๋ํ๋ฉด ๋งค์ฐ ๊ฑฐ์น ๋์(ํ์ด์ง๊ฐ ์ฝ๊ฐ์ด๋ผ๋ ์คํฌ๋กค๋ ๋๋ง๋ค ์บ๋ฒ์ค๊ฐ ๋ค์ ๋ ๋๋ง๋๊ณ ๊น๋ฐ์)์ด ๋ฐ์ํ์ฌ ๊ณ์ํด์ ๋ค์ ์น ํ๊ณ ์ฝํ ์ธ ๊ฐ ๊ฑฐ๊พธ๋ก ๋ ๋๋ง๋ฉ๋๋ค. ๋๋๋ก.
์์ฃผ ๊ฐ๋จํ๊ฒ, PDF ๋ ๋๋ง์ด ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ์ ์คํํด์ผ ํฉ๋๋ค.
์ฝ๋ฐฑ์ ์ง์ํ ์ ์์ต๋๊น? ์๋๋ฉด ๋ ๋๋ง์ด ์๋ฃ๋๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด์๊ฒ ์ต๋๊น?
'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์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์กํ์ง ์๋๋ก ๊ธฐ๋ณธ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
textlayerrendered
์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.