1
0
Fork 0
mirror of https://github.com/Yetangitu/owncloud-apps.git synced 2025-10-02 14:49:17 +02:00

files_reader: more changes towards full PDF functionality

This commit is contained in:
frankdelange 2017-03-25 19:39:03 +01:00
parent 1b1a2bea9a
commit e7f4760993
20 changed files with 308 additions and 127 deletions

View file

@ -62,13 +62,13 @@ class Isbndb
static function parse($data,&$meta) { static function parse($data,&$meta) {
/* did the call succeed? If not, schedule a rescan */ /* did the call succeed? If not, schedule a rescan */
if (Isbn::REQUEST_LIMIT_EXCEEDED == $data) { if (Isbn::REQUEST_LIMIT_EXCEEDED == $data) {
$meta['rescan'] = date("Y-m-d\TH:i:sP", time() + Isbn::RESCAN_LIMIT_EXCEEDED); $meta['rescan'] = date("Y-m-d H:i:s", time() + Isbn::RESCAN_LIMIT_EXCEEDED);
return false; return false;
} elseif (Isbn::NOT_FOUND == $data) { } elseif (Isbn::NOT_FOUND == $data) {
$meta['rescan'] = date("Y-m-d\TH:i:sP", time() + Isbn::RESCAN_NOT_FOUND); $meta['rescan'] = date("Y-m-d H:i:s", time() + Isbn::RESCAN_NOT_FOUND);
return false; return false;
} elseif (Isbn::ERROR == $data) { } elseif (Isbn::ERROR == $data) {
$meta['rescan'] = date("Y-m-d\TH:i:sP", time() + Isbn::RESCAN_ERROR); $meta['rescan'] = date("Y-m-d H:i:s", time() + Isbn::RESCAN_ERROR);
return false; return false;
} }

View file

@ -1,10 +1,18 @@
## UNRELEASED ## UNRELEASED
### Added ### Added
- Reader now supports PDF - Reader now supports PDF
- PDF should work more or less like EPUB, ie. double page spreads are supported - PDF double page spreads are supported
- optional double-buffering for faster rendering, can be disabled for low-memory devices - optional double-buffering for faster rendering, can be disabled for low-memory devices
- optional selectable text layer, can be disabled for low-memory devices - optional selectable text layer, can be disabled for low-memory devices
### Changed
- #38: moved declarations in js/ready.js one level lower to work around a bug in the Palemoon browser
- new version bitjs archive tools, fixes compatibility problems with some CBR files
## 1.0.1 - 2017-03-19
### Fixed
- #35: Internal Server Error: fixed path resolution so app works when NC/OC hosted in subdirectory
## 1.0.0 - 2017-03-15 ## 1.0.0 - 2017-03-15
### Added ### Added
- Reader now supports CBR/CBZ ('comics') files - Reader now supports CBR/CBZ ('comics') files

View file

@ -3,3 +3,9 @@
- bookmarks - bookmarks
- annotations - annotations
- settings - settings
- rtl and ltr
- switch spread-page-width by key combo
- test canvas size restriction
- toggle zoom via keyboard

View file

@ -100,51 +100,52 @@ document.onreadystatechange = function () {
default: default:
console.log(type + ' is not supported by Reader'); console.log(type + ' is not supported by Reader');
} }
}
// why is there no standard library function for this?
function getUrlParameter (param) {
var pattern = new RegExp('[?&]'+param+'((=([^&]*))|(?=(&|$)))','i');
var m = window.location.search.match(pattern);
return m && ( typeof(m[3])==='undefined' ? '' : m[3] );
}
// start epub.js renderer // why is there no standard library function for this?
function renderEpub(file, options) { function getUrlParameter (param) {
var pattern = new RegExp('[?&]'+param+'((=([^&]*))|(?=(&|$)))','i');
var m = window.location.search.match(pattern);
return m && ( typeof(m[3])==='undefined' ? '' : m[3] );
}
// some parameters... // start epub.js renderer
EPUBJS.filePath = "vendor/epubjs/"; function renderEpub(file, options) {
EPUBJS.cssPath = "vendor/epubjs/css/";
EPUBJS.basePath = $('.session').data('basepath');
/* device-specific boilerplate */ // some parameters...
EPUBJS.filePath = "vendor/epubjs/";
EPUBJS.cssPath = "vendor/epubjs/css/";
EPUBJS.basePath = $('.session').data('basepath');
/* device-specific boilerplate */
// IE < 11 // IE < 11
if (navigator.userAgent.indexOf("MSIE") != -1) { if (navigator.userAgent.indexOf("MSIE") != -1) {
EPUBJS.Hooks.register("beforeChapterDisplay").wgxpath = function(callback, renderer){ EPUBJS.Hooks.register("beforeChapterDisplay").wgxpath = function(callback, renderer){
wgxpath.install(renderer.render.window); wgxpath.install(renderer.render.window);
if(callback) if(callback)
callback(); callback();
}; };
wgxpath.install(window); wgxpath.install(window);
}
var reader = ePubReader(file, options);
} }
// start cbr.js renderer var reader = ePubReader(file, options);
function renderCbr(file, options) {
CBRJS.filePath = "vendor/cbrjs/";
var reader = cbReader(file, options);
}
// start pdf.js renderer
function renderPdf(file, options) {
PDFJS.filePath = "vendor/pdfjs/";
PDFJS.workerSrc = options.session.basePath + 'vendor/pdfjs/lib/pdf.worker.js';
var reader = pdfReader(file, options);
}
} }
// start cbr.js renderer
function renderCbr(file, options) {
CBRJS.filePath = "vendor/cbrjs/";
var reader = cbReader(file, options);
}
// start pdf.js renderer
function renderPdf(file, options) {
PDFJS.filePath = "vendor/pdfjs/";
PDFJS.workerSrc = options.session.basePath + 'vendor/pdfjs/lib/pdf.worker.js';
var reader = pdfReader(file, options);
}
}; };

View file

@ -43,7 +43,7 @@
<script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/epubjs/libs/jquery.min.js')) ?>?v=<?php p($version) ?>"> </script> <script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/epubjs/libs/jquery.min.js')) ?>?v=<?php p($version) ?>"> </script>
<script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/sindresorhus/screenfull.js')) ?>?v=<?php p($version) ?>"> </script> <script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/sindresorhus/screenfull.js')) ?>?v=<?php p($version) ?>"> </script>
<script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/pixastic/pixastic_combined.js')) ?>?v=<?php p($version) ?>"> </script> <script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/pixastic/pixastic_combined.js')) ?>?v=<?php p($version) ?>"> </script>
<script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/bitjs/archive.js')) ?>?v=<?php p($version) ?>"> </script> <script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/bitjs/archive/archive.js')) ?>?v=<?php p($version) ?>"> </script>
<script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/cbrjs/cbr.js')) ?>?v=<?php p($version) ?>"> </script> <script type="text/javascript" nonce="<?php p($nonce) ?>" src="<?php p($urlGenerator->linkTo('files_reader', 'vendor/cbrjs/cbr.js')) ?>?v=<?php p($version) ?>"> </script>
<?php if ($idevice): ?> <?php if ($idevice): ?>

View file

@ -284,6 +284,16 @@
</div> </div>
<span id="zoom_icon"></span> <span id="zoom_icon"></span>
<span class="controls-separator"> </span> <span class="controls-separator"> </span>
<div id="rotate_options" class="hide">
<div class="rotate_option icon-rotate_0" data-value="0" data-class="icon-rotate_0" data-text=""></div>
<div class="rotate_option icon-rotate_90" data-value="90" data-class="icon-rotate_90" data-text=""></div>
<div class="rotate_option icon-rotate_180" data-value="180" data-class="icon-rotate_180" data-text=""></div>
<div class="rotate_option icon-rotate_270" data-value="270" data-class="icon-rotate_270" data-text=""></div>
</div>
<span id="rotate_left" class="icon-rotate_left"></span>
<span id="rotate_icon" class=icon-rotate_0"></span>
<span id="rotate_right" class="icon-rotate_right"></span>
<span class="controls-separator"> </span>
<a></a> <a></a>
<a id="note" class="icon-comment"> <a id="note" class="icon-comment">
</a> </a>

Binary file not shown.

View file

@ -7,6 +7,10 @@
<font-face units-per-em="1024" ascent="960" descent="-64" /> <font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" /> <missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" /> <glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe039;" glyph-name="rotate_0" d="M854 426.667c0 188-154 342-342 342s-342-154-342-342c0-188 154-342 342-342s342 154 342 342zM86 426.667c0 236 190 426 426 426s426-190 426-426c0-236-190-426-426-426s-426 190-426 426zM704 340.667h-384l192 428z" />
<glyph unicode="&#xe03a;" glyph-name="rotate_90" d="M512 84.667c188 0 342 154 342 342s-154 342-342 342c-188 0-342-154-342-342s154-342 342-342zM512 852.667c236 0 426-190 426-426s-190-426-426-426c-236 0-426 190-426 426s190 426 426 426zM426 234.667v384l428-192z" />
<glyph unicode="&#xe03b;" glyph-name="rotate_180" d="M170 426.667c0-188 154-342 342-342s342 154 342 342c0 188-154 342-342 342s-342-154-342-342zM938 426.667c0-236-190-426-426-426s-426 190-426 426c0 236 190 426 426 426s426-190 426-426zM320 512.667h384l-192-428z" />
<glyph unicode="&#xe03c;" glyph-name="rotate_270" d="M512 768.667c-188 0-342-154-342-342s154-342 342-342c188 0 342 154 342 342s-154 342-342 342zM512 0.667c-236 0-426 190-426 426s190 426 426 426c236 0 426-190 426-426s-190-426-426-426zM598 618.667v-384l-428 192z" />
<glyph unicode="&#xe06d;" glyph-name="featured_play_list" d="M512 640.667v84h-384v-84h384zM512 468.667v86h-384v-86h384zM896 810.667c46 0 86-40 86-86v-596c0-46-40-86-86-86h-768c-46 0-86 40-86 86v596c0 46 40 86 86 86h768z" /> <glyph unicode="&#xe06d;" glyph-name="featured_play_list" d="M512 640.667v84h-384v-84h384zM512 468.667v86h-384v-86h384zM896 810.667c46 0 86-40 86-86v-596c0-46-40-86-86-86h-768c-46 0-86 40-86 86v596c0 46 40 86 86 86h768z" />
<glyph unicode="&#xe0b7;" glyph-name="chat" d="M768 596.667v86h-512v-86h512zM598 340.667v86h-342v-86h342zM256 554.667v-86h512v86h-512zM854 852.667c46 0 84-38 84-84v-512c0-46-38-86-84-86h-598l-170-170v768c0 46 38 84 84 84h684z" /> <glyph unicode="&#xe0b7;" glyph-name="chat" d="M768 596.667v86h-512v-86h512zM598 340.667v86h-342v-86h342zM256 554.667v-86h512v86h-512zM854 852.667c46 0 84-38 84-84v-512c0-46-38-86-84-86h-598l-170-170v768c0 46 38 84 84 84h684z" />
<glyph unicode="&#xe0b9;" glyph-name="comment" d="M768 596.667v86h-512v-86h512zM768 468.667v86h-512v-86h512zM768 340.667v86h-512v-86h512zM938 768.667v-768l-170 170h-598c-46 0-84 40-84 86v512c0 46 38 84 84 84h684c46 0 84-38 84-84z" /> <glyph unicode="&#xe0b9;" glyph-name="comment" d="M768 596.667v86h-512v-86h512zM768 468.667v86h-512v-86h512zM768 340.667v86h-512v-86h512zM938 768.667v-768l-170 170h-598c-46 0-84 40-84 86v512c0 46 38 84 84 84h684c46 0 84-38 84-84z" />
@ -44,6 +48,8 @@
<glyph unicode="&#xe3c7;" glyph-name="dehaze" d="M86 704.667h852v-86h-852v86zM86 490.667h852v-86h-852v86zM86 276.667h852v-84h-852v84z" /> <glyph unicode="&#xe3c7;" glyph-name="dehaze" d="M86 704.667h852v-86h-852v86zM86 490.667h852v-86h-852v86zM86 276.667h852v-84h-852v84z" />
<glyph unicode="&#xe408;" glyph-name="navigate_before" d="M658 622.667l-196-196 196-196-60-60-256 256 256 256z" /> <glyph unicode="&#xe408;" glyph-name="navigate_before" d="M658 622.667l-196-196 196-196-60-60-256 256 256 256z" />
<glyph unicode="&#xe409;" glyph-name="navigate_next" d="M426 682.667l256-256-256-256-60 60 196 196-196 196z" /> <glyph unicode="&#xe409;" glyph-name="navigate_next" d="M426 682.667l256-256-256-256-60 60 196 196-196 196z" />
<glyph unicode="&#xe419;" glyph-name="rotate_left" d="M554 764.667c168-20 300-164 300-338s-132-318-300-338v86c122 20 214 126 214 252s-92 232-214 252v-166l-194 190 194 194v-132zM302 156.667l62 62c32-24 68-38 106-44v-86c-60 8-118 30-168 68zM260 384.667c6-38 20-74 42-106l-60-60c-38 50-60 106-68 166h86zM304 574.667c-22-32-38-68-44-106h-86c8 60 32 116 70 166z" />
<glyph unicode="&#xe41a;" glyph-name="rotate_right" d="M720 278.667c24 32 38 68 44 106h86c-8-60-30-116-68-166zM554 174.667c38 6 74 20 106 44l62-62c-50-38-108-60-168-68v86zM850 468.667h-86c-6 38-20 74-44 106l62 60c38-50 60-106 68-166zM664 702.667l-194-190v166c-122-20-214-126-214-252s92-232 214-252v-86c-168 20-300 164-300 338s132 318 300 338v132z" />
<glyph unicode="&#xe429;" glyph-name="tune" d="M640 554.667v256h86v-86h170v-84h-170v-86h-86zM896 384.667h-426v84h426v-84zM298 554.667h86v-256h-86v86h-170v84h170v86zM554 42.667h-84v256h84v-86h342v-84h-342v-86zM128 724.667h426v-84h-426v84zM128 212.667h256v-84h-256v84z" /> <glyph unicode="&#xe429;" glyph-name="tune" d="M640 554.667v256h86v-86h170v-84h-170v-86h-86zM896 384.667h-426v84h426v-84zM298 554.667h86v-256h-86v86h-170v84h170v86zM554 42.667h-84v256h84v-86h342v-84h-342v-86zM128 724.667h426v-84h-426v84zM128 212.667h256v-84h-256v84z" />
<glyph unicode="&#xe430;" glyph-name="wb_sunny" d="M152 146.667l76 78 60-60-76-78zM470-19.333v126h84v-126h-84zM512 704.667c142 0 256-114 256-256s-114-256-256-256-256 114-256 256 114 256 256 256zM854 490.667h128v-86h-128v86zM736 164.667l60 58 76-76-60-60zM872 748.667l-76-76-60 60 76 76zM554 914.667v-126h-84v126h84zM170 490.667v-86h-128v86h128zM288 732.667l-60-60-76 76 60 60z" /> <glyph unicode="&#xe430;" glyph-name="wb_sunny" d="M152 146.667l76 78 60-60-76-78zM470-19.333v126h84v-126h-84zM512 704.667c142 0 256-114 256-256s-114-256-256-256-256 114-256 256 114 256 256 256zM854 490.667h128v-86h-128v86zM736 164.667l60 58 76-76-60-60zM872 748.667l-76-76-60 60 76 76zM554 914.667v-126h-84v126h84zM170 490.667v-86h-128v86h128zM288 732.667l-60-60-76 76 60 60z" />
<glyph unicode="&#xe54b;" glyph-name="local_library" d="M512 596.667c-70 0-128 58-128 128s58 128 128 128 128-58 128-128-58-128-128-128zM512 446.667c100 94 236 150 384 150v-468c-148 0-284-58-384-152-100 94-236 152-384 152v468c148 0 284-56 384-150z" /> <glyph unicode="&#xe54b;" glyph-name="local_library" d="M512 596.667c-70 0-128 58-128 128s58 128 128 128 128-58 128-128-58-128-128-128zM512 446.667c100 94 236 150 384 150v-468c-148 0-284-58-384-152-100 94-236 152-384 152v468c148 0 284-56 384-150z" />

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Before After
Before After

Binary file not shown.

Binary file not shown.

View file

@ -1,10 +1,10 @@
@font-face { @font-face {
font-family: 'icomoon'; font-family: 'icomoon';
src: url('fonts/icomoon.eot?jhgf4g'); src: url('fonts/icomoon.eot?gvtfq1');
src: url('fonts/icomoon.eot?jhgf4g#iefix') format('embedded-opentype'), src: url('fonts/icomoon.eot?gvtfq1#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?jhgf4g') format('truetype'), url('fonts/icomoon.ttf?gvtfq1') format('truetype'),
url('fonts/icomoon.woff?jhgf4g') format('woff'), url('fonts/icomoon.woff?gvtfq1') format('woff'),
url('fonts/icomoon.svg?jhgf4g#icomoon') format('svg'); url('fonts/icomoon.svg?gvtfq1#icomoon') format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@ -24,7 +24,7 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
/* slightly bigger icons */ /* slightly bigger icons */
font-size: 1.2em; font-size: 1.2em;
} }
.icon-anchor:before { .icon-anchor:before {
@ -297,6 +297,24 @@
.icon-zoom_out_map:before { .icon-zoom_out_map:before {
content: "\e56b"; content: "\e56b";
} }
.icon-rotate_0:before {
content: "\e039";
}
.icon-rotate_90:before {
content: "\e03a";
}
.icon-rotate_180:before {
content: "\e03b";
}
.icon-rotate_270:before {
content: "\e03c";
}
.icon-rotate_left:before {
content: "\e419";
}
.icon-rotate_right:before {
content: "\e41a";
}
.icon-droplet:before { .icon-droplet:before {
content: "\e90b"; content: "\e90b";
} }

Binary file not shown.

View file

@ -18,6 +18,11 @@ PDFJS.reader.ControlsController = function(book) {
$zoom_icon = $("#zoom_icon"), $zoom_icon = $("#zoom_icon"),
$zoom_options = $("#zoom_options"), $zoom_options = $("#zoom_options"),
$zoom_option = $(".zoom_option"), $zoom_option = $(".zoom_option"),
$rotate_icon = $("#rotate_icon"),
$rotate_options = $("#rotate_options"),
$rotate_option = $(".rotate_option"),
$rotate_left = $("#rotate_left"),
$rotate_right = $("#rotate_right"),
$page_num = $("#page_num"); $page_num = $("#page_num");
if (reader.isMobile() === true) { if (reader.isMobile() === true) {
@ -117,15 +122,18 @@ PDFJS.reader.ControlsController = function(book) {
*/ */
/* custom select, supports icons in drop-down list */ /* custom select, supports icons in drop-down list */
// zooooooooooooooom
$zoom_icon.on("click", function () { $zoom_icon.on("click", function () {
var offset = $(this).offset(); var offset = $(this).offset();
console.log(offset); console.log(offset);
$zoom_options.css("opacity", 0);
$zoom_options.toggleClass("hide");
$zoom_options.css({ $zoom_options.css({
'left': parseInt(offset.left) + "px", 'left': parseInt(offset.left - ($zoom_options.width() / 2)) + "px",
'top' : parseInt(parseInt(offset.top) + parseInt($zoom_icon.height())) + "px" 'top' : parseInt(parseInt(offset.top) + parseInt($zoom_icon.height())) + "px"
}); });
$zoom_options.toggleClass("hide"); $zoom_options.css("opacity", "");
}); });
$zoom_icon[0].className=""; $zoom_icon[0].className="";
@ -148,6 +156,50 @@ PDFJS.reader.ControlsController = function(book) {
} }
$zoom_options.addClass("hide"); $zoom_options.addClass("hide");
}); });
// rotate
$rotate_icon[0].className = "";
$rotate_icon[0].className = "icon-rotate_" + settings.rotation;
$rotate_icon.on("click", function () {
var offset = $(this).offset();
$rotate_options.css("opacity", 0);
$rotate_options.toggleClass("hide");
$rotate_options.css({
'left': parseInt(offset.left - ($rotate_options.width() / 2)) + "px",
'top' : parseInt(parseInt(offset.top) + parseInt($rotate_icon.height())) + "px"
});
$rotate_options.css("opacity", "");
});
$rotate_option.on("click", function () {
var $this = $(this);
reader.setRotation($this.data("value"));
$rotate_icon[0].className="";
$rotate_icon[0].textContent = "";
if ($this.data("class")) {
$rotate_icon.addClass($this.data("class"));
} else {
$rotate_icon[0].textContent = $this.data("text");
}
$rotate_options.addClass("hide");
});
$rotate_left.on("click", function () {
// add 360 to avoid negative rotation value
var rotation = (settings.rotation - 90 + 360) % 360;
reader.setRotation(rotation);
$rotate_icon[0].className = "";
$rotate_icon[0].className = "icon-rotate_" + rotation;
});
$rotate_right.on("click", function () {
var rotation = (settings.rotation + 90) % 360;
reader.setRotation(rotation);
$rotate_icon[0].className = "";
$rotate_icon[0].className = "icon-rotate_" + rotation;
});
/* end custom select */ /* end custom select */
var enterPageNum = function(e) { var enterPageNum = function(e) {

View file

@ -11,7 +11,9 @@ PDFJS.reader.ReaderController = function(book) {
$container = $("#container"), $container = $("#container"),
$fullscreen = $("#fullscreen"), $fullscreen = $("#fullscreen"),
$bookmark = $("#bookmark"), $bookmark = $("#bookmark"),
$note = $("#note"); $note = $("#note"),
$rotate_left = $("#rotate_left"),
$rotate_right = $("#rotate_right");
var reader = this, var reader = this,
book = this.book, book = this.book,
@ -93,9 +95,6 @@ PDFJS.reader.ReaderController = function(book) {
case 'bookmark': case 'bookmark':
$bookmark.click(); $bookmark.click();
break; break;
case 'reflow':
$sidebarReflow.click();
break;
case 'toggleTitlebar': case 'toggleTitlebar':
reader.ControlsController.toggle(); reader.ControlsController.toggle();
break; break;
@ -114,6 +113,15 @@ PDFJS.reader.ReaderController = function(book) {
case 'toggleDay': case 'toggleDay':
$use_custom_colors.click(); $use_custom_colors.click();
break; break;
case 'rotateLeft':
$rotate_left.click();
break;
case 'rotateRight':
$rotate_right.click();
break;
case 'toggleZoom':
// TODO
break;
default: default:
console.log("unsupported keyCode: " + e.keyCode); console.log("unsupported keyCode: " + e.keyCode);
} }

Binary file not shown.

View file

@ -142,33 +142,52 @@ body {
right: 0; right: 0;
} }
#zioom_icon { #zoom_icon,
text-align: center; #rotate_icon,
font-family: 'icomoon', 'Helvetica' !important; #rotate_left,
font-size: 1.2em; #rotate_right {
speak: none; padding: 0;
font-style: normal; border-radius: 0.2em;
font-weight: normal; border: 1px rgba(0,0,0,0) solid;
font-variant: normal; opacity: 0.5;
text-transform: none; display: inline-block;
line-height: 1; overflow: hidden;
border: none;
} }
#zoom_icon { #zoom_icon:hover,
padding: 0 0.5em; #rotate_icon:hover,
#rotate_left:hover,
#rotate_right:hover {
opacity: .8;
border: 1px rgba(0,0,0,.2) solid;
} }
#zoom_options { #zoom_icon:active,
#rotate_icon:active,
#rotate_left:active,
#rotate_right:active {
opacity: 1;
color: rgba(0,0,0,.6);
box-shadow: inset 0 0 6px rgba(155,155,155,.8);
}
#zoom_options,
#rotate_options {
font-family: "Lucida Console", "Monospace", "Courier New"; font-family: "Lucida Console", "Monospace", "Courier New";
position: fixed; position: fixed;
box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.4); box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.4);
background-color: white; background-color: white;
font-size: 1em; font-size: 1em;
padding: 0.2em 0.5em; padding: 0.5em;
} }
.zoom_option:hover { .zoom_option,
.rotate_option {
padding: 0.25em;
}
.zoom_option:hover,
.rotate_option:hover {
background: black; background: black;
color: white; color: white;
} }

View file

@ -21,37 +21,47 @@ PDFJS.Reader = function(bookPath, _options) {
search = window.location.search; search = window.location.search;
var TEXT_RENDER_DELAY = 200, // ms var TEXT_RENDER_DELAY = 200, // ms
PAGE_RENDER_DELAY = 200; // ms PAGE_RENDER_DELAY = 200, // ms
MAX_CANVAS_PIXELS = 5242880,
CSS_UNITS = 96.0 / 72.0,
MIN_SCALE = 0.25,
MAX_SCALE = 10.0,
DEFAULT_SCALE = 1;
this.settings = this.defaults(_options || {}, { this.settings = this.defaults(_options || {}, {
bookPath: bookPath, bookPath: bookPath,
textRenderDelay: TEXT_RENDER_DELAY, textRenderDelay: TEXT_RENDER_DELAY,
pageRenderDelay: PAGE_RENDER_DELAY, pageRenderDelay: PAGE_RENDER_DELAY,
textSelect: true, // true || false, add selectable text layer canvasLimit: 0,
doubleBuffer: true, // true || false, draw to off-screen canvas cssZoomOnly: false, // true || false, only zoom using CSS, render document at 100% size
textSelect: false, // true || false, add selectable text layer
doubleBuffer: true, // true || false, draw to off-screen canvas
numPages: 0, numPages: 0,
currentPage: 1, currentPage: 1,
scale: 1, scale: DEFAULT_SCALE,
oddPageRight: true, // when true, odd pages render on the right side oddPageRight: true, // when true, odd pages render on the right side
zoomLevel: window.outerWidth > window.outerHeight ? "spread" : "fit_page", // spread, fit_page, fit_width, percentage zoomLevel: window.outerWidth > window.outerHeight ? "spread" : "fit_page", // spread, fit_page, fit_width, percentage
rotation: 0, // 0 || 90 || 180 || 270
history: true, history: true,
keyboard: { keyboard: {
32: 'next', // space 32: 'next', // space
34: 'next', // page-down 34: 'next', // page-down
39: 'next', // cursor-right 39: 'next', // cursor-right
33: 'previous', // page-up 33: 'previous', // page-up
37: 'previous', // cursor-left 37: 'previous', // cursor-left
36: 'first', // home 36: 'first', // home
35: 'last', // end 35: 'last', // end
65: 'annotate', // a 65: 'annotate', // a
66: 'bookmark', // b 66: 'bookmark', // b
82: 'reflow', // r 76: 'rotateLeft', // l
83: 'toggleSidebar', // s 82: 'rotateRight', // r
84: 'toggleTitlebar', // t 90: 'toggleZoom', // z
68: 'toggleDay', // d 83: 'toggleSidebar',// s
78: 'toggleNight', // n 84: 'toggleTitlebar', // t
68: 'toggleDay', // d
78: 'toggleNight', // n
70: 'toggleFullscreen', // f 70: 'toggleFullscreen', // f
27: 'closeSidebar' // esc 27: 'closeSidebar' // esc
}, },
nightMode: false, nightMode: false,
dayMode: false, dayMode: false,
@ -126,6 +136,11 @@ PDFJS.Reader = function(bookPath, _options) {
this.sideBarOpen = false; this.sideBarOpen = false;
this.viewerResized = false; this.viewerResized = false;
this.pageNumPending = null; this.pageNumPending = null;
this.output_scaled = false;
this.restricted_scaling = false;
this.CSS_UNITS = CSS_UNITS;
this.MIN_SCALE = MIN_SCALE;
this.MAX_SCALE = MAX_SCALE;
PDFJS.getDocument(reader.settings.bookPath).then(function(_book) { PDFJS.getDocument(reader.settings.bookPath).then(function(_book) {
reader.book = book = _book; reader.book = book = _book;
@ -167,6 +182,15 @@ PDFJS.Reader.prototype.setZoom = function(zoom) {
reader.queuePage(page); reader.queuePage(page);
}; };
PDFJS.Reader.prototype.setRotation = function (rotation) {
var reader = this,
page = reader.settings.currentPage;
reader.settings.rotation = rotation;
reader.queuePage(page);
};
PDFJS.Reader.prototype.cancelRender = function (index) { PDFJS.Reader.prototype.cancelRender = function (index) {
var reader = this, var reader = this,
@ -201,18 +225,24 @@ PDFJS.Reader.prototype.renderPage = function(pageNum) {
outputscale, outputscale,
max_view_width, max_view_width,
max_view_height, max_view_height,
page_width,
page_height,
scale_width, scale_width,
scale_height, scale_height,
view_aspect, view_aspect,
document_aspect, document_aspect,
scale, scale,
page_rotation,
rotation,
initial_viewport,
viewport, viewport,
zoom, zoom,
fraction, fraction,
offset, offset,
renderContext, renderContext,
renderTask, renderTask,
resourcelst; resourcelst,
swap_orientation;
max_view_width = window.innerWidth; max_view_width = window.innerWidth;
max_view_height = window.innerHeight; max_view_height = window.innerHeight;
@ -232,6 +262,8 @@ PDFJS.Reader.prototype.renderPage = function(pageNum) {
index = 0; index = 0;
// hide second canvas // hide second canvas
reader.resourcelst[1].canvas.style.display = "none"; reader.resourcelst[1].canvas.style.display = "none";
// clear text layer
reader.resourcelst[1].textdiv.innerHTML = "";
// don't try to render non-existing page 0 (which is used // don't try to render non-existing page 0 (which is used
// to indicate the empty left page when oddPageRight === true) // to indicate the empty left page when oddPageRight === true)
@ -267,11 +299,16 @@ PDFJS.Reader.prototype.renderPage = function(pageNum) {
this.book.getPage(pageNum).then(function(page) { this.book.getPage(pageNum).then(function(page) {
//console.log(page); //console.log(page);
var page_width = page.pageInfo.view[2]; page_rotation = page.rotate;
var page_height = page.pageInfo.view[3]; rotation = (page_rotation + reader.settings.rotation) % 360;
//initial_viewport = page.getViewport({scale: 1, rotation: rotation});
initial_viewport = page.getViewport(1, rotation);
page_width = initial_viewport.width;
page_height = initial_viewport.height;
document_aspect = parseFloat(page_width / page_height); document_aspect = parseFloat(page_width / page_height);
view_aspect = parseFloat(max_view_width / max_view_height); view_aspect = parseFloat(max_view_width / max_view_height);
scale_height = parseFloat(max_view_height / page_height); scale_height = parseFloat(max_view_height / page_height);
scale_width = parseFloat(max_view_width / page_width); scale_width = parseFloat(max_view_width / page_width);
@ -284,9 +321,10 @@ PDFJS.Reader.prototype.renderPage = function(pageNum) {
+ " v_a: " + view_aspect + " v_a: " + view_aspect
+ " s_w: " + scale_width + " s_w: " + scale_width
+ " s_h: " + scale_height + " s_h: " + scale_height
+ " p_r: " + page_rotation
+ " r: " + rotation
+ " o: " + outputscale); + " o: " + outputscale);
console.log("fraction: "); console.log("fraction: ", fraction);
console.log(fraction);
*/ */
switch (reader.settings.zoomLevel) { switch (reader.settings.zoomLevel) {
@ -330,19 +368,45 @@ PDFJS.Reader.prototype.renderPage = function(pageNum) {
default: default:
$viewer.removeClass("flex"); $viewer.removeClass("flex");
scale = parseFloat(reader.settings.zoomLevel); scale = parseFloat(reader.settings.zoomLevel * reader.CSS_UNITS);
canvas.width = reader.roundToDivide(parseInt(page_width * scale * outputscale), fraction[0]); ; canvas.width = reader.roundToDivide(parseInt(page_width * scale * outputscale), fraction[0]); ;
canvas.height = reader.roundToDivide(parseInt(page_height * scale * outputscale), fraction[0]); canvas.height = reader.roundToDivide(parseInt(page_height * scale * outputscale), fraction[0]);
break; break;
} }
//console.log(canvas.width + " " + canvas.height); viewport = initial_viewport.clone({scale: scale, rotation: rotation});
if (reader.settings.cssZoomOnly) {
console.log("css zoom only");
var actualSizeViewport = viewport.clone({scale: 1});
canvas.width = actualSizeViewport.width;
canvas.height = actualSizeViewport.height;
outputscale = actualSizeViewport.width / viewport.width;
reader.output_scaled = true;
}
if (reader.settings.canvasLimit > 0) {
console.log("canvas is limited");
var pixelsInViewport = viewport.width * viewport.height;
var maxscale =
Math.sqrt(reader.settings.canvasLimit / pixelsInViewport);
if (outputscale > maxscale) {
console.log("outputscale: " + outputscale, "maxscale: " + maxscale);
outputscale = maxscale;
reader.output_scaled = true;
reader.restricted_scaling = true;
} else {
reader.restricted_scaling = false;
}
}
//console.log("outputscale: " + outputscale);
//console.log("canvas w x h: " + canvas.width + " x " + canvas.height);
transform = (outputscale === 1) transform = (outputscale === 1)
? null ? null
: [outputscale, 0, 0, outputscale, 0, 0]; : [outputscale, 0, 0, outputscale, 0, 0];
viewport = page.getViewport(scale);
if (outputscale !== 1) { if (outputscale !== 1) {
canvas.style.width = reader.roundToDivide(viewport.width, fraction[1]) + 'px'; canvas.style.width = reader.roundToDivide(viewport.width, fraction[1]) + 'px';
@ -361,7 +425,7 @@ PDFJS.Reader.prototype.renderPage = function(pageNum) {
top: offset.top, top: offset.top,
left: offset.left left: offset.left
}); });
page.getTextContent().then(function (textContent) { page.getTextContent({ normalizeWhitespace: true }).then(function (textContent) {
resourcelst.textLayer = textLayer = new PDFJS.Reader.TextLayerController({ resourcelst.textLayer = textLayer = new PDFJS.Reader.TextLayerController({
textLayerDiv: textdiv, textLayerDiv: textdiv,
pageIdx: pageNum - 1, pageIdx: pageNum - 1,
@ -413,39 +477,18 @@ PDFJS.Reader.prototype.renderPage = function(pageNum) {
}); });
} else { } else {
// clear canvas, use maximum size // clear canvas (by resizing it), use maximum size
canvas.width = 0;
canvas.height = 0;
canvas.width = reader.roundToDivide(max_view_width * outputscale, fraction[0]); canvas.width = reader.roundToDivide(max_view_width * outputscale, fraction[0]);
canvas.height = reader.roundToDivide(max_view_height * outputscale, fraction[0]); canvas.height = reader.roundToDivide(max_view_height * outputscale, fraction[0]);
if (outputscale !== 1) { if (outputscale !== 1) {
canvas.style.width = reader.roundToDivide(max_view_width, fraction[1]) + 'px'; canvas.style.width = reader.roundToDivide(max_view_width, fraction[1]) + 'px';
canvas.style.height = reader.roundToDivide(max_view_height, fraction[1]) + 'px'; canvas.style.height = reader.roundToDivide(max_view_height, fraction[1]) + 'px';
} }
ctx.clearRect(0, 0, canvas.width, canvas.height); // resizing clears canvas so this is not needed...
//ctx.clearRect(0, 0, canvas.width, canvas.height);
} }
/*
if (index === 0) {
if (pageNum > 0) {
$page_num.textContent = pageNum.toString();
}
reader.settings.currentPage = pageNum;
} else {
if (pageNum === 1) {
$page_num.textContent = pageNum.toString();
} else if (pageNum <= reader.settings.numPages) {
var text = $page_num.textContent;
text += "-" + pageNum.toString();
$page_num.textContent = text;
}
}
*/
}; };
PDFJS.Reader.prototype.queuePage = function(page) { PDFJS.Reader.prototype.queuePage = function(page) {
@ -619,5 +662,15 @@ PDFJS.Reader.prototype.approximateFraction = function (x) {
}; };
PDFJS.Reader.prototype.isMobile = function () { PDFJS.Reader.prototype.isMobile = function () {
return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
var reader = this;
var isMobile = (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
if (isMobile) {
reader.isMobile = true;
reader.canvasLimit = reader.settings.canvasLimit;
}
return isMobile;
}; };