如何使用pdf.js从客户端设置范围标题?(How to set range header from client with pdf.js?)
我对客户端编程很新。 我想用pdf.js在我的网站上查看我的pdf。 按照文档中的步骤,我尝试使用pdf.js加载pdf。 整个pdf文件将在单个请求中下载。 现在,我想进行渐进式加载(通过指定范围下载)。
我在客户端和服务器端做了以下事情。
我的客户端包含两个文件
- form.js和
- 的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,我在其中完成了以下操作
- 通过从请求中的“Range”标头获取值来从特定字节范围查找和读取文件内容的选项
- 已添加
Accept-Range:Bytes
和Access-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
- form.js and
- 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
- Option to seek and read the file content from specific byte range by obtaining value from "Range" header in the request
- Have added
Accept-Range:Bytes
andAccess-Control-Allow-Headers:Accept-Ranges
values in response headersNow 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
最满意答案
您可以使用:
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) {}
更改分层高亮属性有两个效果:
- 您现在将看到选择
- 当突出显示的文本跨越多行时,突出显示在行的文本区域的末尾(不仅仅是文本的末尾)。
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:
- You will now see the selection
- 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() ...
-
监控突出显示的文本(Monitor text that is highlighted)[2022-04-27]
您可以使用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 ... -
为什么在显示窗体时突出显示(选定)文本框中的文本?(Why is text in TextBox highlighted (selected) when form is displayed?)[2022-07-01]
文本框的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.
它是更好的语义IMO。 The use of the span is what's breaking it. Coding it like this works fine:
login as:Welcome to ...
-
Can Shiny可以用鼠标识别文本选择(突出显示的文本)吗?(Can Shiny recognise text selection with mouse (highlighted text)?)[2022-05-01]
是的,它可以。 javascript确实对此有用,不确定是否有必要,但它肯定更容易。 我根据这个答案得到答案,以获得js突出显示的文本,并将此数据从js发送给R ,因此归功于原作者。 首先是简单的可重现代码,然后我将解释发生了什么: server.R shinyServer(function(input, output, session) { output$results = renderPrint({ input$mydata }) }) ui.R shinyUI(b ... -
删除所选/突出显示的文本(Remove selected/highlighted text)[2023-05-04]
你的错误在于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 ...
-
获取突出显示的文本(Get the highlighted text)[2022-03-21]
使用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 { ...
-
取消选择richtextBox中的文本而不会丢失突出显示的文本c#(Deselect text in richtextBox without losing highlighted text c#)[2022-03-08]
您发布的代码不会使石灰突出显示文本“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; ...