Merge upstream.
This commit is contained in:
commit
0175f53637
4
Makefile
4
Makefile
@ -60,7 +60,7 @@ test: shell-test browser-test
|
|||||||
production: | bundle
|
production: | bundle
|
||||||
@echo "Preparing web/viewer-production.html"; \
|
@echo "Preparing web/viewer-production.html"; \
|
||||||
cd web; \
|
cd web; \
|
||||||
sed '/PDFJSSCRIPT_REMOVE/d' viewer.html > viewer-1.tmp; \
|
sed '/PDFJSSCRIPT_REMOVE_CORE/d' viewer.html > viewer-1.tmp; \
|
||||||
sed '/PDFJSSCRIPT_INCLUDE_BUILD/ r viewer-snippet.html' viewer-1.tmp > viewer-production.html; \
|
sed '/PDFJSSCRIPT_INCLUDE_BUILD/ r viewer-snippet.html' viewer-1.tmp > viewer-production.html; \
|
||||||
rm -f *.tmp; \
|
rm -f *.tmp; \
|
||||||
cd ..
|
cd ..
|
||||||
@ -257,7 +257,7 @@ extension: | production
|
|||||||
# Modify the viewer so it does all the extension only stuff.
|
# Modify the viewer so it does all the extension only stuff.
|
||||||
@cd $(FIREFOX_BUILD_CONTENT)/web; \
|
@cd $(FIREFOX_BUILD_CONTENT)/web; \
|
||||||
sed -i.bak '/PDFJSSCRIPT_INCLUDE_BUNDLE/ r ../build/pdf.js' viewer-snippet-firefox-extension.html; \
|
sed -i.bak '/PDFJSSCRIPT_INCLUDE_BUNDLE/ r ../build/pdf.js' viewer-snippet-firefox-extension.html; \
|
||||||
sed -i.bak '/PDFJSSCRIPT_REMOVE/d' viewer.html; \
|
sed -i.bak '/PDFJSSCRIPT_REMOVE_CORE/d' viewer.html; \
|
||||||
sed -i.bak '/PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION/d' viewer.html; \
|
sed -i.bak '/PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION/d' viewer.html; \
|
||||||
sed -i.bak '/PDFJSSCRIPT_INCLUDE_FIREFOX_EXTENSION/ r viewer-snippet-firefox-extension.html' viewer.html; \
|
sed -i.bak '/PDFJSSCRIPT_INCLUDE_FIREFOX_EXTENSION/ r viewer-snippet-firefox-extension.html' viewer.html; \
|
||||||
rm -f *.bak;
|
rm -f *.bak;
|
||||||
|
@ -37,8 +37,8 @@ auto-update extensions on a daily basis (you can change this through the
|
|||||||
`extensions.update.interval` option in `about:config`).
|
`extensions.update.interval` option in `about:config`).
|
||||||
|
|
||||||
For an experimental Chrome extension, get the code as explained below and issue `make extension`.
|
For an experimental Chrome extension, get the code as explained below and issue `make extension`.
|
||||||
Then open Chrome with the flag `--enable-experimental-extension-apis`, go to `Tools > Extension`
|
Then open Chrome, go to `Tools > Extension` and load the (unpackaged) extension
|
||||||
and load the (unpackaged) extension from the directory `extensions/chrome`.
|
from the directory `build/chrome`.
|
||||||
|
|
||||||
### Getting the code
|
### Getting the code
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"version": "0.1",
|
"version": "0.1",
|
||||||
"description": "Read PDF Document",
|
"description": "Read PDF Document",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"experimental",
|
"webRequest", "webRequestBlocking",
|
||||||
"http://*/*.pdf",
|
"http://*/*.pdf",
|
||||||
"file:///*/*.pdf"
|
"file:///*/*.pdf"
|
||||||
],
|
],
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<script>
|
<script>
|
||||||
chrome.experimental.webRequest.onBeforeRequest.addListener(
|
chrome.webRequest.onBeforeRequest.addListener(
|
||||||
function(details) {
|
function(details) {
|
||||||
var viewerPage = 'content/web/viewer.html';
|
var viewerPage = 'content/web/viewer.html';
|
||||||
var url = chrome.extension.getURL(viewerPage) + '?file=' + details.url;
|
var url = chrome.extension.getURL(viewerPage) + '?file=' + details.url;
|
||||||
|
@ -17,11 +17,15 @@ var TextRenderingMode = {
|
|||||||
ADD_TO_PATH: 7
|
ADD_TO_PATH: 7
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Minimal font size that would be used during canvas fillText operations.
|
||||||
|
var MIN_FONT_SIZE = 1;
|
||||||
|
|
||||||
var CanvasExtraState = (function CanvasExtraStateClosure() {
|
var CanvasExtraState = (function CanvasExtraStateClosure() {
|
||||||
function CanvasExtraState(old) {
|
function CanvasExtraState(old) {
|
||||||
// Are soft masks and alpha values shapes or opacities?
|
// Are soft masks and alpha values shapes or opacities?
|
||||||
this.alphaIsShape = false;
|
this.alphaIsShape = false;
|
||||||
this.fontSize = 0;
|
this.fontSize = 0;
|
||||||
|
this.fontSizeScale = 1;
|
||||||
this.textMatrix = IDENTITY_MATRIX;
|
this.textMatrix = IDENTITY_MATRIX;
|
||||||
this.fontMatrix = IDENTITY_MATRIX;
|
this.fontMatrix = IDENTITY_MATRIX;
|
||||||
this.leading = 0;
|
this.leading = 0;
|
||||||
@ -583,6 +587,9 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
this.current.font = fontObj;
|
this.current.font = fontObj;
|
||||||
this.current.fontSize = size;
|
this.current.fontSize = size;
|
||||||
|
|
||||||
|
if (fontObj.coded)
|
||||||
|
return; // we don't need ctx.font for Type3 fonts
|
||||||
|
|
||||||
var name = fontObj.loadedName || 'sans-serif';
|
var name = fontObj.loadedName || 'sans-serif';
|
||||||
var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
|
var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
|
||||||
(fontObj.bold ? 'bold' : 'normal');
|
(fontObj.bold ? 'bold' : 'normal');
|
||||||
@ -590,7 +597,16 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
var italic = fontObj.italic ? 'italic' : 'normal';
|
var italic = fontObj.italic ? 'italic' : 'normal';
|
||||||
var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif';
|
var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif';
|
||||||
var typeface = '"' + name + '", ' + serif;
|
var typeface = '"' + name + '", ' + serif;
|
||||||
var rule = italic + ' ' + bold + ' ' + size + 'px ' + typeface;
|
|
||||||
|
// Some font backends cannot handle fonts below certain size.
|
||||||
|
// Keeping the font at minimal size and using the fontSizeScale to change
|
||||||
|
// the current transformation matrix before the fillText/strokeText.
|
||||||
|
// See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
|
||||||
|
var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
|
||||||
|
this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
|
||||||
|
size / MIN_FONT_SIZE;
|
||||||
|
|
||||||
|
var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
|
||||||
this.ctx.font = rule;
|
this.ctx.font = rule;
|
||||||
},
|
},
|
||||||
setTextRenderingMode: function canvasGraphicsSetTextRenderingMode(mode) {
|
setTextRenderingMode: function canvasGraphicsSetTextRenderingMode(mode) {
|
||||||
@ -653,6 +669,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
var font = current.font;
|
var font = current.font;
|
||||||
var glyphs = font.charsToGlyphs(str);
|
var glyphs = font.charsToGlyphs(str);
|
||||||
var fontSize = current.fontSize;
|
var fontSize = current.fontSize;
|
||||||
|
var fontSizeScale = current.fontSizeScale;
|
||||||
var charSpacing = current.charSpacing;
|
var charSpacing = current.charSpacing;
|
||||||
var wordSpacing = current.wordSpacing;
|
var wordSpacing = current.wordSpacing;
|
||||||
var textHScale = current.textHScale;
|
var textHScale = current.textHScale;
|
||||||
@ -716,11 +733,16 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
else
|
else
|
||||||
lineWidth /= scale;
|
lineWidth /= scale;
|
||||||
|
|
||||||
ctx.lineWidth = lineWidth;
|
|
||||||
|
|
||||||
if (textSelection)
|
if (textSelection)
|
||||||
text.geom = this.getTextGeometry();
|
text.geom = this.getTextGeometry();
|
||||||
|
|
||||||
|
if (fontSizeScale != 1.0) {
|
||||||
|
ctx.scale(fontSizeScale, fontSizeScale);
|
||||||
|
lineWidth /= fontSizeScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.lineWidth = lineWidth;
|
||||||
|
|
||||||
var x = 0;
|
var x = 0;
|
||||||
for (var i = 0; i < glyphsLength; ++i) {
|
for (var i = 0; i < glyphsLength; ++i) {
|
||||||
var glyph = glyphs[i];
|
var glyph = glyphs[i];
|
||||||
@ -734,20 +756,21 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|||||||
var charWidth = glyph.width * fontSize * 0.001 +
|
var charWidth = glyph.width * fontSize * 0.001 +
|
||||||
Util.sign(current.fontMatrix[0]) * charSpacing;
|
Util.sign(current.fontMatrix[0]) * charSpacing;
|
||||||
|
|
||||||
|
var scaledX = x / fontSizeScale;
|
||||||
switch (textRenderingMode) {
|
switch (textRenderingMode) {
|
||||||
default: // other unsupported rendering modes
|
default: // other unsupported rendering modes
|
||||||
case TextRenderingMode.FILL:
|
case TextRenderingMode.FILL:
|
||||||
case TextRenderingMode.FILL_ADD_TO_PATH:
|
case TextRenderingMode.FILL_ADD_TO_PATH:
|
||||||
ctx.fillText(char, x, 0);
|
ctx.fillText(char, scaledX, 0);
|
||||||
break;
|
break;
|
||||||
case TextRenderingMode.STROKE:
|
case TextRenderingMode.STROKE:
|
||||||
case TextRenderingMode.STROKE_ADD_TO_PATH:
|
case TextRenderingMode.STROKE_ADD_TO_PATH:
|
||||||
ctx.strokeText(char, x, 0);
|
ctx.strokeText(char, scaledX, 0);
|
||||||
break;
|
break;
|
||||||
case TextRenderingMode.FILL_STROKE:
|
case TextRenderingMode.FILL_STROKE:
|
||||||
case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
|
case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
|
||||||
ctx.fillText(char, x, 0);
|
ctx.fillText(char, scaledX, 0);
|
||||||
ctx.strokeText(char, x, 0);
|
ctx.strokeText(char, scaledX, 0);
|
||||||
break;
|
break;
|
||||||
case TextRenderingMode.INVISIBLE:
|
case TextRenderingMode.INVISIBLE:
|
||||||
break;
|
break;
|
||||||
|
81
src/fonts.js
81
src/fonts.js
@ -1553,6 +1553,61 @@ var Font = (function FontClosure() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
|
||||||
|
if (sourceEnd - sourceStart <= 12) {
|
||||||
|
// glyph with data less than 12 is invalid one
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
var glyf = source.subarray(sourceStart, sourceEnd);
|
||||||
|
var contoursCount = (glyf[0] << 8) | glyf[1];
|
||||||
|
if (contoursCount & 0x8000) {
|
||||||
|
// complex glyph, writing as is
|
||||||
|
dest.set(glyf, destStart);
|
||||||
|
return glyf.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
var j = 10, flagsCount = 0;
|
||||||
|
for (var i = 0; i < contoursCount; i++) {
|
||||||
|
var endPoint = (glyf[j] << 8) | glyf[j + 1];
|
||||||
|
flagsCount = endPoint + 1;
|
||||||
|
j += 2;
|
||||||
|
}
|
||||||
|
// skipping instructions
|
||||||
|
var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
|
||||||
|
j += 2 + instructionsLength;
|
||||||
|
// validating flags
|
||||||
|
var coordinatesLength = 0;
|
||||||
|
for (var i = 0; i < flagsCount; i++) {
|
||||||
|
var flag = glyf[j++];
|
||||||
|
if (flag & 0xC0) {
|
||||||
|
// reserved flags must be zero, rejecting
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
|
||||||
|
((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
|
||||||
|
coordinatesLength += xyLength;
|
||||||
|
if (flag & 8) {
|
||||||
|
var repeat = glyf[j++];
|
||||||
|
i += repeat;
|
||||||
|
coordinatesLength += repeat * xyLength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var glyphDataLength = j + coordinatesLength;
|
||||||
|
if (glyphDataLength > glyf.length) {
|
||||||
|
// not enough data for coordinates
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (glyf.length - glyphDataLength > 3) {
|
||||||
|
// truncating and aligning to 4 bytes the long glyph data
|
||||||
|
glyphDataLength = (glyphDataLength + 3) & ~3;
|
||||||
|
dest.set(glyf.subarray(0, glyphDataLength), destStart);
|
||||||
|
return glyphDataLength;
|
||||||
|
}
|
||||||
|
// glyph data is fine
|
||||||
|
dest.set(glyf, destStart);
|
||||||
|
return glyf.length;
|
||||||
|
}
|
||||||
|
|
||||||
function sanitizeGlyphLocations(loca, glyf, numGlyphs,
|
function sanitizeGlyphLocations(loca, glyf, numGlyphs,
|
||||||
isGlyphLocationsLong) {
|
isGlyphLocationsLong) {
|
||||||
var itemSize, itemDecode, itemEncode;
|
var itemSize, itemDecode, itemEncode;
|
||||||
@ -1579,21 +1634,21 @@ var Font = (function FontClosure() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
var locaData = loca.data;
|
var locaData = loca.data;
|
||||||
|
// removing the invalid glyphs
|
||||||
|
var oldGlyfData = glyf.data;
|
||||||
|
var newGlyfData = new Uint8Array(oldGlyfData.length);
|
||||||
var startOffset = itemDecode(locaData, 0);
|
var startOffset = itemDecode(locaData, 0);
|
||||||
var firstOffset = itemDecode(locaData, itemSize);
|
var writeOffset = 0;
|
||||||
if (firstOffset - startOffset < 12 || startOffset > 0) {
|
itemEncode(locaData, 0, writeOffset);
|
||||||
// removing first glyph
|
for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
|
||||||
glyf.data = glyf.data.subarray(firstOffset);
|
var endOffset = itemDecode(locaData, j);
|
||||||
glyf.length -= firstOffset;
|
var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
|
||||||
|
newGlyfData, writeOffset);
|
||||||
itemEncode(locaData, 0, 0);
|
writeOffset += newLength;
|
||||||
var i, pos = itemSize;
|
itemEncode(locaData, j, writeOffset);
|
||||||
for (i = 1; i <= numGlyphs; ++i) {
|
startOffset = endOffset;
|
||||||
itemEncode(locaData, pos,
|
|
||||||
itemDecode(locaData, pos) - firstOffset);
|
|
||||||
pos += itemSize;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
glyf.data = newGlyfData.subarray(0, writeOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
function readGlyphNameMap(post, properties) {
|
function readGlyphNameMap(post, properties) {
|
||||||
|
@ -162,6 +162,10 @@ var Parser = (function ParserClosure() {
|
|||||||
|
|
||||||
return imageStream;
|
return imageStream;
|
||||||
},
|
},
|
||||||
|
fetchIfRef: function parserFetchIfRef(obj) {
|
||||||
|
// not relying on the xref.fetchIfRef -- xref might not be set
|
||||||
|
return isRef(obj) ? this.xref.fetch(obj) : obj;
|
||||||
|
},
|
||||||
makeStream: function parserMakeStream(dict, cipherTransform) {
|
makeStream: function parserMakeStream(dict, cipherTransform) {
|
||||||
var lexer = this.lexer;
|
var lexer = this.lexer;
|
||||||
var stream = lexer.stream;
|
var stream = lexer.stream;
|
||||||
@ -171,10 +175,7 @@ var Parser = (function ParserClosure() {
|
|||||||
var pos = stream.pos;
|
var pos = stream.pos;
|
||||||
|
|
||||||
// get length
|
// get length
|
||||||
var length = dict.get('Length');
|
var length = this.fetchIfRef(dict.get('Length'));
|
||||||
var xref = this.xref;
|
|
||||||
if (xref)
|
|
||||||
length = xref.fetchIfRef(length);
|
|
||||||
if (!isInt(length)) {
|
if (!isInt(length)) {
|
||||||
error('Bad ' + length + ' attribute in stream');
|
error('Bad ' + length + ' attribute in stream');
|
||||||
length = 0;
|
length = 0;
|
||||||
@ -196,8 +197,8 @@ var Parser = (function ParserClosure() {
|
|||||||
return stream;
|
return stream;
|
||||||
},
|
},
|
||||||
filter: function parserFilter(stream, dict, length) {
|
filter: function parserFilter(stream, dict, length) {
|
||||||
var filter = dict.get('Filter', 'F');
|
var filter = this.fetchIfRef(dict.get('Filter', 'F'));
|
||||||
var params = dict.get('DecodeParms', 'DP');
|
var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
|
||||||
if (isName(filter))
|
if (isName(filter))
|
||||||
return this.makeFilter(stream, filter.name, length, params);
|
return this.makeFilter(stream, filter.name, length, params);
|
||||||
if (isArray(filter)) {
|
if (isArray(filter)) {
|
||||||
|
1
test/pdfs/html5checker.pdf.link
Normal file
1
test/pdfs/html5checker.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://hsivonen.iki.fi/thesis/html5-conformance-checker.pdf
|
1
test/pdfs/issue1169.pdf.link
Normal file
1
test/pdfs/issue1169.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://www.cs.txstate.edu/~mb92/papers/gpgpu11.pdf
|
@ -64,7 +64,9 @@ MIMEs = {
|
|||||||
'.svg': 'image/svg+xml',
|
'.svg': 'image/svg+xml',
|
||||||
'.pdf': 'application/pdf',
|
'.pdf': 'application/pdf',
|
||||||
'.xhtml': 'application/xhtml+xml',
|
'.xhtml': 'application/xhtml+xml',
|
||||||
|
'.gif': 'image/gif',
|
||||||
'.ico': 'image/x-icon',
|
'.ico': 'image/x-icon',
|
||||||
|
'.png': 'image/png',
|
||||||
'.log': 'text/plain'
|
'.log': 'text/plain'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,6 +438,13 @@
|
|||||||
"link": true,
|
"link": true,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "issue1169",
|
||||||
|
"file": "pdfs/issue1169.pdf",
|
||||||
|
"md5": "3df3ed21fd43ac7fdb21e2015c8a7809",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "zerowidthline",
|
{ "id": "zerowidthline",
|
||||||
"file": "pdfs/zerowidthline.pdf",
|
"file": "pdfs/zerowidthline.pdf",
|
||||||
"md5": "295d26e61a85635433f8e4b768953f60",
|
"md5": "295d26e61a85635433f8e4b768953f60",
|
||||||
@ -445,6 +452,14 @@
|
|||||||
"link": false,
|
"link": false,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "html5checker",
|
||||||
|
"file": "pdfs/html5checker.pdf",
|
||||||
|
"md5": "74bbd80d1e7eb5f2951582233ef9ebab",
|
||||||
|
"rounds": 1,
|
||||||
|
"pageLimit": 7,
|
||||||
|
"link": true,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "issue1133",
|
{ "id": "issue1133",
|
||||||
"file": "pdfs/issue1133.pdf",
|
"file": "pdfs/issue1133.pdf",
|
||||||
"md5": "d1b61580cb100e3df93d33703af1773a",
|
"md5": "d1b61580cb100e3df93d33703af1773a",
|
||||||
|
@ -217,12 +217,15 @@
|
|||||||
var div = document.createElement('div');
|
var div = document.createElement('div');
|
||||||
if ('dataset' in div)
|
if ('dataset' in div)
|
||||||
return; // dataset property exists
|
return; // dataset property exists
|
||||||
Object.defineProperty(HTMLElement.prototype, 'dataset', {
|
var oldCreateElement = document.createElement;
|
||||||
get: function htmlElementDatasetGetter() {
|
document.createElement = function newCreateElement() {
|
||||||
// adding dataset field to the actual object
|
var result = oldCreateElement.apply(document, arguments);
|
||||||
return (this.dataset = {});
|
if (arguments[0] === 'div') {
|
||||||
|
// creating dataset property for the div elements
|
||||||
|
result.dataset = {};
|
||||||
}
|
}
|
||||||
});
|
return result;
|
||||||
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
// Check console compatability
|
// Check console compatability
|
||||||
|
BIN
web/images/pin_down.png
Normal file
BIN
web/images/pin_down.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.8 KiB |
BIN
web/images/pin_up.png
Normal file
BIN
web/images/pin_up.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.8 KiB |
@ -89,7 +89,8 @@ span#info {
|
|||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#sidebar:hover {
|
#sidebar:hover,
|
||||||
|
#sidebar.pinned {
|
||||||
left: 0px;
|
left: 0px;
|
||||||
transition: left 0.25s ease-in-out 0s;
|
transition: left 0.25s ease-in-out 0s;
|
||||||
-o-transition: left 0.25s ease-in-out 0s;
|
-o-transition: left 0.25s ease-in-out 0s;
|
||||||
@ -97,6 +98,24 @@ span#info {
|
|||||||
-webkit-transition: left 0.25s ease-in-out 0s;
|
-webkit-transition: left 0.25s ease-in-out 0s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pinIcon {
|
||||||
|
position: absolute;
|
||||||
|
top: 4px;
|
||||||
|
right: 55px;
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
background: center no-repeat;
|
||||||
|
background-image: url('images/pin_up.png');
|
||||||
|
}
|
||||||
|
|
||||||
|
#pinIcon:hover {
|
||||||
|
background-color: rgba(255,255,255,0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar.pinned #pinIcon {
|
||||||
|
background-image: url('images/pin_down.png');
|
||||||
|
}
|
||||||
|
|
||||||
#sidebarBox {
|
#sidebarBox {
|
||||||
background-color: rgba(0, 0, 0, 0.7);
|
background-color: rgba(0, 0, 0, 0.7);
|
||||||
width: 300px;
|
width: 300px;
|
||||||
@ -116,7 +135,7 @@ span#info {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
top: 10px;
|
top: 20px;
|
||||||
bottom: 10px;
|
bottom: 10px;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
width: 280px;
|
width: 280px;
|
||||||
@ -147,7 +166,7 @@ span#info {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
top: 10px;
|
top: 20px;
|
||||||
bottom: 10px;
|
bottom: 10px;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
width: 280px;
|
width: 280px;
|
||||||
@ -252,6 +271,7 @@ canvas {
|
|||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
color: #000;
|
color: #000;
|
||||||
|
font-family: sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.textLayer > div {
|
.textLayer > div {
|
||||||
@ -380,8 +400,8 @@ canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#loading {
|
#loading {
|
||||||
margin: 100px 0;
|
margin: 100px 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
#debugger {
|
#debugger {
|
||||||
@ -419,4 +439,4 @@ canvas {
|
|||||||
.debuggerHideText:hover {
|
.debuggerHideText:hover {
|
||||||
background: yellow;
|
background: yellow;
|
||||||
opacity: 0.3;
|
opacity: 0.3;
|
||||||
}
|
}
|
||||||
|
@ -9,28 +9,28 @@
|
|||||||
<script type="text/javascript" src="compatibility.js"></script> <!-- PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION -->
|
<script type="text/javascript" src="compatibility.js"></script> <!-- PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION -->
|
||||||
|
|
||||||
<!-- PDFJSSCRIPT_INCLUDE_BUILD -->
|
<!-- PDFJSSCRIPT_INCLUDE_BUILD -->
|
||||||
<script type="text/javascript" src="../src/core.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/core.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/util.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/util.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/canvas.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/canvas.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/obj.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/obj.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/function.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/function.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/charsets.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/charsets.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/cidmaps.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/cidmaps.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/colorspace.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/colorspace.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/crypto.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/crypto.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/evaluator.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/evaluator.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/fonts.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/fonts.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/glyphlist.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/glyphlist.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/image.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/image.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/metrics.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/metrics.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/parser.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/parser.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/pattern.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/pattern.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/stream.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/stream.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/worker.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/worker.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../external/jpgjs/jpg.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../external/jpgjs/jpg.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/jpx.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/jpx.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="../src/debugger.js"></script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript" src="../src/debugger.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE -->
|
<script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
|
||||||
<script type="text/javascript" src="viewer.js"></script>
|
<script type="text/javascript" src="viewer.js"></script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
@ -123,6 +123,7 @@
|
|||||||
|
|
||||||
<div id="sidebar">
|
<div id="sidebar">
|
||||||
<div id="sidebarBox">
|
<div id="sidebarBox">
|
||||||
|
<div id="pinIcon" onClick="PDFView.pinSidebar()"></div>
|
||||||
<div id="sidebarScrollView">
|
<div id="sidebarScrollView">
|
||||||
<div id="sidebarView"></div>
|
<div id="sidebarView"></div>
|
||||||
</div>
|
</div>
|
||||||
@ -137,7 +138,7 @@
|
|||||||
<img src="images/nav-outline.svg" align="top" height="16" alt="Document Outline" />
|
<img src="images/nav-outline.svg" align="top" height="16" alt="Document Outline" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="loading">Loading... 0%</div>
|
<div id="loading">Loading... 0%</div>
|
||||||
|
@ -571,6 +571,10 @@ var PDFView = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
pinSidebar: function pdfViewPinSidebar() {
|
||||||
|
document.getElementById('sidebar').classList.toggle('pinned');
|
||||||
|
},
|
||||||
|
|
||||||
getVisiblePages: function pdfViewGetVisiblePages() {
|
getVisiblePages: function pdfViewGetVisiblePages() {
|
||||||
var pages = this.pages;
|
var pages = this.pages;
|
||||||
var kBottomMargin = 10;
|
var kBottomMargin = 10;
|
||||||
@ -1083,7 +1087,6 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) {
|
|||||||
textDiv.dataset.canvasWidth = text.canvasWidth * text.geom.hScale;
|
textDiv.dataset.canvasWidth = text.canvasWidth * text.geom.hScale;
|
||||||
|
|
||||||
textDiv.style.fontSize = fontHeight + 'px';
|
textDiv.style.fontSize = fontHeight + 'px';
|
||||||
textDiv.style.fontFamily = fontName || 'sans-serif';
|
|
||||||
textDiv.style.left = text.geom.x + 'px';
|
textDiv.style.left = text.geom.x + 'px';
|
||||||
textDiv.style.top = (text.geom.y - fontHeight) + 'px';
|
textDiv.style.top = (text.geom.y - fontHeight) + 'px';
|
||||||
textDiv.textContent = text.str;
|
textDiv.textContent = text.str;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user