From a21030a5024640738b3ba1069110dc73a5d8858a Mon Sep 17 00:00:00 2001 From: Artur Adib <arturadib@gmail.com> Date: Thu, 8 Dec 2011 17:13:17 -0500 Subject: [PATCH 01/12] Throw error when pixels don't match --- src/image.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/image.js b/src/image.js index 217e081c2..57c6d415f 100644 --- a/src/image.js +++ b/src/image.js @@ -198,6 +198,10 @@ var PDFImage = (function pdfImage() { var opacityPos = 0; var length = width * height * 4; + // Is there a one-to-one correspondence between pixels in the loop below? + if (length !== 4*comps.length/3) + error('Number of image pixels mismatch'); + for (var i = 0; i < length; i += 4) { buffer[i] = comps[compsPos++]; buffer[i + 1] = comps[compsPos++]; From fcbe4f13d100faee0c7da461601a6ae4811c797a Mon Sep 17 00:00:00 2001 From: Artur Adib <arturadib@gmail.com> Date: Thu, 8 Dec 2011 18:19:36 -0500 Subject: [PATCH 02/12] More sanity checks --- src/image.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/image.js b/src/image.js index 57c6d415f..f24d28638 100644 --- a/src/image.js +++ b/src/image.js @@ -200,7 +200,7 @@ var PDFImage = (function pdfImage() { // Is there a one-to-one correspondence between pixels in the loop below? if (length !== 4*comps.length/3) - error('Number of image pixels mismatch'); + error('Number of image pixels mismatch (RGB)'); for (var i = 0; i < length; i += 4) { buffer[i] = comps[compsPos++]; @@ -226,6 +226,10 @@ var PDFImage = (function pdfImage() { var comps = this.getComponents(imgArray); var length = width * height; + // Is there a one-to-one correspondence between pixels in the loop below? + if (length !== comps.length) + error('Number of image pixels mismatch (Gray)'); + for (var i = 0; i < length; ++i) buffer[i] = comps[i]; } From de33e44b09504f38f36f72f62b448caddd8a8c7b Mon Sep 17 00:00:00 2001 From: Artur Adib <arturadib@gmail.com> Date: Fri, 9 Dec 2011 14:57:52 -0500 Subject: [PATCH 03/12] Lint --- src/image.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/image.js b/src/image.js index f24d28638..a691bcd8c 100644 --- a/src/image.js +++ b/src/image.js @@ -199,7 +199,7 @@ var PDFImage = (function pdfImage() { var length = width * height * 4; // Is there a one-to-one correspondence between pixels in the loop below? - if (length !== 4*comps.length/3) + if (length !== 4 * comps.length / 3) error('Number of image pixels mismatch (RGB)'); for (var i = 0; i < length; i += 4) { From 2113e0615e835862d800b88bacccbdbf21c72c01 Mon Sep 17 00:00:00 2001 From: Artur Adib <arturadib@gmail.com> Date: Mon, 12 Dec 2011 14:33:26 -0500 Subject: [PATCH 04/12] Reverting error(); warn() instead of TODO() --- src/image.js | 8 -------- src/parser.js | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/image.js b/src/image.js index a691bcd8c..217e081c2 100644 --- a/src/image.js +++ b/src/image.js @@ -198,10 +198,6 @@ var PDFImage = (function pdfImage() { var opacityPos = 0; var length = width * height * 4; - // Is there a one-to-one correspondence between pixels in the loop below? - if (length !== 4 * comps.length / 3) - error('Number of image pixels mismatch (RGB)'); - for (var i = 0; i < length; i += 4) { buffer[i] = comps[compsPos++]; buffer[i + 1] = comps[compsPos++]; @@ -226,10 +222,6 @@ var PDFImage = (function pdfImage() { var comps = this.getComponents(imgArray); var length = width * height; - // Is there a one-to-one correspondence between pixels in the loop below? - if (length !== comps.length) - error('Number of image pixels mismatch (Gray)'); - for (var i = 0; i < length; ++i) buffer[i] = comps[i]; } diff --git a/src/parser.js b/src/parser.js index 036191677..c307c9276 100644 --- a/src/parser.js +++ b/src/parser.js @@ -249,7 +249,7 @@ var Parser = (function parserParser() { if (name == 'CCITTFaxDecode' || name == 'CCF') { return new CCITTFaxStream(stream, params); } - TODO('filter "' + name + '" not supported yet'); + warn('filter "' + name + '" not supported yet'); return stream; } }; From bed87284dbb076c52086a154a1922bc85014e7c5 Mon Sep 17 00:00:00 2001 From: notmasteryet <async.processingjs@yahoo.com> Date: Mon, 12 Dec 2011 21:32:20 -0600 Subject: [PATCH 05/12] Fixing Type3 text layer creation and character spacing --- src/canvas.js | 53 ++++++++++++++++++++++++++------------------------- src/fonts.js | 31 ++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 26 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index fdb537372..5005d6e23 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -638,17 +638,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { geometry.hScale = tr[0] - bl[0]; geometry.vScale = tr[1] - bl[1]; } - var spaceGlyph = font.charsToGlyphs(' '); - - // Hack (sometimes space is not encoded) - if (spaceGlyph.length === 0 || spaceGlyph[0].width === 0) - spaceGlyph = font.charsToGlyphs('i'); - - // Fallback - if (spaceGlyph.length === 0 || spaceGlyph[0].width === 0) - spaceGlyph = [{width: 0}]; - - geometry.spaceWidth = spaceGlyph[0].width; + geometry.spaceWidth = font.spaceWidth; return geometry; }, @@ -687,13 +677,6 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var textSelection = textLayer && !skipTextSelection ? true : false; var textRenderingMode = current.textRenderingMode; - if (textSelection) { - ctx.save(); - this.applyTextTransforms(); - text.geom = this.getTextGeometry(); - ctx.restore(); - } - // Type3 fonts - each glyph is a "mini-PDF" if (font.coded) { ctx.save(); @@ -701,6 +684,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { ctx.translate(current.x, current.y); ctx.scale(textHScale, 1); + + if (textSelection) { + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform.apply(ctx, fontMatrix); + text.geom = this.getTextGeometry(); + this.restore(); + } for (var i = 0; i < glyphsLength; ++i) { var glyph = glyphs[i]; @@ -720,7 +711,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var width = transformed[0] * fontSize + charSpacing; ctx.translate(width, 0); - current.x += width * textHScale2; + current.x += width * textHScale; text.str += glyph.unicode; text.length++; @@ -730,6 +721,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } else { ctx.save(); this.applyTextTransforms(); + if (textSelection) + text.geom = this.getTextGeometry(); var width = 0; for (var i = 0; i < glyphsLength; ++i) { @@ -780,18 +773,25 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { showSpacedText: function canvasGraphicsShowSpacedText(arr) { var ctx = this.ctx; var current = this.current; + var font = current.font; var fontSize = current.fontSize; - var textHScale2 = current.textHScale * - (current.font.fontMatrix || IDENTITY_MATRIX)[0]; + var textHScale = current.textHScale; + if (!font.coded) + textHScale *= (font.fontMatrix || IDENTITY_MATRIX)[0]; var arrLength = arr.length; var textLayer = this.textLayer; - var font = current.font; var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; var textSelection = textLayer ? true : false; if (textSelection) { ctx.save(); - this.applyTextTransforms(); + if (font.coded) { + ctx.transform.apply(ctx, current.textMatrix); + ctx.scale(1, -1); + ctx.translate(current.x, -1 * current.y); + ctx.scale(textHScale, 1); + } else + this.applyTextTransforms(); text.geom = this.getTextGeometry(); ctx.restore(); } @@ -799,7 +799,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { for (var i = 0; i < arrLength; ++i) { var e = arr[i]; if (isNum(e)) { - var spacingLength = -e * 0.001 * fontSize * textHScale2; + var spacingLength = -e * 0.001 * fontSize * textHScale; current.x += spacingLength; if (textSelection) { @@ -807,9 +807,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { text.canvasWidth += spacingLength; if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero var numFakeSpaces = Math.round(-e / text.geom.spaceWidth); - for (var j = 0; j < numFakeSpaces; ++j) + if (numFakeSpaces > 0) { text.str += ' '; - text.length += numFakeSpaces > 0 ? 1 : 0; + text.length++; + } } } } else if (isString(e)) { diff --git a/src/fonts.js b/src/fonts.js index de8a76dcd..731363a67 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -2101,6 +2101,37 @@ var Font = (function FontClosure() { return rule; }, + get spaceWidth() { + // trying to estimate space character width + var possibleSpaceReplacements = ['space', 'minus', '1', 'i']; + var width; + for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { + var glyphName = possibleSpaceReplacements[i]; + // if possible, getting width by glyph name + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + var glyphUnicode = GlyphsUnicode[glyphName]; + // finding the charcode via unicodeToCID map + var charcode = 0; + if (this.composite) + charcode = this.unicodeToCID[glyphUnicode]; + // ... via toUnicode map + if (!charcode && 'toUnicode' in this) + charcode = this.toUnicode.indexOf(glyphUnicode); + // setting it to unicode if negative or undefined + if (!(charcode > 0)) + charcode = glyphUnicode; + // trying to get width via charcode + width = this.widths[charcode]; + if (width) + break; // the non-zero width found + } + width = (width || this.defaultWidth) * this.widthMultiplier; + return shadow(this, 'spaceWidth', width); + }, + charToGlyph: function fonts_charToGlyph(charcode) { var unicode, width, codeIRQueue; From fb3a9a9828e32b90f0ac76f0c3676100a068b18a Mon Sep 17 00:00:00 2001 From: notmasteryet <async.processingjs@yahoo.com> Date: Mon, 12 Dec 2011 21:42:39 -0600 Subject: [PATCH 06/12] Add reftest for issue #918 --- test/pdfs/.gitignore | 1 + test/pdfs/issue918.pdf | Bin 0 -> 52483 bytes test/test_manifest.json | 6 ++++++ 3 files changed, 7 insertions(+) create mode 100644 test/pdfs/issue918.pdf diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index d3caa968a..23ba6340e 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -19,3 +19,4 @@ !issue840.pdf !scan-bad.pdf !freeculture.pdf +!issue918.pdf diff --git a/test/pdfs/issue918.pdf b/test/pdfs/issue918.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ac1a9c37f5e832ed353f2f0f66d167af3713749c GIT binary patch literal 52483 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 Z?SMc>|3Lh{4g<ysidI-yYp*u#{{sM^oQMDb literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 8e8098317..fba8df665 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -348,5 +348,11 @@ "link": true, "pageLimit": 3, "type": "eq" + }, + { "id": "issue918", + "file": "pdfs/issue918.pdf", + "md5": "d582cc0f2592ae82936589ced2a47e55", + "rounds": 1, + "type": "eq" } ] From 84706568a5d847cadd5e59e409f6018325984dc8 Mon Sep 17 00:00:00 2001 From: Artur Adib <arturadib@gmail.com> Date: Tue, 13 Dec 2011 12:58:27 -0500 Subject: [PATCH 07/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3500ae4d..97db68d36 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # pdf.js - + ## Overview From 45ef8742ac4dc45e7fddd5f2eb3bed9608b7439c Mon Sep 17 00:00:00 2001 From: notmasteryet <async.processingjs@yahoo.com> Date: Tue, 13 Dec 2011 18:28:02 -0600 Subject: [PATCH 08/12] type3 font.coded comment; proper geometery for showText; glyph name --- src/canvas.js | 4 ++-- src/fonts.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 5005d6e23..4aaf75508 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -687,8 +687,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (textSelection) { this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); + ctx.scale(1, -1); text.geom = this.getTextGeometry(); this.restore(); } @@ -785,6 +784,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (textSelection) { ctx.save(); + // Type3 fonts - each glyph is a "mini-PDF" (see also showText) if (font.coded) { ctx.transform.apply(ctx, current.textMatrix); ctx.scale(1, -1); diff --git a/src/fonts.js b/src/fonts.js index 731363a67..83ce4abaa 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -2103,7 +2103,7 @@ var Font = (function FontClosure() { get spaceWidth() { // trying to estimate space character width - var possibleSpaceReplacements = ['space', 'minus', '1', 'i']; + var possibleSpaceReplacements = ['space', 'minus', 'one', 'i']; var width; for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { var glyphName = possibleSpaceReplacements[i]; From 02bf65fc0dd32d4577bfe8cbedacbf2ca5930fdf Mon Sep 17 00:00:00 2001 From: Brendan Dahl <brendan.dahl@gmail.com> Date: Wed, 14 Dec 2011 12:30:20 -0800 Subject: [PATCH 09/12] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 97db68d36..7e5d2eeb3 100644 --- a/README.md +++ b/README.md @@ -205,3 +205,4 @@ a "PDF Reference" from Adobe: Recommended chapters to read: "2. Overview", "3.4 File Structure", "4.1 Graphics Objects" that lists the PDF commands. + From d1f4e7c7d53308c53695ba12c048a0f9649d3512 Mon Sep 17 00:00:00 2001 From: Brendan Dahl <brendan.dahl@gmail.com> Date: Wed, 14 Dec 2011 14:02:00 -0800 Subject: [PATCH 10/12] Change to passing promises. --- src/core.js | 23 +++++++----------- src/worker.js | 65 ++++++++++++++------------------------------------- 2 files changed, 26 insertions(+), 62 deletions(-) diff --git a/src/core.js b/src/core.js index dc44edb76..a6effd2bd 100644 --- a/src/core.js +++ b/src/core.js @@ -515,8 +515,7 @@ var PDFDoc = (function PDFDocClosure() { // Tell the worker the file it was created from. messageHandler.send('workerSrc', workerSrc); - messageHandler.on('test', function pdfDocTest(message) { - var supportTypedArray = message.data; + messageHandler.on('test', function pdfDocTest(supportTypedArray) { if (supportTypedArray) { this.worker = worker; this.setupMessageHandler(messageHandler); @@ -554,8 +553,7 @@ var PDFDoc = (function PDFDocClosure() { setupMessageHandler: function(messageHandler) { this.messageHandler = messageHandler; - messageHandler.on('page', function pdfDocPage(message) { - var data = message.data; + messageHandler.on('page', function pdfDocPage(data) { var pageNum = data.pageNum; var page = this.pageCache[pageNum]; var depFonts = data.depFonts; @@ -563,8 +561,7 @@ var PDFDoc = (function PDFDocClosure() { page.startRenderingFromIRQueue(data.IRQueue, depFonts); }, this); - messageHandler.on('obj', function pdfDocObj(message) { - var data = message.data; + messageHandler.on('obj', function pdfDocObj(data) { var id = data[0]; var type = data[1]; @@ -601,8 +598,7 @@ var PDFDoc = (function PDFDocClosure() { } }, this); - messageHandler.on('font_ready', function pdfDocFontReady(message) { - var data = message.data; + messageHandler.on('font_ready', function pdfDocFontReady(data) { var id = data[0]; var font = new FontShape(data[1]); @@ -614,8 +610,7 @@ var PDFDoc = (function PDFDocClosure() { } }.bind(this)); - messageHandler.on('page_error', function pdfDocError(message) { - var data = message.data; + messageHandler.on('page_error', function pdfDocError(data) { var page = this.pageCache[data.pageNum]; if (page.callback) page.callback(data.error); @@ -623,9 +618,9 @@ var PDFDoc = (function PDFDocClosure() { throw data.error; }, this); - messageHandler.on('jpeg_decode', function(message) { - var imageData = message.data[0]; - var components = message.data[1]; + messageHandler.on('jpeg_decode', function(data, promise) { + var imageData = data[0]; + var components = data[1]; if (components != 3 && components != 1) error('Only 3 component or 1 component can be returned'); @@ -652,7 +647,7 @@ var PDFDoc = (function PDFDocClosure() { buf[j] = data[i]; } } - message.reply({ data: buf, width: width, height: height}); + promise.resolve({ data: buf, width: width, height: height}); }).bind(this); var src = 'data:image/jpeg;base64,' + window.btoa(imageData); img.src = src; diff --git a/src/worker.js b/src/worker.js index c0496015a..c18de65ad 100644 --- a/src/worker.js +++ b/src/worker.js @@ -3,41 +3,6 @@ 'use strict'; -/** - * A wrapper for data to facilitate adding functionality to messages. - */ -function Message(data) { - this.data = data; - this.allowsReply = false; - this.combObj; - this.id; -} -Message.prototype = { - /** - * Reply to the action handler that sent the message. - */ - reply: function messageReply(data) { - if (!this.allowsReply) - error('This message does not accept replies.'); - - this.combObj.postMessage({ - isReply: true, - callbackId: this.id, - data: data - }); - }, - /** - * Setup the message to allow a reply. - * @param {Object} combObj The handler that has a postMessage function. - * @param {String} id The id to identify this message. - */ - setupReply: function setupReply(combObj, id) { - this.allowsReply = true; - this.combObj = combObj; - this.id = id; - } -}; - function MessageHandler(name, comObj) { this.name = name; this.comObj = comObj; @@ -65,11 +30,19 @@ function MessageHandler(name, comObj) { } } else if (data.action in ah) { var action = ah[data.action]; - var message = new Message(data.data); - if (data.callbackId) - message.setupReply(comObj, data.callbackId); - - action[0].call(action[1], message); + if (data.callbackId) { + var promise = new Promise(); + promise.then(function(resolvedData) { + comObj.postMessage({ + isReply: true, + callbackId: data.callbackId, + data: resolvedData + }); + }); + action[0].call(action[1], data.data, promise); + } else { + action[0].call(action[1], data.data); + } } else { throw 'Unkown action from worker: ' + data.action; } @@ -108,8 +81,7 @@ var WorkerMessageHandler = { setup: function wphSetup(handler) { var pdfDoc = null; - handler.on('test', function wphSetupTest(message) { - var data = message.data; + handler.on('test', function wphSetupTest(data) { handler.send('test', data instanceof Uint8Array); }); @@ -120,15 +92,13 @@ var WorkerMessageHandler = { // undefined action `workerSrc`. }); - handler.on('doc', function wphSetupDoc(message) { - var data = message.data; + handler.on('doc', function wphSetupDoc(data) { // Create only the model of the PDFDoc, which is enough for // processing the content of the pdf. pdfDoc = new PDFDocModel(new Stream(data)); }); - handler.on('page_request', function wphSetupPageRequest(message) { - var pageNum = message.data; + handler.on('page_request', function wphSetupPageRequest(pageNum) { pageNum = parseInt(pageNum); @@ -177,8 +147,7 @@ var WorkerMessageHandler = { }); }, this); - handler.on('font', function wphSetupFont(message) { - var data = message.data; + handler.on('font', function wphSetupFont(data) { var objId = data[0]; var name = data[1]; var file = data[2]; From ddf9c43116c2d8c21b82c41a4b2da136c2d2b8a8 Mon Sep 17 00:00:00 2001 From: notmasteryet <async.processingjs@yahoo.com> Date: Wed, 14 Dec 2011 18:44:35 -0600 Subject: [PATCH 11/12] Fixing setting of auto-zoom value in bookmarks (#938) --- web/viewer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/viewer.js b/web/viewer.js index bdcac09d5..daf0174ab 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -537,7 +537,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, ]; if (scale && scale !== PDFView.currentScale) - PDFView.setScale(scale, true); + PDFView.parseScale(scale, true); setTimeout(function pageViewScrollIntoViewRelayout() { // letting page to re-layout before scrolling From 8096d747c0f0ff85f9a39b43e56d7c2153cc9913 Mon Sep 17 00:00:00 2001 From: Brendan Dahl <brendan.dahl@gmail.com> Date: Thu, 15 Dec 2011 15:13:48 -0800 Subject: [PATCH 12/12] Fix nits. --- src/canvas.js | 4 ++-- src/image.js | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index e056fe0f2..e42f53cf1 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -1106,9 +1106,9 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { paintImageXObject: function canvasGraphicsPaintImageXObject(objId) { var imgData = this.objs.get(objId); - if (!imgData) { + if (!imgData) error('Dependent image isn\'t ready yet'); - } + this.save(); var ctx = this.ctx; var w = imgData.width; diff --git a/src/image.js b/src/image.js index 2f99dee54..22a9f9eb4 100644 --- a/src/image.js +++ b/src/image.js @@ -214,7 +214,6 @@ var PDFImage = (function PDFImageClosure() { bits = remainingBits; } } - if(decodeMap) console.timeEnd('getComps'); return output; }, getOpacity: function getOpacity() {