diff --git a/bower.json b/bower.json index 0670d9482..f94ded68b 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.266", + "version": "1.0.268", "keywords": [ "Mozilla", "pdf", diff --git a/build/pdf.combined.js b/build/pdf.combined.js index ff9ef037d..00e66bb5d 100644 --- a/build/pdf.combined.js +++ b/build/pdf.combined.js @@ -21,8 +21,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.266'; -PDFJS.build = '5b16323'; +PDFJS.version = '1.0.268'; +PDFJS.build = '7e6cdc7'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -4014,6 +4014,7 @@ var CanvasExtraState = (function CanvasExtraStateClosure() { this.fontSize = 0; this.fontSizeScale = 1; this.textMatrix = IDENTITY_MATRIX; + this.textMatrixScale = 1; this.fontMatrix = FONT_IDENTITY_MATRIX; this.leading = 0; // Current point (in user coordinates) @@ -4780,6 +4781,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { // Text beginText: function CanvasGraphics_beginText() { this.current.textMatrix = IDENTITY_MATRIX; + this.current.textMatrixScale = 1; this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; }, @@ -4884,6 +4886,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { }, setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) { this.current.textMatrix = [a, b, c, d, e, f]; + this.current.textMatrixScale = Math.sqrt(a * a + b * b); this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; @@ -4891,24 +4894,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { nextLine: function CanvasGraphics_nextLine() { this.moveText(0, this.current.leading); }, - applyTextTransforms: function CanvasGraphics_applyTextTransforms() { - var ctx = this.ctx; - var current = this.current; - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y + current.textRise); - if (current.fontDirection > 0) { - ctx.scale(current.textHScale, -1); - } else { - ctx.scale(-current.textHScale, 1); - } - }, paintChar: function CanvasGraphics_paintChar(character, x, y) { var ctx = this.ctx; var current = this.current; var font = current.font; - var fontSize = current.fontSize / current.fontSizeScale; var textRenderingMode = current.textRenderingMode; + var fontSize = current.fontSize / current.fontSizeScale; var fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; var isAddToPathSet = !!(textRenderingMode & @@ -4974,181 +4966,182 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { }, showText: function CanvasGraphics_showText(glyphs) { - var ctx = this.ctx; var current = this.current; var font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + var fontSize = current.fontSize; + if (fontSize === 0) { + return; + } + + var ctx = this.ctx; var fontSizeScale = current.fontSizeScale; var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale * current.fontDirection; - var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + var fontDirection = current.fontDirection; + var textHScale = current.textHScale * fontDirection; var glyphsLength = glyphs.length; var vertical = font.vertical; var defaultVMetrics = font.defaultVMetrics; - var i, glyph, width; + var widthAdvanceScale = fontSize * current.fontMatrix[0]; - if (fontSize === 0) { - return; - } + var simpleFillText = + current.textRenderingMode === TextRenderingMode.FILL && + !font.disableFontFace; - // Type3 fonts - each glyph is a "mini-PDF" - if (font.isType3Font) { - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { ctx.scale(textHScale, 1); + } - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (glyph === null) { - // word break - this.ctx.translate(wordSpacing, 0); - current.x += wordSpacing * textHScale; - continue; - } + var lineWidth = current.lineWidth; + var scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + lineWidth = this.getSinglePixelWidth(); + } else { + lineWidth /= scale; + } - this.processingType3 = glyph; - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - var operatorList = font.charProcOperatorList[glyph.operatorListId]; - this.executeOperatorList(operatorList); - this.restore(); + if (fontSizeScale != 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = ((transformed[0] * fontSize + charSpacing) * - current.fontDirection); + ctx.lineWidth = lineWidth; - ctx.translate(width, 0); - current.x += width * textHScale; + var x = 0, i; + for (i = 0; i < glyphsLength; ++i) { + var glyph = glyphs[i]; + if (glyph === null) { + // word break + x += fontDirection * wordSpacing; + continue; + } else if (isNum(glyph)) { + x += -glyph * fontSize * 0.001; + continue; } - ctx.restore(); - this.processingType3 = null; - } else { - ctx.save(); - this.applyTextTransforms(); - var lineWidth = current.lineWidth; - var a1 = current.textMatrix[0], b1 = current.textMatrix[1]; - var scale = Math.sqrt(a1 * a1 + b1 * b1); - if (scale === 0 || lineWidth === 0) { - lineWidth = this.getSinglePixelWidth(); + var restoreNeeded = false; + var character = glyph.fontChar; + var accent = glyph.accent; + var scaledX, scaledY, scaledAccentX, scaledAccentY; + var width = glyph.width; + if (vertical) { + var vmetric, vx, vy; + vmetric = glyph.vmetric || defaultVMetrics; + vx = glyph.vmetric ? vmetric[1] : width * 0.5; + vx = -vx * widthAdvanceScale; + vy = vmetric[2] * widthAdvanceScale; + + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; } else { - lineWidth /= scale; + scaledX = x / fontSizeScale; + scaledY = 0; } - if (fontSizeScale != 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; + if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) { + // some standard fonts may not have the exact width, trying to + // rescale per character + var measuredWidth = ctx.measureText(character).width * 1000 / + fontSize * fontSizeScale; + var characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; } - ctx.lineWidth = lineWidth; - - var x = 0; - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (glyph === null) { - // word break - x += current.fontDirection * wordSpacing; - continue; - } - - var restoreNeeded = false; - var character = glyph.fontChar; - var vmetric = glyph.vmetric || defaultVMetrics; - if (vertical) { - var vx = glyph.vmetric ? vmetric[1] : glyph.width * 0.5; - vx = -vx * fontSize * current.fontMatrix[0]; - var vy = vmetric[2] * fontSize * current.fontMatrix[0]; - } - width = vmetric ? -vmetric[0] : glyph.width; - var charWidth = width * fontSize * current.fontMatrix[0] + - charSpacing * current.fontDirection; - var accent = glyph.accent; - - var scaledX, scaledY, scaledAccentX, scaledAccentY; - - if (vertical) { - scaledX = vx / fontSizeScale; - scaledY = (x + vy) / fontSizeScale; - } else { - scaledX = x / fontSizeScale; - scaledY = 0; - } - - if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) { - // some standard fonts may not have the exact width, trying to - // rescale per character - var measuredWidth = ctx.measureText(character).width * 1000 / - current.fontSize * current.fontSizeScale; - var characterScaleX = width / measuredWidth; - restoreNeeded = true; - ctx.save(); - ctx.scale(characterScaleX, 1); - scaledX /= characterScaleX; - if (accent) { - scaledAccentX /= characterScaleX; - } - } - + if (simpleFillText && !accent) { + // common case + ctx.fillText(character, scaledX, scaledY); + } else { this.paintChar(character, scaledX, scaledY); if (accent) { scaledAccentX = scaledX + accent.offset.x / fontSizeScale; scaledAccentY = scaledY - accent.offset.y / fontSizeScale; this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY); } + } - x += charWidth; + var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; + x += charWidth; - if (restoreNeeded) { - ctx.restore(); - } + if (restoreNeeded) { + ctx.restore(); } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - ctx.restore(); } + if (vertical) { + current.y -= x * textHScale; + } else { + current.x += x * textHScale; + } + ctx.restore(); }, - showSpacedText: function CanvasGraphics_showSpacedText(arr) { + + showType3Text: function CanvasGraphics_showType3Text(glyphs) { + // Type3 fonts - each glyph is a "mini-PDF" + var ctx = this.ctx; var current = this.current; var font = current.font; var fontSize = current.fontSize; - // TJ array's number is independent from fontMatrix - var textHScale = current.textHScale * 0.001 * current.fontDirection; - var arrLength = arr.length; - var vertical = font.vertical; + var fontDirection = current.fontDirection; + var charSpacing = current.charSpacing; + var wordSpacing = current.wordSpacing; + var textHScale = current.textHScale * fontDirection; + var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + var glyphsLength = glyphs.length; + var i, glyph, width; - for (var i = 0; i < arrLength; ++i) { - var e = arr[i]; - if (isNum(e)) { - var spacingLength = -e * fontSize * textHScale; - if (vertical) { - current.y += spacingLength; - } else { - current.x += spacingLength; - } + if (fontSize === 0) { + return; + } - } else { - this.showText(e); + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.translate(current.x, current.y); + + ctx.scale(textHScale, 1); + + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (glyph === null) { + // word break + this.ctx.translate(wordSpacing, 0); + current.x += wordSpacing * textHScale; + continue; + } else if (isNum(glyph)) { + var spacingLength = -glyph * 0.001 * fontSize; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; } + + this.processingType3 = glyph; + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform.apply(ctx, fontMatrix); + var operatorList = font.charProcOperatorList[glyph.operatorListId]; + this.executeOperatorList(operatorList); + this.restore(); + + var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); + width = ((transformed[0] * fontSize + charSpacing) * fontDirection); + + ctx.translate(width, 0); + current.x += width * textHScale; } - }, - nextLineShowText: function CanvasGraphics_nextLineShowText(text) { - this.nextLine(); - this.showText(text); - }, - nextLineSetSpacingShowText: - function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing, - charSpacing, - text) { - this.setWordSpacing(wordSpacing); - this.setCharSpacing(charSpacing); - this.nextLineShowText(text); + ctx.restore(); + this.processingType3 = null; }, // Type3 fonts @@ -20673,18 +20666,31 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { break; case OPS.showSpacedText: var arr = args[0]; + var combinedGlyphs = []; var arrLength = arr.length; for (i = 0; i < arrLength; ++i) { - if (isString(arr[i])) { - arr[i] = self.handleText(arr[i], stateManager.state); + var arrItem = arr[i]; + if (isString(arrItem)) { + Array.prototype.push.apply(combinedGlyphs, + self.handleText(arrItem, stateManager.state)); + } else if (isNum(arrItem)) { + combinedGlyphs.push(arrItem); } } + args[0] = combinedGlyphs; + fn = OPS.showText; break; case OPS.nextLineShowText: + operatorList.addOp(OPS.nextLine); args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; break; case OPS.nextLineSetSpacingShowText: - args[2] = self.handleText(args[2], stateManager.state); + operatorList.addOp(OPS.nextLine); + operatorList.addOp(OPS.setWordSpacing, [args.shift()]); + operatorList.addOp(OPS.setCharSpacing, [args.shift()]); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; break; case OPS.setTextRenderingMode: stateManager.state.textRenderingMode = args[0]; diff --git a/build/pdf.js b/build/pdf.js index 276679cd8..f53f8f8bf 100644 --- a/build/pdf.js +++ b/build/pdf.js @@ -21,8 +21,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.266'; -PDFJS.build = '5b16323'; +PDFJS.version = '1.0.268'; +PDFJS.build = '7e6cdc7'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -4062,6 +4062,7 @@ var CanvasExtraState = (function CanvasExtraStateClosure() { this.fontSize = 0; this.fontSizeScale = 1; this.textMatrix = IDENTITY_MATRIX; + this.textMatrixScale = 1; this.fontMatrix = FONT_IDENTITY_MATRIX; this.leading = 0; // Current point (in user coordinates) @@ -4828,6 +4829,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { // Text beginText: function CanvasGraphics_beginText() { this.current.textMatrix = IDENTITY_MATRIX; + this.current.textMatrixScale = 1; this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; }, @@ -4932,6 +4934,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { }, setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) { this.current.textMatrix = [a, b, c, d, e, f]; + this.current.textMatrixScale = Math.sqrt(a * a + b * b); this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; @@ -4939,24 +4942,13 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { nextLine: function CanvasGraphics_nextLine() { this.moveText(0, this.current.leading); }, - applyTextTransforms: function CanvasGraphics_applyTextTransforms() { - var ctx = this.ctx; - var current = this.current; - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y + current.textRise); - if (current.fontDirection > 0) { - ctx.scale(current.textHScale, -1); - } else { - ctx.scale(-current.textHScale, 1); - } - }, paintChar: function CanvasGraphics_paintChar(character, x, y) { var ctx = this.ctx; var current = this.current; var font = current.font; - var fontSize = current.fontSize / current.fontSizeScale; var textRenderingMode = current.textRenderingMode; + var fontSize = current.fontSize / current.fontSizeScale; var fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; var isAddToPathSet = !!(textRenderingMode & @@ -5022,181 +5014,182 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { }, showText: function CanvasGraphics_showText(glyphs) { - var ctx = this.ctx; var current = this.current; var font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + var fontSize = current.fontSize; + if (fontSize === 0) { + return; + } + + var ctx = this.ctx; var fontSizeScale = current.fontSizeScale; var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale * current.fontDirection; - var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + var fontDirection = current.fontDirection; + var textHScale = current.textHScale * fontDirection; var glyphsLength = glyphs.length; var vertical = font.vertical; var defaultVMetrics = font.defaultVMetrics; - var i, glyph, width; + var widthAdvanceScale = fontSize * current.fontMatrix[0]; - if (fontSize === 0) { - return; - } + var simpleFillText = + current.textRenderingMode === TextRenderingMode.FILL && + !font.disableFontFace; - // Type3 fonts - each glyph is a "mini-PDF" - if (font.isType3Font) { - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.translate(current.x, current.y + current.textRise); + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { ctx.scale(textHScale, 1); + } - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (glyph === null) { - // word break - this.ctx.translate(wordSpacing, 0); - current.x += wordSpacing * textHScale; - continue; - } + var lineWidth = current.lineWidth; + var scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + lineWidth = this.getSinglePixelWidth(); + } else { + lineWidth /= scale; + } - this.processingType3 = glyph; - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - var operatorList = font.charProcOperatorList[glyph.operatorListId]; - this.executeOperatorList(operatorList); - this.restore(); + if (fontSizeScale != 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = ((transformed[0] * fontSize + charSpacing) * - current.fontDirection); + ctx.lineWidth = lineWidth; - ctx.translate(width, 0); - current.x += width * textHScale; + var x = 0, i; + for (i = 0; i < glyphsLength; ++i) { + var glyph = glyphs[i]; + if (glyph === null) { + // word break + x += fontDirection * wordSpacing; + continue; + } else if (isNum(glyph)) { + x += -glyph * fontSize * 0.001; + continue; } - ctx.restore(); - this.processingType3 = null; - } else { - ctx.save(); - this.applyTextTransforms(); - var lineWidth = current.lineWidth; - var a1 = current.textMatrix[0], b1 = current.textMatrix[1]; - var scale = Math.sqrt(a1 * a1 + b1 * b1); - if (scale === 0 || lineWidth === 0) { - lineWidth = this.getSinglePixelWidth(); + var restoreNeeded = false; + var character = glyph.fontChar; + var accent = glyph.accent; + var scaledX, scaledY, scaledAccentX, scaledAccentY; + var width = glyph.width; + if (vertical) { + var vmetric, vx, vy; + vmetric = glyph.vmetric || defaultVMetrics; + vx = glyph.vmetric ? vmetric[1] : width * 0.5; + vx = -vx * widthAdvanceScale; + vy = vmetric[2] * widthAdvanceScale; + + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; } else { - lineWidth /= scale; + scaledX = x / fontSizeScale; + scaledY = 0; } - if (fontSizeScale != 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; + if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) { + // some standard fonts may not have the exact width, trying to + // rescale per character + var measuredWidth = ctx.measureText(character).width * 1000 / + fontSize * fontSizeScale; + var characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; } - ctx.lineWidth = lineWidth; - - var x = 0; - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (glyph === null) { - // word break - x += current.fontDirection * wordSpacing; - continue; - } - - var restoreNeeded = false; - var character = glyph.fontChar; - var vmetric = glyph.vmetric || defaultVMetrics; - if (vertical) { - var vx = glyph.vmetric ? vmetric[1] : glyph.width * 0.5; - vx = -vx * fontSize * current.fontMatrix[0]; - var vy = vmetric[2] * fontSize * current.fontMatrix[0]; - } - width = vmetric ? -vmetric[0] : glyph.width; - var charWidth = width * fontSize * current.fontMatrix[0] + - charSpacing * current.fontDirection; - var accent = glyph.accent; - - var scaledX, scaledY, scaledAccentX, scaledAccentY; - - if (vertical) { - scaledX = vx / fontSizeScale; - scaledY = (x + vy) / fontSizeScale; - } else { - scaledX = x / fontSizeScale; - scaledY = 0; - } - - if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) { - // some standard fonts may not have the exact width, trying to - // rescale per character - var measuredWidth = ctx.measureText(character).width * 1000 / - current.fontSize * current.fontSizeScale; - var characterScaleX = width / measuredWidth; - restoreNeeded = true; - ctx.save(); - ctx.scale(characterScaleX, 1); - scaledX /= characterScaleX; - if (accent) { - scaledAccentX /= characterScaleX; - } - } - + if (simpleFillText && !accent) { + // common case + ctx.fillText(character, scaledX, scaledY); + } else { this.paintChar(character, scaledX, scaledY); if (accent) { scaledAccentX = scaledX + accent.offset.x / fontSizeScale; scaledAccentY = scaledY - accent.offset.y / fontSizeScale; this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY); } + } - x += charWidth; + var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; + x += charWidth; - if (restoreNeeded) { - ctx.restore(); - } + if (restoreNeeded) { + ctx.restore(); } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - ctx.restore(); } + if (vertical) { + current.y -= x * textHScale; + } else { + current.x += x * textHScale; + } + ctx.restore(); }, - showSpacedText: function CanvasGraphics_showSpacedText(arr) { + + showType3Text: function CanvasGraphics_showType3Text(glyphs) { + // Type3 fonts - each glyph is a "mini-PDF" + var ctx = this.ctx; var current = this.current; var font = current.font; var fontSize = current.fontSize; - // TJ array's number is independent from fontMatrix - var textHScale = current.textHScale * 0.001 * current.fontDirection; - var arrLength = arr.length; - var vertical = font.vertical; + var fontDirection = current.fontDirection; + var charSpacing = current.charSpacing; + var wordSpacing = current.wordSpacing; + var textHScale = current.textHScale * fontDirection; + var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + var glyphsLength = glyphs.length; + var i, glyph, width; - for (var i = 0; i < arrLength; ++i) { - var e = arr[i]; - if (isNum(e)) { - var spacingLength = -e * fontSize * textHScale; - if (vertical) { - current.y += spacingLength; - } else { - current.x += spacingLength; - } + if (fontSize === 0) { + return; + } - } else { - this.showText(e); + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.translate(current.x, current.y); + + ctx.scale(textHScale, 1); + + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (glyph === null) { + // word break + this.ctx.translate(wordSpacing, 0); + current.x += wordSpacing * textHScale; + continue; + } else if (isNum(glyph)) { + var spacingLength = -glyph * 0.001 * fontSize; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; } + + this.processingType3 = glyph; + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform.apply(ctx, fontMatrix); + var operatorList = font.charProcOperatorList[glyph.operatorListId]; + this.executeOperatorList(operatorList); + this.restore(); + + var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); + width = ((transformed[0] * fontSize + charSpacing) * fontDirection); + + ctx.translate(width, 0); + current.x += width * textHScale; } - }, - nextLineShowText: function CanvasGraphics_nextLineShowText(text) { - this.nextLine(); - this.showText(text); - }, - nextLineSetSpacingShowText: - function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing, - charSpacing, - text) { - this.setWordSpacing(wordSpacing); - this.setCharSpacing(charSpacing); - this.nextLineShowText(text); + ctx.restore(); + this.processingType3 = null; }, // Type3 fonts diff --git a/build/pdf.worker.js b/build/pdf.worker.js index 0caf81de9..c8c4e8780 100644 --- a/build/pdf.worker.js +++ b/build/pdf.worker.js @@ -21,8 +21,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.266'; -PDFJS.build = '5b16323'; +PDFJS.version = '1.0.268'; +PDFJS.build = '7e6cdc7'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it @@ -16166,18 +16166,31 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { break; case OPS.showSpacedText: var arr = args[0]; + var combinedGlyphs = []; var arrLength = arr.length; for (i = 0; i < arrLength; ++i) { - if (isString(arr[i])) { - arr[i] = self.handleText(arr[i], stateManager.state); + var arrItem = arr[i]; + if (isString(arrItem)) { + Array.prototype.push.apply(combinedGlyphs, + self.handleText(arrItem, stateManager.state)); + } else if (isNum(arrItem)) { + combinedGlyphs.push(arrItem); } } + args[0] = combinedGlyphs; + fn = OPS.showText; break; case OPS.nextLineShowText: + operatorList.addOp(OPS.nextLine); args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; break; case OPS.nextLineSetSpacingShowText: - args[2] = self.handleText(args[2], stateManager.state); + operatorList.addOp(OPS.nextLine); + operatorList.addOp(OPS.setWordSpacing, [args.shift()]); + operatorList.addOp(OPS.setCharSpacing, [args.shift()]); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; break; case OPS.setTextRenderingMode: stateManager.state.textRenderingMode = args[0]; diff --git a/package.json b/package.json index 54f1876cd..fcf4b1bb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.266", + "version": "1.0.268", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [ "Mozilla",