Skip to content

Commit d3e1dba

Browse files
authored
Jspdf/boxes (#2155)
* Update jspdf.js * Update jspdf.js * Update jspdf.unit.spec.js
1 parent 65bba3c commit d3e1dba

File tree

2 files changed

+57
-45
lines changed

2 files changed

+57
-45
lines changed

src/jspdf.js

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -813,21 +813,37 @@ var jsPDF = (function (global) {
813813
};
814814

815815
var putPage = API.__private__.putPage = function (page) {
816-
var dimensions = page.dimensions;
816+
var mediaBox = page.mediaBox;
817817
var pageNumber = page.number;
818818
var data = page.data;
819819
var pageObjectNumber = page.objId;
820820
var pageContentsObjId = page.contentsObjId;
821821

822822
newObjectDeferredBegin(pageObjectNumber, true);
823-
var wPt = dimensions.width;
824-
var hPt = dimensions.height;
823+
var wPt = pagesContext[currentPage].mediaBox.topRightX - pagesContext[currentPage].mediaBox.bottomLeftX;
824+
var hPt = pagesContext[currentPage].mediaBox.topRightY - pagesContext[currentPage].mediaBox.bottomLeftY;
825825
out('<</Type /Page');
826826
out('/Parent ' + page.rootDictionaryObjId + ' 0 R');
827827
out('/Resources ' + page.resourceDictionaryObjId + ' 0 R');
828-
out('/MediaBox [0 0 ' + f2(wPt) + ' ' + f2(hPt) + ']');
829-
if (typeof dimensions.userUnit === "number" && dimensions.userUnit !== 1.0) {
830-
out('/UserUnit ' + dimensions.userUnit);
828+
out('/MediaBox [' + parseFloat(f2(page.mediaBox.bottomLeftX)) + ' ' + parseFloat(f2(page.mediaBox.bottomLeftY)) + ' ' + f2(pagesContext[currentPage].mediaBox.topRightX) + ' ' + f2(pagesContext[currentPage].mediaBox.topRightY) + ']');
829+
if (page.cropBox !== null) {
830+
out('/CropBox [' + f2(page.cropBox.bottomLeftX) + ' ' + f2(page.cropBox.bottomLeftY) + ' ' + f2(page.cropBox.topRightX) + ' ' + f2(page.cropBox.topRightY) + ']');
831+
}
832+
833+
if (page.bleedBox !== null) {
834+
out('/BleedBox [' + f2(page.bleedBox.bottomLeftX) + ' ' + f2(page.bleedBox.bottomLeftY) + ' ' + f2(page.bleedBox.topRightX) + ' ' + f2(page.bleedBox.topRightY) + ']');
835+
}
836+
837+
if (page.trimBox !== null) {
838+
out('/TrimBox [' + f2(page.trimBox.bottomLeftX) + ' ' + f2(page.trimBox.bottomLeftY) + ' ' + f2(page.trimBox.topRightX) + ' ' + f2(page.trimBox.topRightY) + ']');
839+
}
840+
841+
if (page.artBox !== null) {
842+
out('/ArtBox [' + f2(page.artBox.bottomLeftX) + ' ' + f2(page.artBox.bottomLeftY) + ' ' + f2(page.artBox.topRightX) + ' ' + f2(page.artBox.topRightY) + ']');
843+
}
844+
845+
if (typeof page.userUnit === "number" && page.userUnit !== 1.0) {
846+
out('/UserUnit ' + page.userUnit);
831847
}
832848

833849
events.publish('putPage', {
@@ -863,7 +879,12 @@ var jsPDF = (function (global) {
863879
data: pages[n],
864880
objId: pagesContext[n].objId,
865881
contentsObjId: pagesContext[n].contentsObjId,
866-
dimensions: pagesContext[n].dimensions,
882+
mediaBox: pagesContext[n].mediaBox,
883+
cropBox: pagesContext[n].cropBox,
884+
bleedBox: pagesContext[n].bleedBox,
885+
trimBox: pagesContext[n].trimBox,
886+
artBox: pagesContext[n].artBox,
887+
userUnit: pagesContext[n].userUnit,
867888
rootDictionaryObjId: rootDictionaryObjId,
868889
resourceDictionaryObjId: resourceDictionaryObjId
869890
}));
@@ -1234,10 +1255,16 @@ var jsPDF = (function (global) {
12341255
pagesContext[page] = {
12351256
objId: 0,
12361257
contentsObjId: 0,
1237-
dimensions: {
1238-
width: Number(width),
1239-
height: Number(height),
1240-
userUnit : Number(userUnit)
1258+
userUnit : Number(userUnit),
1259+
artBox: null,
1260+
bleedBox: null,
1261+
cropBox: null,
1262+
trimBox: null,
1263+
mediaBox: {
1264+
bottomLeftX: 0,
1265+
bottomLeftY: 0,
1266+
topRightX: Number(width),
1267+
topRightY: Number(height)
12411268
}
12421269
};
12431270
_setPage(page);
@@ -1274,12 +1301,10 @@ var jsPDF = (function (global) {
12741301
var _setPage = function (n) {
12751302
if (n > 0 && n <= page) {
12761303
currentPage = n;
1277-
pagesContext[currentPage].dimensions.width;
1278-
pagesContext[currentPage].dimensions.height;
12791304
}
12801305
};
12811306

1282-
var getNumberOfPages = API.__private__.getNumberOfPages = function () {
1307+
var getNumberOfPages = API.__private__.getNumberOfPages = API.getNumberOfPages = function () {
12831308
return pages.length - 1;
12841309
}
12851310
/**
@@ -1587,7 +1612,7 @@ var jsPDF = (function (global) {
15871612

15881613
//---------------------------------------
15891614
// Public API
1590-
1615+
15911616
var getPageInfo = API.__private__.getPageInfo = function (pageNumberOneBased) {
15921617
if (isNaN(pageNumberOneBased) || (pageNumberOneBased % 1 !== 0)) {
15931618
throw new Error('Invalid argument passed to jsPDF.getPageInfo');
@@ -1599,7 +1624,7 @@ var jsPDF = (function (global) {
15991624
pageContext: pagesContext[pageNumberOneBased]
16001625
};
16011626
};
1602-
1627+
16031628
var getPageInfoByObjId = API.__private__.getPageInfoByObjId = function (objId) {
16041629
var pageNumberWithObjId;
16051630
for (var pageNumber in pagesContext) {
@@ -2783,15 +2808,15 @@ var jsPDF = (function (global) {
27832808
};
27842809

27852810
var getVerticalCoordinate = API.__private__.getVerticalCoordinate = function (value) {
2786-
return pagesContext[currentPage].dimensions.height - (value * k);
2811+
return pagesContext[currentPage].mediaBox.topRightY - pagesContext[currentPage].mediaBox.bottomLeftY - (value * k);
27872812
};
27882813

27892814
var getHorizontalCoordinateString = API.__private__.getHorizontalCoordinateString = function (value) {
27902815
return f2(value * k);
27912816
};
27922817

27932818
var getVerticalCoordinateString = API.__private__.getVerticalCoordinateString = function (value) {
2794-
return f2(pagesContext[currentPage].dimensions.height - (value * k));
2819+
return f2(pagesContext[currentPage].mediaBox.topRightY - pagesContext[currentPage].mediaBox.bottomLeftY - (value * k));
27952820
};
27962821

27972822
var strokeColor = options.strokeColor || '0 G';
@@ -3213,16 +3238,16 @@ var jsPDF = (function (global) {
32133238
'scaleFactor': k,
32143239
'pageSize': {
32153240
getWidth: function () {
3216-
return pagesContext[currentPage].dimensions.width / k;
3241+
return (pagesContext[currentPage].mediaBox.topRightX - pagesContext[currentPage].mediaBox.bottomLeftX) / k;
32173242
},
32183243
setWidth: function (value) {
3219-
pagesContext[currentPage].dimensions.width = value * k;
3244+
pagesContext[currentPage].mediaBox.topRightX = (value * k) + pagesContext[currentPage].mediaBox.bottomLeftX;
32203245
},
32213246
getHeight: function () {
3222-
return pagesContext[currentPage].dimensions.height / k;
3247+
return (pagesContext[currentPage].mediaBox.topRightY - pagesContext[currentPage].mediaBox.bottomLeftY) / k;
32233248
},
32243249
setHeight: function (value) {
3225-
pagesContext[currentPage].dimensions.height = value * k;
3250+
pagesContext[currentPage].mediaBox.topRightY = (value * k) + pagesContext[currentPage].mediaBox.bottomLeftY;
32263251
},
32273252
},
32283253
'output': output,
@@ -3240,20 +3265,20 @@ var jsPDF = (function (global) {
32403265

32413266
Object.defineProperty(API.internal.pageSize, 'width', {
32423267
get: function () {
3243-
return pagesContext[currentPage].dimensions.width / k;
3268+
return (pagesContext[currentPage].mediaBox.topRightX - pagesContext[currentPage].mediaBox.bottomLeftX) / k;
32443269
},
32453270
set: function (value) {
3246-
pagesContext[currentPage].dimensions.width = value * k;
3271+
pagesContext[currentPage].mediaBox.topRightX = (value * k) + pagesContext[currentPage].mediaBox.bottomLeftX;
32473272
},
32483273
enumerable: true,
32493274
configurable: true
32503275
});
32513276
Object.defineProperty(API.internal.pageSize, 'height', {
32523277
get: function () {
3253-
return pagesContext[currentPage].dimensions.height / k;
3278+
return (pagesContext[currentPage].mediaBox.topRightY - pagesContext[currentPage].mediaBox.bottomLeftY) / k;
32543279
},
32553280
set: function (value) {
3256-
pagesContext[currentPage].dimensions.height = value * k;
3281+
pagesContext[currentPage].mediaBox.topRightY = (value * k) + pagesContext[currentPage].mediaBox.bottomLeftY;
32573282
},
32583283
enumerable: true,
32593284
configurable: true

tests/init/jspdf.unit.spec.js

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -319,32 +319,19 @@ describe('jsPDF unit tests', () => {
319319
const doc = jsPDF()
320320
doc.addPage();
321321
doc.addPage();
322-
expect(doc.internal.getPageInfo(1)).toEqual({ objId: 0, pageNumber: 1, pageContext: {dimensions: { width: 595.28, height: 841.89, userUnit: 1.0 }, objId: 0, contentsObjId: 0, annotations: []} });
323-
expect(doc.internal.getPageInfo(2)).toEqual({ objId: 0, pageNumber: 2, pageContext: {dimensions: { width: 595.28, height: 841.89, userUnit: 1.0 }, objId: 0, contentsObjId: 0, annotations: []} });
324-
expect(doc.internal.getPageInfo(3)).toEqual({ objId: 0, pageNumber: 3, pageContext: {dimensions: { width: 595.28, height: 841.89, userUnit: 1.0 }, objId: 0, contentsObjId: 0, annotations: []} });
322+
expect(doc.internal.getPageInfo(1)).toEqual({ objId: 0, pageNumber: 1, pageContext: {mediaBox: { bottomLeftX: 0, bottomLeftY: 0, topRightX: 595.28, topRightY: 841.89 }, artBox: null, bleedBox: null, cropBox: null, trimBox: null, userUnit: 1.0, objId: 0, contentsObjId: 0, annotations: []} });
323+
expect(doc.internal.getPageInfo(2)).toEqual({ objId: 0, pageNumber: 2, pageContext: {mediaBox: { bottomLeftX: 0, bottomLeftY: 0, topRightX: 595.28, topRightY: 841.89 }, artBox: null, bleedBox: null, cropBox: null, trimBox: null, userUnit: 1.0, objId: 0, contentsObjId: 0, annotations: []} });
324+
expect(doc.internal.getPageInfo(3)).toEqual({ objId: 0, pageNumber: 3, pageContext: {mediaBox: { bottomLeftX: 0, bottomLeftY: 0, topRightX: 595.28, topRightY: 841.89 }, artBox: null, bleedBox: null, cropBox: null, trimBox: null, userUnit: 1.0, objId: 0, contentsObjId: 0, annotations: []} });
325325

326326
expect(function() {doc.internal.getPageInfo('invalid');}).toThrow(new Error('Invalid argument passed to jsPDF.getPageInfo'));
327327
expect(function() {doc.internal.getPageInfo(3.14);}).toThrow(new Error('Invalid argument passed to jsPDF.getPageInfo'));
328328
});
329-
330-
331-
it('jsPDF private function getPageInfo', () => {
332-
const doc = jsPDF()
333-
doc.addPage();
334-
doc.addPage();
335-
expect(doc.__private__.getPageInfo(1)).toEqual({ objId: 0, pageNumber: 1, pageContext: {dimensions: { width: 595.28, height: 841.89, userUnit: 1.0 }, objId: 0, contentsObjId: 0, annotations: []} });
336-
expect(doc.__private__.getPageInfo(2)).toEqual({ objId: 0, pageNumber: 2, pageContext: {dimensions: { width: 595.28, height: 841.89, userUnit: 1.0 }, objId: 0, contentsObjId: 0, annotations: []} });
337-
expect(doc.__private__.getPageInfo(3)).toEqual({ objId: 0, pageNumber: 3, pageContext: {dimensions: { width: 595.28, height: 841.89, userUnit: 1.0 }, objId: 0, contentsObjId: 0, annotations: []} });
338-
339-
expect(function() {doc.__private__.getPageInfo('invalid');}).toThrow(new Error('Invalid argument passed to jsPDF.getPageInfo'));
340-
expect(function() {doc.__private__.getPageInfo(3.14);}).toThrow(new Error('Invalid argument passed to jsPDF.getPageInfo'));
341-
});
342-
329+
343330
it('jsPDF private function getCurrentPageInfo', () => {
344331
const doc = jsPDF()
345332
doc.addPage();
346333
doc.addPage();
347-
expect(doc.__private__.getCurrentPageInfo()).toEqual({ objId: 0, pageNumber: 3, pageContext: {dimensions: { width: 595.28, height: 841.89, userUnit: 1.0 }, objId: 0, contentsObjId: 0, annotations: []} });
334+
expect(doc.__private__.getCurrentPageInfo()).toEqual({ objId: 0, pageNumber: 3, pageContext: {mediaBox: { bottomLeftX: 0, bottomLeftY: 0, topRightX: 595.28, topRightY: 841.89 }, artBox: null, bleedBox: null, cropBox: null, trimBox: null, userUnit: 1.0, objId: 0, contentsObjId: 0, annotations: []} });
348335
});
349336

350337
it('jsPDF private function getArrayBuffer', () => {
@@ -1411,7 +1398,7 @@ break`, 10, 10, {scope: doc});
14111398
doc = jsPDF();
14121399
writeArray = [];
14131400
doc.__private__.setCustomOutputDestination(writeArray);
1414-
doc.__private__.putPage({number: 1, data:['streamData'], dimensions: {width: 595.28, height: 841.89}, resourceDictionaryObjId: 2, rootDictionaryObjId: 1, objId: 3, contentsObjId: 4});
1401+
doc.__private__.putPage({number: 1, data:['streamData'], mediaBox: { bottomLeftX: 0, bottomLeftY: 0, topRightX: 595.28, topRightY: 841.89 }, artBox: null, bleedBox: null, cropBox: null, trimBox: null, userUnit: 1.0, resourceDictionaryObjId: 2, rootDictionaryObjId: 1, objId: 3, contentsObjId: 4});
14151402
expect(writeArray).toEqual(["3 0 obj","<</Type /Page","/Parent 1 0 R","/Resources 2 0 R","/MediaBox [0 0 595.28 841.89]","/Contents 4 0 R",">>","endobj","4 0 obj","<<","/Length 10",">>","stream","streamData","endstream","endobj"]);
14161403
})
14171404

0 commit comments

Comments
 (0)