如何使用 pdf.js 从客户端设置范围标头?

2024-06-19

我对客户端编程很陌生。我正在尝试使用 pdf.js 在我的网站上查看我的 pdf。通过遵循文档中的步骤,我尝试使用 pdf.js 加载 pdf。整个 pdf 文件通过单个请求下载。现在,我想做渐进式加载(通过指定范围下载)。

我在客户端和服务器端做了以下事情。

我的客户端包含两个文件

  1. 表单.js 和
  2. 索引.html

CLIENT form.js

'use strict';
var PDF_PATH = ""; //Path of pdf file in web
var PAGE_NUMBER = 1;
var PAGE_SCALE = 1.5;

function renderPage(div, pdf, pageNumber, callback) {
        pdf.getPage(pageNumber).then(function(page) {
        var scale = 1.5;
        var viewport = page.getViewport(scale);

        var pageDisplayWidth = viewport.width;
        var pageDisplayHeight = viewport.height;

        var pageDivHolder = document.createElement('div');
        pageDivHolder.className = 'pdfpage';
        pageDivHolder.style.width = pageDisplayWidth + 'px';
        pageDivHolder.style.height = pageDisplayHeight + 'px';
        div.appendChild(pageDivHolder);

        // Prepare canvas using PDF page dimensions
        var canvas = document.createElement('canvas');
        var context = canvas.getContext('2d');
        canvas.width = pageDisplayWidth;
        canvas.height = pageDisplayHeight;
        pageDivHolder.appendChild(canvas);

       // Render PDF page into canvas context
       var renderContext = {
        canvasContext: context,
        viewport: viewport
       };
       page.render(renderContext).promise.then(callback);

       // Prepare and populate form elements layer
       var formDiv = document.createElement('div');
       pageDivHolder.appendChild(formDiv);
    
 //setupForm(formDiv, page, viewport);
  });
}


function pageLoaded() {
PDFJS.disableWorker = true;
PDFJS.workerSrc = "./pdf.worker.js";   // no i18n
PDFJS.getDocument({url: PDF_PATH}).then(function (pdf) {

        var canvas = document.createElement("canvas");
        canvas.setAttribute("id", "pageCanvas");
        canvas.setAttribute('style', "display:none");
        document.body.appendChild(canvas);

        // Rendering all pages starting from first
         var viewer = document.getElementById('viewer');
         var pageNumber = 1;
         renderPage(viewer, pdf, pageNumber++, function pageRenderingComplete() {
                if (pageNumber > pdf.numPages) {
                return; // All pages rendered
                }
                // Continue rendering of the next page
                renderPage(viewer, pdf, pageNumber++, pageRenderingComplete);
        });
});
}

document.addEventListener('DOMContentLoaded', function () {
  if (typeof PDFJS === 'undefined') {
    alert('Built version of PDF.js was not found.\n' +
          'Please run `gulp generic`.');
    return;
  }

and my 索引.html只需加载上面的js(form.js)和pdf.js和pdf.worker.js文件

SERVER

这包含一个 servlet,我在其中完成了以下操作

  1. 通过从请求中的“Range”标头获取值来查找和读取特定字节范围的文件内容的选项
  2. 已添加Accept-Range:Bytes and Access-Control-Allow-Headers:Accept-Ranges响应标头中的值

现在我受到以下打击

1.在哪里添加“Range”标头值?

2.客户端如何发送范围请求?

3.这些电话是从哪里打来的?

4.我应该包含viewer.html吗?

请在这件事上给予我帮助 !我崩溃了:-(


1.在哪里添加“Range”标头值?

PDF.js 检测服务器是否返回“接受范围:字节 https://github.com/mozilla/pdf.js/blob/7f6a607ea537a6237802fe11e211afb2b19af9cf/src/core/network.js#L370" 如果服务器返回有效的 HTTP 请求标头 (per spec https://www.rfc-editor.org/rfc/rfc7233)、PDF.js(将中止对不允许增量 XHR 的平台的主要请求,并且)将发出范围请求。

2.客户端如何发送范围请求?

当 PDF.js 确定服务器可以处理范围请求时,它会通过 XHR 自动执行此操作。

3.这些电话是从哪里打来的?

See 网络.js https://github.com/mozilla/pdf.js/blob/7f6a607ea537a6237802fe11e211afb2b19af9cf/src/core/network.js file.

4.我应该包含viewer.html吗?

No

看起来目前提供 PDF 数据的 servlet 不支持有效的 HTTP 范围请求协议。仅设置“Accept-Ranges:Bytes”是不够的。看它是如何在 PHP 中实现的 https://github.com/joepie91/pdfy/blob/master/public_html/modules/download.php或查看之前的回答servlet相关问题 https://stackoverflow.com/questions/5011446/java-server-side-sending-file-with-resume-support/5013071#5013071.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 pdf.js 从客户端设置范围标头? 的相关文章

随机推荐