【发布时间】:2018-04-13 18:37:02
【问题描述】:
我对 PDFJS 和画布有点问题。
我可以在页面上显示 PDF,我也可以在页面的整个宽度上显示 PDF(差不多,我不知道要考虑滚动条)但是我仍然有 resize 事件的问题.
在调整大小事件期间,发现一些页面无缘无故颠倒...
你能帮帮我吗?
谢谢!
编辑:使用替换画布!
/*
http://code.jquery.com/jquery-3.2.1.min.js
http://mozilla.github.io/pdf.js/build/pdf.js
*/
$(function() {
PDFJS.workerSrc = '//mozilla.github.io/pdf.js/build/pdf.worker.js';
/* Generate scaled page's canvas */
var generatePageCanvas = function(pdfDiv, page) {
var canvas = document.createElement('canvas');
var divWidth = pdfDiv.width();
var pageWidth = page.getViewport(1).width;
var renderContext = {
canvasContext: canvas.getContext('2d'),
viewport: page.getViewport(divWidth / pageWidth)
};
canvas.height = renderContext.viewport.height;
canvas.width = renderContext.viewport.width;
page.render(renderContext);
return canvas;
}
/* Render a PDF's page, with resize event */
var renderPage = function(pdfDiv, page) {
var canvas = generatePageCanvas(pdfDiv, page);
pdfDiv.append(canvas);
$(window).resize(() => {
var resizedCanvas = generatePageCanvas(pdfDiv, page);
canvas.replaceWith(resizedCanvas);
canvas = resizedCanvas;
});
};
/* Render a PDF file */
var renderPdf = function(pdfUrl, pdfDiv) {
PDFJS.getDocument(pdfUrl).then(pdfDoc => {
for (var num = 1; num <= pdfDoc.numPages; num++) {
pdfDoc.getPage(num).then(page => {
renderPage(pdfDiv, page);
});
}
});
};
/* Search and render data-pdf attributes */
$('div[data-pdf]').each(function() {
var pdfDiv = $(this);
var pdfUrl = pdfDiv.data('pdf');
pdfDiv.css('overflow', 'auto')
.css('max-height', '180px');
renderPdf(pdfUrl, pdfDiv);
});
/* Simulate window resize event */
$('button').click(function() {
var i = 400;
var interval = setInterval(() => {
i += 20;
document.body.style.width = i + "px";
window.dispatchEvent(new Event('resize'));
}, 250);
setTimeout(() => {
clearInterval(interval);
}, 1000);
});
});
<html>
<head>
<script src="//mozilla.github.io/pdf.js/build/pdf.js"></script>
<script src="//code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
<body>
<button>
Simulate resize
</button>
<div data-pdf="//cdn.mozilla.net/pdfjs/tracemonkey.pdf"></div>
<div data-pdf="//cdn.mozilla.net/pdfjs/helloworld.pdf"></div>
</body>
</html>
【问题讨论】:
-
这里有几个问题,删除 disableWorker,并跟踪何时为特定画布调用渲染(您可以创建一个新画布并替换旧画布)——当绘画开始/结束时,您不能不跟踪单个画布用于多个异步操作。
-
非常感谢!只需更换画布,效果就更好了!所以我创建了一个函数来生成我的画布,并在调整大小时用新的替换旧的。如果有用的话,我已经更新了下一个代码。
标签: javascript pdf canvas resize pdfjs