Merge pull request #5188 from yurydelendik/svg-refact
Refactors some SVG api and includes svg.js in the build
This commit is contained in:
commit
90afb70e44
@ -99,7 +99,7 @@ DOMElement.prototype = {
|
||||
attrList.push(i + '="' + xmlEncode(this.attributes[i]) + '"');
|
||||
}
|
||||
|
||||
if (this.nodeName === 'svg:tspan') {
|
||||
if (this.nodeName === 'svg:tspan' || this.nodeName === 'svg:style') {
|
||||
var encText = xmlEncode(this.textContent);
|
||||
return '<' + this.nodeName + ' ' + attrList.join(' ') + '>' +
|
||||
encText + '</' + this.nodeName + '>';
|
||||
|
@ -65,8 +65,9 @@ PDFJS.getDocument(data).then(function (doc) {
|
||||
|
||||
return page.getOperatorList().then(function (opList) {
|
||||
var svgGfx = new PDFJS.SVGGraphics(page.commonObjs, page.objs);
|
||||
return svgGfx.loadDependencies(opList).then(function (values) {
|
||||
var svgDump = svgGfx.getSVG(viewport, pageNum, opList).toString();
|
||||
svgGfx.embedFonts = true;
|
||||
return svgGfx.getSVG(opList, viewport).then(function (svg) {
|
||||
var svgDump = svg.toString();
|
||||
writeToFile(svgDump, pageNum);
|
||||
});
|
||||
});
|
||||
|
@ -48,8 +48,8 @@ PDFJS.getDocument(url).then(function(pdf) {
|
||||
|
||||
return page.getOperatorList().then(function (opList) {
|
||||
var svgGfx = new PDFJS.SVGGraphics(page.commonObjs, page.objs);
|
||||
return svgGfx.loadDependencies(opList).then(function (values) {
|
||||
container.appendChild(svgGfx.getSVG(viewport, pageNum, opList));
|
||||
return svgGfx.getSVG(opList, viewport).then(function (svg) {
|
||||
container.appendChild(svg);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
1
make.js
1
make.js
@ -380,6 +380,7 @@ target.bundle = function(args) {
|
||||
'display/pattern_helper.js',
|
||||
'display/font_loader.js',
|
||||
'display/annotation_helper.js',
|
||||
'display/svg.js'
|
||||
]);
|
||||
|
||||
var srcFiles = builder.getWorkerSrcFiles('src/worker_loader.js');
|
||||
|
@ -19,16 +19,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
function createScratchSVG(width, height) {
|
||||
var NS = 'http://www.w3.org/2000/svg';
|
||||
var svg = document.createElementNS(NS, 'svg:svg');
|
||||
svg.setAttributeNS(null, 'version', '1.1');
|
||||
svg.setAttributeNS(null, 'width', width + 'px');
|
||||
svg.setAttributeNS(null, 'height', height + 'px');
|
||||
svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
|
||||
return svg;
|
||||
}
|
||||
|
||||
//#if (GENERIC || SINGLE_FILE)
|
||||
var convertImgDataToPng = (function convertImgDataToPngClosure() {
|
||||
var PNG_HEADER =
|
||||
new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
||||
@ -281,6 +272,16 @@ var SVGExtraState = (function SVGExtraStateClosure() {
|
||||
})();
|
||||
|
||||
var SVGGraphics = (function SVGGraphicsClosure() {
|
||||
function createScratchSVG(width, height) {
|
||||
var NS = 'http://www.w3.org/2000/svg';
|
||||
var svg = document.createElementNS(NS, 'svg:svg');
|
||||
svg.setAttributeNS(null, 'version', '1.1');
|
||||
svg.setAttributeNS(null, 'width', width + 'px');
|
||||
svg.setAttributeNS(null, 'height', height + 'px');
|
||||
svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
|
||||
return svg;
|
||||
}
|
||||
|
||||
function opListToTree(opList) {
|
||||
var opTree = [];
|
||||
var tmp = [];
|
||||
@ -360,6 +361,10 @@ var SVGGraphics = (function SVGGraphicsClosure() {
|
||||
this.commonObjs = commonObjs;
|
||||
this.objs = objs;
|
||||
this.pendingEOFill = false;
|
||||
|
||||
this.embedFonts = false;
|
||||
this.embeddedFonts = {};
|
||||
this.cssStyle = null;
|
||||
}
|
||||
|
||||
var NS = 'http://www.w3.org/2000/svg';
|
||||
@ -431,21 +436,24 @@ var SVGGraphics = (function SVGGraphicsClosure() {
|
||||
this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
|
||||
},
|
||||
|
||||
getSVG: function SVGGraphics_getSVG(viewport, pageNum, operatorList) {
|
||||
getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
|
||||
this.svg = createScratchSVG(viewport.width, viewport.height);
|
||||
this.viewport = viewport;
|
||||
this.transformMatrix = IDENTITY_MATRIX;
|
||||
this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
|
||||
this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
|
||||
this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
|
||||
this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
|
||||
this.defs = document.createElementNS(NS, 'svg:defs');
|
||||
this.pgrp.appendChild(this.defs);
|
||||
this.pgrp.appendChild(this.tgrp);
|
||||
this.svg.appendChild(this.pgrp);
|
||||
var opTree = this.convertOpList(operatorList);
|
||||
this.executeOpTree(opTree);
|
||||
return this.svg;
|
||||
|
||||
return this.loadDependencies(operatorList).then(function () {
|
||||
this.transformMatrix = IDENTITY_MATRIX;
|
||||
this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
|
||||
this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
|
||||
this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
|
||||
this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
|
||||
this.defs = document.createElementNS(NS, 'svg:defs');
|
||||
this.pgrp.appendChild(this.defs);
|
||||
this.pgrp.appendChild(this.tgrp);
|
||||
this.svg.appendChild(this.pgrp);
|
||||
var opTree = this.convertOpList(operatorList);
|
||||
this.executeOpTree(opTree);
|
||||
return this.svg;
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
convertOpList: function SVGGraphics_convertOpList(operatorList) {
|
||||
@ -724,12 +732,31 @@ var SVGGraphics = (function SVGGraphicsClosure() {
|
||||
this.moveText(x, y);
|
||||
},
|
||||
|
||||
addFontStyle: function SVGGraphics_addFontStyle(fontObj) {
|
||||
if (!this.cssStyle) {
|
||||
this.cssStyle = document.createElementNS(NS, 'svg:style');
|
||||
this.cssStyle.setAttributeNS(null, 'type', 'text/css');
|
||||
this.defs.appendChild(this.cssStyle);
|
||||
}
|
||||
|
||||
var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);
|
||||
this.cssStyle.textContent +=
|
||||
'@font-face { font-family: "' + fontObj.loadedName + '";' +
|
||||
' src: url(' + url + '); }\n';
|
||||
},
|
||||
|
||||
setFont: function SVGGraphics_setFont(details) {
|
||||
var current = this.current;
|
||||
var fontObj = this.commonObjs.get(details[0]);
|
||||
var size = details[1];
|
||||
this.current.font = fontObj;
|
||||
|
||||
if (this.embedFonts && fontObj.data &&
|
||||
!this.embeddedFonts[fontObj.loadedName]) {
|
||||
this.addFontStyle(fontObj);
|
||||
this.embeddedFonts[fontObj.loadedName] = fontObj;
|
||||
}
|
||||
|
||||
current.fontMatrix = (fontObj.fontMatrix ?
|
||||
fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
|
||||
|
||||
@ -1024,7 +1051,7 @@ var SVGGraphics = (function SVGGraphicsClosure() {
|
||||
var current = this.current;
|
||||
var imgObj = this.objs.get(objId);
|
||||
var imgEl = document.createElementNS(NS, 'svg:image');
|
||||
imgEl.setAttributeNS(XLINK_NS, 'href', imgObj.src);
|
||||
imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
|
||||
imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');
|
||||
imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');
|
||||
imgEl.setAttributeNS(null, 'x', '0');
|
||||
@ -1065,7 +1092,7 @@ var SVGGraphics = (function SVGGraphicsClosure() {
|
||||
current.element = cliprect;
|
||||
this.clip('nonzero');
|
||||
var imgEl = document.createElementNS(NS, 'svg:image');
|
||||
imgEl.setAttributeNS(XLINK_NS, 'href', imgSrc);
|
||||
imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);
|
||||
imgEl.setAttributeNS(null, 'x', '0');
|
||||
imgEl.setAttributeNS(null, 'y', pf(-height));
|
||||
imgEl.setAttributeNS(null, 'width', pf(width) + 'px');
|
||||
@ -1114,4 +1141,4 @@ var SVGGraphics = (function SVGGraphicsClosure() {
|
||||
})();
|
||||
|
||||
PDFJS.SVGGraphics = SVGGraphics;
|
||||
|
||||
//#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user