带PDFJS的响应式pdf渲染器

时间:2017-11-01 12:32:39

标签: javascript pdf canvas resize pdfjs

我对PDFJS和画布有一点问题。

我可以在页面上显示PDF,我也可以在页面的整个宽度上显示PDF(差不多,我不知道要考虑滚动条)但我仍然有调整大小事件的问题。

在调整大小事件期间,某些页面无缘无故地被发现...

你能帮我吗?

谢谢!

编辑:使用替换画布!

/*
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>

1 个答案:

答案 0 :(得分:0)

这是一篇旧帖子,但当我最近遇到同一主题时,我找到了一个解决方案,将 pdfviewer 更新为新尺寸,例如在调整呈现查看器的容器大小之后。

lib 的文档有些有限,我通过遍历源代码找到了解决方案,并找到了以下代码段 (pdf.js/web/app.js@webViewerResize: lines 2449-2464 on github):

function webViewerResize() {
  const { pdfDocument, pdfViewer } = PDFViewerApplication;
  if (!pdfDocument) {
    return;
  }
  const currentScaleValue = pdfViewer.currentScaleValue;
  if (
    currentScaleValue === "auto" ||
    currentScaleValue === "page-fit" ||
    currentScaleValue === "page-width"
  ) {
    // Note: the scale is constant for 'page-actual'.
    pdfViewer.currentScaleValue = currentScaleValue;
  }
  pdfViewer.update();
}

通过在我的回调中应用相同的序列使 viewer 根据我配置的 currentScaleValue “调整大小”。

这感觉有点“自动”,因为我没有花时间深入研究源代码。因此,请随意添加任何细节以说明其有效的原因。


免责声明:使用 pdfjs-dist 2.9.359 版“测试”