mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-11 11:51:27 +00:00
Merge pull request #2040 from haiwen/pdf-text-selection
[file view] pdf: enable text selection
This commit is contained in:
@@ -1,33 +0,0 @@
|
|||||||
.page-container {
|
|
||||||
width: 850px;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
box-shadow: 0 0 6px #ccc;
|
|
||||||
margin: 13px auto;
|
|
||||||
}
|
|
||||||
.page-container iframe {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
border:0;
|
|
||||||
}
|
|
||||||
.pdf2html-toolbar {
|
|
||||||
position:fixed;
|
|
||||||
left:50%;
|
|
||||||
bottom:0;
|
|
||||||
padding:20px 50px 0;
|
|
||||||
}
|
|
||||||
.pdf2html-toolbar .inner {
|
|
||||||
padding:2px 5px;
|
|
||||||
background: #000;
|
|
||||||
opacity:0.75;
|
|
||||||
border-radius:3px;
|
|
||||||
-ms-user-select:none;
|
|
||||||
-moz-user-select:none;
|
|
||||||
-webkit-user-select:none;
|
|
||||||
user-select:none;
|
|
||||||
}
|
|
||||||
.pdf2html-toolbar span {
|
|
||||||
font-size:1.5em;
|
|
||||||
color:#fff;
|
|
||||||
cursor:pointer;
|
|
||||||
margin: 0 0.3em;
|
|
||||||
}
|
|
@@ -2998,10 +2998,42 @@ button.sf-dropdown-toggle:focus {
|
|||||||
margin:0 auto;
|
margin:0 auto;
|
||||||
}
|
}
|
||||||
.pdf-page {
|
.pdf-page {
|
||||||
|
position:relative;
|
||||||
|
}
|
||||||
|
.pdf-page-canvas {
|
||||||
display:block;
|
display:block;
|
||||||
max-width:100%;
|
max-width:100%;
|
||||||
|
box-shadow:0 0 6px #ccc;
|
||||||
margin:0 auto 20px;
|
margin:0 auto 20px;
|
||||||
}
|
}
|
||||||
|
.pdf-page-text-layer {
|
||||||
|
position:absolute;
|
||||||
|
left:0;
|
||||||
|
top:0;
|
||||||
|
right:0;
|
||||||
|
bottom:0;
|
||||||
|
overflow:hidden;
|
||||||
|
opacity:0.2;
|
||||||
|
line-height:1.0;
|
||||||
|
}
|
||||||
|
.pdf-page-text-layer > div {
|
||||||
|
color:transparent;
|
||||||
|
position:absolute;
|
||||||
|
white-space:pre;
|
||||||
|
cursor:text;
|
||||||
|
-webkit-transform-origin:0% 0%;
|
||||||
|
-moz-transform-origin:0% 0%;
|
||||||
|
-o-transform-origin:0% 0%;
|
||||||
|
-ms-transform-origin:0% 0%;
|
||||||
|
transform-origin:0% 0%;
|
||||||
|
}
|
||||||
|
.pdf-page-text-layer ::selection {
|
||||||
|
background: blue;
|
||||||
|
}
|
||||||
|
.pdf-page-text-layer ::-moz-selection {
|
||||||
|
background: blue;
|
||||||
|
}
|
||||||
|
|
||||||
#doc-view {
|
#doc-view {
|
||||||
min-height:700px;
|
min-height:700px;
|
||||||
_height:700px;
|
_height:700px;
|
||||||
|
@@ -28,34 +28,68 @@ try {
|
|||||||
// show at most 50 pages
|
// show at most 50 pages
|
||||||
var shownPageCount = pdf.numPages < 50 ? pdf.numPages : 50;
|
var shownPageCount = pdf.numPages < 50 ? pdf.numPages : 50;
|
||||||
|
|
||||||
|
var maxPageWidth = $('#pdf').width();
|
||||||
var getPageAndRender = function (pageNumber) {
|
var getPageAndRender = function (pageNumber) {
|
||||||
pdf.getPage(pageNumber).then(function(page) {
|
pdf.getPage(pageNumber).then(function(page) {
|
||||||
var scale = 1.5;
|
var scale = 1.5;
|
||||||
var viewport = page.getViewport(scale);
|
var viewport = page.getViewport(scale);
|
||||||
var $canvas = $('<canvas class="pdf-page"></canvas>');
|
if (viewport.width > maxPageWidth) {
|
||||||
var canvas = $canvas[0];
|
// set a proper scale
|
||||||
|
viewport = viewport.clone({'scale': maxPageWidth / (viewport.width / 1.5)});
|
||||||
var ctx = canvas.getContext('2d', {alpha: false});
|
}
|
||||||
var outputScale = getOutputScale(ctx);
|
|
||||||
|
|
||||||
var width = Math.floor(viewport.width);
|
var width = Math.floor(viewport.width);
|
||||||
var height = Math.floor(viewport.height);
|
var height = Math.floor(viewport.height);
|
||||||
|
|
||||||
canvas.width = width * outputScale.sx;
|
var $canvas = $('<canvas class="pdf-page-canvas"></canvas>');
|
||||||
canvas.height = height * outputScale.sy;
|
var canvas = $canvas[0];
|
||||||
canvas.style.width = width + 'px';
|
var ctx = canvas.getContext('2d', {alpha: false});
|
||||||
canvas.style.height = height + 'px';
|
var outputScale = getOutputScale(ctx);
|
||||||
|
|
||||||
|
$canvas
|
||||||
|
.attr({
|
||||||
|
'width': width * outputScale.sx,
|
||||||
|
'height': height * outputScale.sy
|
||||||
|
})
|
||||||
|
.css({
|
||||||
|
'width': width,
|
||||||
|
'height': height
|
||||||
|
});
|
||||||
|
|
||||||
if (outputScale.scaled) {
|
if (outputScale.scaled) {
|
||||||
ctx.scale(outputScale.sx, outputScale.sy);
|
ctx.scale(outputScale.sx, outputScale.sy);
|
||||||
}
|
}
|
||||||
|
|
||||||
$loadingTip.before($canvas);
|
var $textLayer = $('<div class="pdf-page-text-layer"></div>');
|
||||||
|
$loadingTip.before($('<div class="pdf-page"></div>').append($canvas).append($textLayer));
|
||||||
|
|
||||||
|
var canvasOffset = $canvas.offset();
|
||||||
|
$textLayer
|
||||||
|
.css({
|
||||||
|
'width': width,
|
||||||
|
'height': height
|
||||||
|
})
|
||||||
|
.offset({
|
||||||
|
top: canvasOffset.top,
|
||||||
|
left: canvasOffset.left
|
||||||
|
});
|
||||||
|
|
||||||
page.render({
|
page.render({
|
||||||
canvasContext: ctx,
|
canvasContext: ctx,
|
||||||
viewport: viewport
|
viewport: viewport
|
||||||
});
|
});
|
||||||
|
|
||||||
|
page
|
||||||
|
.getTextContent({'normalizeWhitespace': true})
|
||||||
|
.then(function(text) {
|
||||||
|
PDFJS.renderTextLayer({
|
||||||
|
textContent: text,
|
||||||
|
textContentStream: page.streamTextContent(),
|
||||||
|
container: $textLayer[0],
|
||||||
|
viewport: viewport
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
if (pageNumber < shownPageCount) {
|
if (pageNumber < shownPageCount) {
|
||||||
pageNumber++;
|
pageNumber++;
|
||||||
getPageAndRender(pageNumber);
|
getPageAndRender(pageNumber);
|
||||||
|
Reference in New Issue
Block a user