commit
1b0bf24322
1
Makefile
1
Makefile
@ -215,6 +215,7 @@ EXTENSION_WEB_FILES = \
|
|||||||
web/viewer.js \
|
web/viewer.js \
|
||||||
web/viewer.html \
|
web/viewer.html \
|
||||||
web/viewer-production.html \
|
web/viewer-production.html \
|
||||||
|
web/debugger.js \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
FIREFOX_BUILD_DIR := $(BUILD_DIR)/firefox
|
FIREFOX_BUILD_DIR := $(BUILD_DIR)/firefox
|
||||||
|
@ -269,7 +269,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
},
|
},
|
||||||
|
|
||||||
executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR,
|
executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR,
|
||||||
executionStartIdx, continueCallback) {
|
executionStartIdx, continueCallback,
|
||||||
|
stepper) {
|
||||||
var argsArray = codeIR.argsArray;
|
var argsArray = codeIR.argsArray;
|
||||||
var fnArray = codeIR.fnArray;
|
var fnArray = codeIR.fnArray;
|
||||||
var i = executionStartIdx || 0;
|
var i = executionStartIdx || 0;
|
||||||
@ -288,6 +289,11 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
var slowCommands = this.slowCommands;
|
var slowCommands = this.slowCommands;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
if (stepper && i === stepper.nextBreakPoint) {
|
||||||
|
stepper.breakIt(i, continueCallback);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
fnName = fnArray[i];
|
fnName = fnArray[i];
|
||||||
|
|
||||||
if (fnName !== 'dependency') {
|
if (fnName !== 'dependency') {
|
||||||
|
@ -57,6 +57,7 @@ function getPdf(arg, callback) {
|
|||||||
xhr.send(null);
|
xhr.send(null);
|
||||||
}
|
}
|
||||||
globalScope.PDFJS.getPdf = getPdf;
|
globalScope.PDFJS.getPdf = getPdf;
|
||||||
|
globalScope.PDFJS.pdfBug = false;
|
||||||
|
|
||||||
var Page = (function PageClosure() {
|
var Page = (function PageClosure() {
|
||||||
function Page(xref, pageNumber, pageDict, ref) {
|
function Page(xref, pageNumber, pageDict, ref) {
|
||||||
@ -254,10 +255,16 @@ var Page = (function PageClosure() {
|
|||||||
var startIdx = 0;
|
var startIdx = 0;
|
||||||
var length = this.IRQueue.fnArray.length;
|
var length = this.IRQueue.fnArray.length;
|
||||||
var IRQueue = this.IRQueue;
|
var IRQueue = this.IRQueue;
|
||||||
|
var stepper = null;
|
||||||
|
if (PDFJS.pdfBug && StepperManager.enabled) {
|
||||||
|
stepper = StepperManager.create(this.pageNumber);
|
||||||
|
stepper.init(IRQueue);
|
||||||
|
stepper.nextBreakPoint = stepper.getNextBreakPoint();
|
||||||
|
}
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
function next() {
|
function next() {
|
||||||
startIdx = gfx.executeIRQueue(IRQueue, startIdx, next);
|
startIdx = gfx.executeIRQueue(IRQueue, startIdx, next, stepper);
|
||||||
if (startIdx == length) {
|
if (startIdx == length) {
|
||||||
self.stats.render = Date.now();
|
self.stats.render = Date.now();
|
||||||
gfx.endDrawing();
|
gfx.endDrawing();
|
||||||
|
@ -2225,6 +2225,9 @@ var Font = (function FontClosure() {
|
|||||||
var styleSheet = styleElement.sheet;
|
var styleSheet = styleElement.sheet;
|
||||||
styleSheet.insertRule(rule, styleSheet.cssRules.length);
|
styleSheet.insertRule(rule, styleSheet.cssRules.length);
|
||||||
|
|
||||||
|
if (PDFJS.pdfBug && FontInspector.enabled)
|
||||||
|
FontInspector.fontAdded(this, url);
|
||||||
|
|
||||||
return rule;
|
return rule;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
396
web/debugger.js
Normal file
396
web/debugger.js
Normal file
@ -0,0 +1,396 @@
|
|||||||
|
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var FontInspector = (function FontInspectorClosure() {
|
||||||
|
var fonts;
|
||||||
|
var panelWidth = 300;
|
||||||
|
var active = false;
|
||||||
|
var fontAttribute = 'data-font-name';
|
||||||
|
function removeSelection() {
|
||||||
|
var divs = document.querySelectorAll('div[' + fontAttribute + ']');
|
||||||
|
for (var i = 0, ii = divs.length; i < ii; ++i) {
|
||||||
|
var div = divs[i];
|
||||||
|
div.className = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function resetSelection() {
|
||||||
|
var divs = document.querySelectorAll('div[' + fontAttribute + ']');
|
||||||
|
for (var i = 0, ii = divs.length; i < ii; ++i) {
|
||||||
|
var div = divs[i];
|
||||||
|
div.className = 'debuggerHideText';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function selectFont(fontName, show) {
|
||||||
|
var divs = document.querySelectorAll('div[' + fontAttribute + '=' +
|
||||||
|
fontName + ']');
|
||||||
|
for (var i = 0, ii = divs.length; i < ii; ++i) {
|
||||||
|
var div = divs[i];
|
||||||
|
div.className = show ? 'debuggerShowText' : 'debuggerHideText';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function textLayerClick(e) {
|
||||||
|
if (!e.target.dataset.fontName || e.target.tagName != 'DIV')
|
||||||
|
return;
|
||||||
|
var fontName = e.target.dataset.fontName;
|
||||||
|
var selects = document.getElementsByTagName('input');
|
||||||
|
for (var i = 0; i < selects.length; ++i) {
|
||||||
|
var select = selects[i];
|
||||||
|
if (select.dataset.fontName != fontName) continue;
|
||||||
|
select.checked = !select.checked;
|
||||||
|
selectFont(fontName, select.checked);
|
||||||
|
select.scrollIntoView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
// Poperties/functions needed by PDFBug.
|
||||||
|
id: 'FontInspector',
|
||||||
|
name: 'Font Inspector',
|
||||||
|
panel: null,
|
||||||
|
manager: null,
|
||||||
|
init: function init() {
|
||||||
|
var panel = this.panel;
|
||||||
|
panel.setAttribute('style', 'padding: 5px;');
|
||||||
|
var tmp = document.createElement('button');
|
||||||
|
tmp.addEventListener('click', resetSelection);
|
||||||
|
tmp.textContent = 'Refresh';
|
||||||
|
panel.appendChild(tmp);
|
||||||
|
|
||||||
|
fonts = document.createElement('div');
|
||||||
|
panel.appendChild(fonts);
|
||||||
|
},
|
||||||
|
enabled: false,
|
||||||
|
get active() {
|
||||||
|
return active;
|
||||||
|
},
|
||||||
|
set active(value) {
|
||||||
|
active = value;
|
||||||
|
if (active) {
|
||||||
|
document.body.addEventListener('click', textLayerClick, true);
|
||||||
|
resetSelection();
|
||||||
|
} else {
|
||||||
|
document.body.removeEventListener('click', textLayerClick, true);
|
||||||
|
removeSelection();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// FontInspector specific functions.
|
||||||
|
fontAdded: function fontAdded(fontObj, url) {
|
||||||
|
function properties(obj, list) {
|
||||||
|
var moreInfo = document.createElement('table');
|
||||||
|
for (var i = 0; i < list.length; i++) {
|
||||||
|
var tr = document.createElement('tr');
|
||||||
|
var td1 = document.createElement('td');
|
||||||
|
td1.textContent = list[i];
|
||||||
|
tr.appendChild(td1);
|
||||||
|
var td2 = document.createElement('td');
|
||||||
|
td2.textContent = obj[list[i]].toString();
|
||||||
|
tr.appendChild(td2);
|
||||||
|
moreInfo.appendChild(tr);
|
||||||
|
}
|
||||||
|
return moreInfo;
|
||||||
|
}
|
||||||
|
var moreInfo = properties(fontObj, ['name', 'type']);
|
||||||
|
var m = /url\(['"]?([^\)"']+)/.exec(url);
|
||||||
|
var fontName = fontObj.loadedName;
|
||||||
|
var font = document.createElement('div');
|
||||||
|
var name = document.createElement('span');
|
||||||
|
name.textContent = fontName;
|
||||||
|
var download = document.createElement('a');
|
||||||
|
download.href = m[1];
|
||||||
|
download.textContent = 'Download';
|
||||||
|
var logIt = document.createElement('a');
|
||||||
|
logIt.href = '';
|
||||||
|
logIt.textContent = 'Log';
|
||||||
|
logIt.addEventListener('click', function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
console.log(fontObj);
|
||||||
|
});
|
||||||
|
var select = document.createElement('input');
|
||||||
|
select.setAttribute('type', 'checkbox');
|
||||||
|
select.dataset.fontName = fontName;
|
||||||
|
select.addEventListener('click', (function(select, fontName) {
|
||||||
|
return (function() {
|
||||||
|
selectFont(fontName, select.checked);
|
||||||
|
});
|
||||||
|
})(select, fontName));
|
||||||
|
font.appendChild(select);
|
||||||
|
font.appendChild(name);
|
||||||
|
font.appendChild(document.createTextNode(' '));
|
||||||
|
font.appendChild(download);
|
||||||
|
font.appendChild(document.createTextNode(' '));
|
||||||
|
font.appendChild(logIt);
|
||||||
|
font.appendChild(moreInfo);
|
||||||
|
fonts.appendChild(font);
|
||||||
|
// Somewhat of a hack, should probably add a hook for when the text layer
|
||||||
|
// is done rendering.
|
||||||
|
setTimeout(function() {
|
||||||
|
if (this.active)
|
||||||
|
resetSelection();
|
||||||
|
}.bind(this), 2000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
// Manages all the page steppers.
|
||||||
|
var StepperManager = (function StepperManagerClosure() {
|
||||||
|
var steppers = [];
|
||||||
|
var stepperDiv = null;
|
||||||
|
var stepperControls = null;
|
||||||
|
var stepperChooser = null;
|
||||||
|
var breakPoints = {};
|
||||||
|
return {
|
||||||
|
// Poperties/functions needed by PDFBug.
|
||||||
|
id: 'Stepper',
|
||||||
|
name: 'Stepper',
|
||||||
|
panel: null,
|
||||||
|
manager: null,
|
||||||
|
init: function init() {
|
||||||
|
var self = this;
|
||||||
|
this.panel.setAttribute('style', 'padding: 5px;');
|
||||||
|
stepperControls = document.createElement('div');
|
||||||
|
stepperChooser = document.createElement('select');
|
||||||
|
stepperChooser.addEventListener('change', function(event) {
|
||||||
|
self.selectStepper(this.value);
|
||||||
|
});
|
||||||
|
stepperControls.appendChild(stepperChooser);
|
||||||
|
stepperDiv = document.createElement('div');
|
||||||
|
this.panel.appendChild(stepperControls);
|
||||||
|
this.panel.appendChild(stepperDiv);
|
||||||
|
if (sessionStorage.getItem('pdfjsBreakPoints'))
|
||||||
|
breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
|
||||||
|
},
|
||||||
|
enabled: false,
|
||||||
|
active: false,
|
||||||
|
// Stepper specific functions.
|
||||||
|
create: function create(pageNumber) {
|
||||||
|
var debug = document.createElement('div');
|
||||||
|
debug.id = 'stepper' + pageNumber;
|
||||||
|
debug.setAttribute('hidden', true);
|
||||||
|
debug.className = 'stepper';
|
||||||
|
stepperDiv.appendChild(debug);
|
||||||
|
var b = document.createElement('option');
|
||||||
|
b.textContent = 'Page ' + (pageNumber + 1);
|
||||||
|
b.value = pageNumber;
|
||||||
|
stepperChooser.appendChild(b);
|
||||||
|
var initBreakPoints = breakPoints[pageNumber] || [];
|
||||||
|
var stepper = new Stepper(debug, pageNumber, initBreakPoints);
|
||||||
|
steppers.push(stepper);
|
||||||
|
if (steppers.length === 1)
|
||||||
|
this.selectStepper(pageNumber, false);
|
||||||
|
return stepper;
|
||||||
|
},
|
||||||
|
selectStepper: function selectStepper(pageNumber, selectPanel) {
|
||||||
|
if (selectPanel)
|
||||||
|
this.manager.selectPanel(1);
|
||||||
|
for (var i = 0; i < steppers.length; ++i) {
|
||||||
|
var stepper = steppers[i];
|
||||||
|
if (stepper.pageNumber == pageNumber)
|
||||||
|
stepper.panel.removeAttribute('hidden');
|
||||||
|
else
|
||||||
|
stepper.panel.setAttribute('hidden', true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
saveBreakPoints: function saveBreakPoints(pageNumber, bps) {
|
||||||
|
breakPoints[pageNumber] = bps;
|
||||||
|
sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
// The stepper for each page's IRQueue.
|
||||||
|
var Stepper = (function StepperClosure() {
|
||||||
|
function Stepper(panel, pageNumber, initialBreakPoints) {
|
||||||
|
this.panel = panel;
|
||||||
|
this.len;
|
||||||
|
this.breakPoint = 0;
|
||||||
|
this.nextBreakPoint = null;
|
||||||
|
this.pageNumber = pageNumber;
|
||||||
|
this.breakPoints = initialBreakPoints;
|
||||||
|
this.currentIdx = -1;
|
||||||
|
}
|
||||||
|
Stepper.prototype = {
|
||||||
|
init: function init(IRQueue) {
|
||||||
|
// Shorter way to create element and optionally set textContent.
|
||||||
|
function c(tag, textContent) {
|
||||||
|
var d = document.createElement(tag);
|
||||||
|
if (textContent)
|
||||||
|
d.textContent = textContent;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
var panel = this.panel;
|
||||||
|
this.len = IRQueue.fnArray.length;
|
||||||
|
var content = c('div', 'c=continue, s=step');
|
||||||
|
var table = c('table');
|
||||||
|
content.appendChild(table);
|
||||||
|
table.cellSpacing = 0;
|
||||||
|
var headerRow = c('tr');
|
||||||
|
table.appendChild(headerRow);
|
||||||
|
headerRow.appendChild(c('th', 'Break'));
|
||||||
|
headerRow.appendChild(c('th', 'Idx'));
|
||||||
|
headerRow.appendChild(c('th', 'fn'));
|
||||||
|
headerRow.appendChild(c('th', 'args'));
|
||||||
|
|
||||||
|
for (var i = 0; i < IRQueue.fnArray.length; i++) {
|
||||||
|
var line = c('tr');
|
||||||
|
line.className = 'line';
|
||||||
|
line.id = 'idx' + i;
|
||||||
|
table.appendChild(line);
|
||||||
|
var checked = this.breakPoints.indexOf(i) != -1;
|
||||||
|
var args = IRQueue.argsArray[i] ? IRQueue.argsArray[i] : [];
|
||||||
|
|
||||||
|
var breakCell = c('td');
|
||||||
|
var cbox = c('input');
|
||||||
|
cbox.type = 'checkbox';
|
||||||
|
cbox.className = 'points';
|
||||||
|
cbox.checked = checked;
|
||||||
|
var self = this;
|
||||||
|
cbox.onclick = (function(x) {
|
||||||
|
return function() {
|
||||||
|
if (this.checked)
|
||||||
|
self.breakPoints.push(x);
|
||||||
|
else
|
||||||
|
self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
|
||||||
|
StepperManager.saveBreakPoints(self.pageNumber, self.breakPoints);
|
||||||
|
}
|
||||||
|
})(i);
|
||||||
|
|
||||||
|
breakCell.appendChild(cbox);
|
||||||
|
line.appendChild(breakCell);
|
||||||
|
line.appendChild(c('td', i.toString()));
|
||||||
|
line.appendChild(c('td', IRQueue.fnArray[i]));
|
||||||
|
line.appendChild(c('td', args.join(', ')));
|
||||||
|
}
|
||||||
|
panel.appendChild(content);
|
||||||
|
var self = this;
|
||||||
|
},
|
||||||
|
getNextBreakPoint: function getNextBreakPoint() {
|
||||||
|
this.breakPoints.sort(function(a, b) { return a - b; });
|
||||||
|
for (var i = 0; i < this.breakPoints.length; i++) {
|
||||||
|
if (this.breakPoints[i] > this.currentIdx)
|
||||||
|
return this.breakPoints[i];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
breakIt: function breakIt(idx, callback) {
|
||||||
|
StepperManager.selectStepper(this.pageNumber, true);
|
||||||
|
var self = this;
|
||||||
|
var dom = document;
|
||||||
|
self.currentIdx = idx;
|
||||||
|
var listener = function(e) {
|
||||||
|
switch (e.keyCode) {
|
||||||
|
case 83: // step
|
||||||
|
dom.removeEventListener('keydown', listener, false);
|
||||||
|
self.nextBreakPoint = self.currentIdx + 1;
|
||||||
|
self.goTo(-1);
|
||||||
|
callback();
|
||||||
|
break;
|
||||||
|
case 67: // continue
|
||||||
|
dom.removeEventListener('keydown', listener, false);
|
||||||
|
var breakPoint = self.getNextBreakPoint();
|
||||||
|
self.nextBreakPoint = breakPoint;
|
||||||
|
self.goTo(-1);
|
||||||
|
callback();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dom.addEventListener('keydown', listener, false);
|
||||||
|
self.goTo(idx);
|
||||||
|
},
|
||||||
|
goTo: function goTo(idx) {
|
||||||
|
var allRows = this.panel.getElementsByClassName('line');
|
||||||
|
for (var x = 0; x < allRows.length; x++) {
|
||||||
|
allRows[x].style.backgroundColor = null;
|
||||||
|
}
|
||||||
|
var row = document.getElementById('idx' + idx);
|
||||||
|
if (row) {
|
||||||
|
row.style.backgroundColor = 'rgb(251,250,207)';
|
||||||
|
row.scrollIntoView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return Stepper;
|
||||||
|
})();
|
||||||
|
|
||||||
|
// Manages all the debugging tools.
|
||||||
|
var PDFBug = (function PDFBugClosure() {
|
||||||
|
var panelWidth = 300;
|
||||||
|
var buttons = [];
|
||||||
|
var activePanel = null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
tools: [
|
||||||
|
FontInspector,
|
||||||
|
StepperManager
|
||||||
|
],
|
||||||
|
init: function init() {
|
||||||
|
/*
|
||||||
|
* Basic Layout:
|
||||||
|
* PDFBug
|
||||||
|
* Controls
|
||||||
|
* Panels
|
||||||
|
* Panel
|
||||||
|
* Panel
|
||||||
|
* ...
|
||||||
|
*/
|
||||||
|
var ui = document.createElement('div');
|
||||||
|
ui.id = 'PDFBug';
|
||||||
|
|
||||||
|
var controls = document.createElement('div');
|
||||||
|
controls.setAttribute('class', 'controls');
|
||||||
|
ui.appendChild(controls);
|
||||||
|
|
||||||
|
var panels = document.createElement('div');
|
||||||
|
panels.setAttribute('class', 'panels');
|
||||||
|
ui.appendChild(panels);
|
||||||
|
|
||||||
|
document.body.appendChild(ui);
|
||||||
|
document.body.style.paddingRight = panelWidth + 'px';
|
||||||
|
|
||||||
|
// Initialize all the debugging tools.
|
||||||
|
var tools = this.tools;
|
||||||
|
for (var i = 0; i < tools.length; ++i) {
|
||||||
|
var tool = tools[i];
|
||||||
|
var panel = document.createElement('div');
|
||||||
|
var panelButton = document.createElement('button');
|
||||||
|
panelButton.textContent = tool.name;
|
||||||
|
var self = this;
|
||||||
|
panelButton.addEventListener('click', (function(selected) {
|
||||||
|
return function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
self.selectPanel(selected);
|
||||||
|
};
|
||||||
|
})(i));
|
||||||
|
controls.appendChild(panelButton);
|
||||||
|
panels.appendChild(panel);
|
||||||
|
tool.panel = panel;
|
||||||
|
tool.manager = this;
|
||||||
|
if (tool.enabled)
|
||||||
|
tool.init();
|
||||||
|
else
|
||||||
|
panel.textContent = tool.name + ' is disabled. To enable add ' +
|
||||||
|
' "' + tool.id + '" to the pdfBug parameter ' +
|
||||||
|
'and refresh (seperate multiple by commas).';
|
||||||
|
buttons.push(panelButton);
|
||||||
|
}
|
||||||
|
this.selectPanel(0);
|
||||||
|
},
|
||||||
|
selectPanel: function selectPanel(index) {
|
||||||
|
if (index === activePanel)
|
||||||
|
return;
|
||||||
|
activePanel = index;
|
||||||
|
var tools = this.tools;
|
||||||
|
for (var j = 0; j < tools.length; ++j) {
|
||||||
|
if (j == index) {
|
||||||
|
buttons[j].setAttribute('class', 'active');
|
||||||
|
tools[j].active = true;
|
||||||
|
tools[j].panel.removeAttribute('hidden');
|
||||||
|
} else {
|
||||||
|
buttons[j].setAttribute('class', '');
|
||||||
|
tools[j].active = false;
|
||||||
|
tools[j].panel.setAttribute('hidden', 'true');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
@ -405,3 +405,40 @@ canvas {
|
|||||||
margin: 100px 0;
|
margin: 100px 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#PDFBug {
|
||||||
|
font-size: 10px;
|
||||||
|
position: fixed;
|
||||||
|
top: 35px;
|
||||||
|
bottom: 5px;
|
||||||
|
right: 2px;
|
||||||
|
width: 300px;
|
||||||
|
background: white;
|
||||||
|
border: 1px solid #666;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
#PDFBug .controls {
|
||||||
|
border-bottom: 1px solid #666;
|
||||||
|
padding: 3px;
|
||||||
|
background: -moz-linear-gradient(center bottom, #eee 0%, #fff 100%);
|
||||||
|
}
|
||||||
|
#PDFBug .panels {
|
||||||
|
overflow: auto;
|
||||||
|
position: absolute;
|
||||||
|
top: 27px;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
#PDFBug button.active {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.debuggerShowText {
|
||||||
|
background: yellow;
|
||||||
|
color: blue;
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
.debuggerHideText:hover {
|
||||||
|
background: yellow;
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
@ -30,8 +30,10 @@
|
|||||||
<script type="text/javascript" src="../external/jpgjs/jpg.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
<script type="text/javascript" src="../external/jpgjs/jpg.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/jpx.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
<script type="text/javascript" src="../src/jpx.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
<script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
|
<script type="text/javascript" src="debugger.js"></script>
|
||||||
<script type="text/javascript" src="viewer.js"></script>
|
<script type="text/javascript" src="viewer.js"></script>
|
||||||
|
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
@ -504,13 +504,7 @@ var PDFView = {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (hash.indexOf('=') >= 0) {
|
if (hash.indexOf('=') >= 0) {
|
||||||
// parsing query string
|
var params = PDFView.parseQueryString(hash);
|
||||||
var paramsPairs = hash.split('&');
|
|
||||||
var params = {};
|
|
||||||
for (var i = 0; i < paramsPairs.length; ++i) {
|
|
||||||
var paramPair = paramsPairs[i].split('=');
|
|
||||||
params[paramPair[0]] = paramPair[1];
|
|
||||||
}
|
|
||||||
// borrowing syntax from "Parameters for Opening PDF Files"
|
// borrowing syntax from "Parameters for Opening PDF Files"
|
||||||
if ('nameddest' in params) {
|
if ('nameddest' in params) {
|
||||||
PDFView.navigateTo(params.nameddest);
|
PDFView.navigateTo(params.nameddest);
|
||||||
@ -622,6 +616,16 @@ var PDFView = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return visibleThumbs;
|
return visibleThumbs;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Helper function to parse query string (e.g. ?param1=value&parm2=...).
|
||||||
|
parseQueryString: function pdfViewParseQueryString(query) {
|
||||||
|
var params = query.split('&');
|
||||||
|
for (var i = 0; i < params.length; i++) {
|
||||||
|
var param = params[i].split('=');
|
||||||
|
params[unescape(param[0])] = unescape(param[1]);
|
||||||
|
}
|
||||||
|
return params;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1083,6 +1087,7 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) {
|
|||||||
// vScale and hScale already contain the scaling to pixel units
|
// vScale and hScale already contain the scaling to pixel units
|
||||||
var fontHeight = fontSize * text.geom.vScale;
|
var fontHeight = fontSize * text.geom.vScale;
|
||||||
textDiv.dataset.canvasWidth = text.canvasWidth * text.geom.hScale;
|
textDiv.dataset.canvasWidth = text.canvasWidth * text.geom.hScale;
|
||||||
|
textDiv.dataset.fontName = fontName;
|
||||||
|
|
||||||
textDiv.style.fontSize = fontHeight + 'px';
|
textDiv.style.fontSize = fontHeight + 'px';
|
||||||
textDiv.style.left = text.geom.x + 'px';
|
textDiv.style.left = text.geom.x + 'px';
|
||||||
@ -1094,16 +1099,11 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
window.addEventListener('load', function webViewerLoad(evt) {
|
window.addEventListener('load', function webViewerLoad(evt) {
|
||||||
var params = document.location.search.substring(1).split('&');
|
var params = PDFView.parseQueryString(document.location.search.substring(1));
|
||||||
for (var i = 0; i < params.length; i++) {
|
|
||||||
var param = params[i].split('=');
|
|
||||||
params[unescape(param[0])] = unescape(param[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
var scale = ('scale' in params) ? params.scale : 0;
|
|
||||||
var file = PDFJS.isFirefoxExtension ?
|
var file = PDFJS.isFirefoxExtension ?
|
||||||
window.location.toString() : params.file || kDefaultURL;
|
window.location.toString() : params.file || kDefaultURL;
|
||||||
PDFView.open(file, parseFloat(scale));
|
PDFView.open(file, 0);
|
||||||
|
|
||||||
if (PDFJS.isFirefoxExtension || !window.File || !window.FileReader ||
|
if (PDFJS.isFirefoxExtension || !window.File || !window.FileReader ||
|
||||||
!window.FileList || !window.Blob) {
|
!window.FileList || !window.Blob) {
|
||||||
@ -1114,11 +1114,32 @@ window.addEventListener('load', function webViewerLoad(evt) {
|
|||||||
document.getElementById('fileInput').value = null;
|
document.getElementById('fileInput').value = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('disableWorker' in params)
|
// Special debugging flags in the hash section of the URL.
|
||||||
PDFJS.disableWorker = (params['disableWorker'] === 'true');
|
var hash = document.location.hash.substring(1);
|
||||||
|
var hashParams = PDFView.parseQueryString(hash);
|
||||||
|
|
||||||
if ('disableTextLayer' in params)
|
if ('disableWorker' in hashParams)
|
||||||
PDFJS.disableTextLayer = (params['disableTextLayer'] === 'true');
|
PDFJS.disableWorker = (hashParams['disableWorker'] === 'true');
|
||||||
|
|
||||||
|
if ('disableTextLayer' in hashParams)
|
||||||
|
PDFJS.disableTextLayer = (hashParams['disableTextLayer'] === 'true');
|
||||||
|
|
||||||
|
if ('pdfBug' in hashParams) {
|
||||||
|
PDFJS.pdfBug = true;
|
||||||
|
var pdfBug = hashParams['pdfBug'];
|
||||||
|
var all = false, enabled = [];
|
||||||
|
if (pdfBug === 'all')
|
||||||
|
all = true;
|
||||||
|
else
|
||||||
|
enabled = pdfBug.split(',');
|
||||||
|
var debugTools = PDFBug.tools;
|
||||||
|
for (var i = 0; i < debugTools.length; ++i) {
|
||||||
|
var tool = debugTools[i];
|
||||||
|
if (all || enabled.indexOf(tool.id) !== -1)
|
||||||
|
tool.enabled = true;
|
||||||
|
}
|
||||||
|
PDFBug.init();
|
||||||
|
}
|
||||||
|
|
||||||
var sidebarScrollView = document.getElementById('sidebarScrollView');
|
var sidebarScrollView = document.getElementById('sidebarScrollView');
|
||||||
sidebarScrollView.addEventListener('scroll', updateThumbViewArea, true);
|
sidebarScrollView.addEventListener('scroll', updateThumbViewArea, true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user