1
0
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:
Daniel Pan
2018-03-17 15:05:46 +08:00
committed by GitHub
3 changed files with 76 additions and 43 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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);