首页 \ 问答 \ 如何使用pdf.js从客户端设置范围标题?(How to set range header from client with pdf.js?)

如何使用pdf.js从客户端设置范围标题?(How to set range header from client with pdf.js?)

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

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

我的客户端包含两个文件

  1. form.js和
  2. 的index.html

客户端 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;
  }

我的index.html只加载上面的js(form.js)和pdf.js以及pdf.worker.js文件

服务器

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

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

现在我对以下内容感到震惊

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

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

3.从哪里打电话?

我应该包括viewer.html吗?

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


I am quite new to client side programming. I am trying to view my pdf in my web using pdf.js. By following the steps in documentation i tried loading pdf with pdf.js. The entire pdf file is getting downloaded in a single request. Now, I would like to do progressive loading (downloading by specifying the range).

I have done the following things at my client and server side.

My client contains two files

  1. form.js and
  2. index.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 index.html just loads the above js (form.js) and pdf.js and pdf.worker.js files

SERVER

This contains a servlet in which i have done the following

  1. Option to seek and read the file content from specific byte range by obtaining value from "Range" header in the request
  2. Have added Accept-Range:Bytes and Access-Control-Allow-Headers:Accept-Ranges values in response headers

Now I got struck in the following

1.Where to add "Range" header value?

2.How to send range request from client?

3.From where these calls were made?

4.Should I include viewer.html?

Please help me with this ! I'm collapsed :-(


原文:https://stackoverflow.com/questions/40620638
更新时间:2023-10-15 06:10

最满意答案

您可以使用:

JTextArea textArea = new JTextArea(10, 20);
textArea.setText( "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight" );

DefaultHighlighter highlighter =  (DefaultHighlighter)textArea.getHighlighter();
highlighter.setDrawsLayeredHighlights(false);

try
{
    highlighter.addHighlight(10, 20, new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW));
}
catch(Exception e) {}

更改分层高亮属性有两个效果:

  1. 您现在将看到选择
  2. 当突出显示的文本跨越多行时,突出显示在行的文本区域的末尾(不仅仅是文本的末尾)。

You might be able to use:

JTextArea textArea = new JTextArea(10, 20);
textArea.setText( "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight" );

DefaultHighlighter highlighter =  (DefaultHighlighter)textArea.getHighlighter();
highlighter.setDrawsLayeredHighlights(false);

try
{
    highlighter.addHighlight(10, 20, new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW));
}
catch(Exception e) {}

Changing the layered highlights property has two effects:

  1. You will now see the selection
  2. Highlighting is done to the end of the text area for a line, (not just to the end of the text) when highlighted text spans multiple lines.

相关问答

更多
  • .select()与检索实际选定的文本无关。 Select就像.click() :一种简单的方式将处理函数绑定到select事件。 它在API文档中说得很对 : 检索当前选定文本的方法因浏览器而异。 许多jQuery插件提供了跨平台的解决方案。 所以你用element.select(...)绑定(或者更好的是, element.on("select", ...) ),然后使用许多跨平台解决方案之一来检索选择。 这是基本的想法: http : //jsfiddle.net/NjW5a/3/ .select() ...
  • 您可以使用JNA在前台窗口上实际模拟Ctrl-C (复制操作),然后读取剪贴板中的内容,之后您只需要恢复剪贴板中的内容。 这是一个简短的样本: import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Stri ...
  • 文本框的TabIndex为0, TabStop设置为true。 这意味着当窗体显示时,控件将被赋予焦点。 您可以给另一个控件0 TabIndex (如果有的话),并给文本框一个不同的选项卡索引(> 0),或者设置TabStop为false为文本框阻止这种情况发生。 The text box has a TabIndex of 0 and TabStop set to true. This means that the control will be given focus when the form is ...
  • span的使用正在打破它。 编码它像这样工作正常:

    Welcome to term.

    login as:  

    它是更好的语义IMO。 The use of the span is what's breaking it. Coding it like this works fine:

    Welcome to ...

  • 是的,它可以。 javascript确实对此有用,不确定是否有必要,但它肯定更容易。 我根据这个答案得到答案,以获得js突出显示的文本,并将此数据从js发送给R ,因此归功于原作者。 首先是简单的可重现代码,然后我将解释发生了什么: server.R shinyServer(function(input, output, session) { output$results = renderPrint({ input$mydata }) }) ui.R shinyUI(b ...
  • 你的错误在于else部分。 如果用户没有选择任何文本,只需单击文本,则会执行else代码块。 在该块中,您分配var text1 = ""; 稍后你将text1作为$(".selectable")元素的文本内容。 只需将该行更改为: var text1 = selectedText; 查看更新的小提琴 我还建议您在mouseup处理程序的顶部只声明一次var text1 ,并将你的赋值从var text1 = "value"更改为text1 = "value" 见: var hoisting Your e ...
  • 你绝对不能(读我的嘴唇:永远,永远,永远)改变RichtTextBox Text或Lines属性,否则你将丢失/搞乱所有以前的格式。 所以你需要改变这个: richTextBox1.Text = richTextBox1.Text.Remove(richTextBox1.Text.Length - 1, 1); 按此顺序: 首先以某种方式选择要更改的Text部分: richTextBox1.SelectionStart = richTextBox1.Text.Length - 1; richTextBox ...
  • 使用DIV演示 http://jsfiddle.net/KgtW5/3/ .on API: http : .on 我为你需要的人定制了它。 好的链接:和BIG提示: 获取突出显示/选定的文本 希望演示可以帮助你,知道我是否遗漏了什么! :) 码 $('textarea').on('select', function() { var foo = getSelectionText(); $('#hulk').val(foo); }); function getSelectionText() ...
  • 您可以使用: JTextArea textArea = new JTextArea(10, 20); textArea.setText( "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight" ); DefaultHighlighter highlighter = (DefaultHighlighter)textArea.getHighlighter(); highlighter.setDrawsLayeredHighlights(false); try { ...
  • 您发布的代码不会使石灰突出显示文本“unhighlight”。 我怀疑你有: tb_log.Text += some text; 你代码中的某个地方。 这将取代所有当前格式。 使用 tb_Log.AppendText(some text); 而是保留格式的丰富性。 The code you posted does not make the lime highlighted text "unhighlight". I suspect you have: tb_log.Text += some text; ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)