17
17
* 2014 Juan Pablo Gaviria, https://github.com/juanpgaviria
18
18
* 2014 James Makes, https://github.com/dollaruw
19
19
* 2014 Diego Casorran, https://github.com/diegocr
20
+ * 2014 Steven Spungin, https://github.com/Flamenco
20
21
*
21
22
* Permission is hereby granted, free of charge, to any person obtaining
22
23
* a copy of this software and associated documentation files (the
39
40
*
40
41
* Contributor(s):
41
42
* siefkenj, ahwolf, rickygu, Midnith, saintclair, eaparango,
42
- * kim3er, mfo, alnorth,
43
+ * kim3er, mfo, alnorth, Flamenco
43
44
*/
44
45
45
46
/**
@@ -198,6 +199,7 @@ var jsPDF = (function(global) {
198
199
} ,
199
200
API = { } ,
200
201
events = new PubSub ( API ) ,
202
+ lastTextWasStroke = false ,
201
203
202
204
/////////////////////
203
205
// Private functions
@@ -228,6 +230,17 @@ var jsPDF = (function(global) {
228
230
out ( objectNumber + ' 0 obj' ) ;
229
231
return objectNumber ;
230
232
} ,
233
+ // Does not output the object. The caller must call newObjectDeferredBegin(oid) before outputing any data
234
+ newObjectDeferred = function ( ) {
235
+ objectNumber ++ ;
236
+ offsets [ objectNumber ] = function ( ) {
237
+ return content_length ;
238
+ } ;
239
+ return objectNumber ;
240
+ } ,
241
+ newObjectDeferredBegin = function ( oid ) {
242
+ offsets [ oid ] = content_length ;
243
+ } ,
231
244
putStream = function ( str ) {
232
245
out ( 'stream' ) ;
233
246
out ( str ) ;
@@ -251,7 +264,10 @@ var jsPDF = (function(global) {
251
264
out ( '/Parent 1 0 R' ) ;
252
265
out ( '/Resources 2 0 R' ) ;
253
266
out ( '/MediaBox [0 0 ' + f2 ( wPt ) + ' ' + f2 ( hPt ) + ']' ) ;
254
- out ( '/Contents ' + ( objectNumber + 1 ) + ' 0 R>>' ) ;
267
+ out ( '/Contents ' + ( objectNumber + 1 ) + ' 0 R' ) ;
268
+ // Added for annotation plugin
269
+ events . publish ( 'putPage' , { pageNumber :n , page :pages [ n ] } ) ;
270
+ out ( '>>' ) ;
255
271
out ( 'endobj' ) ;
256
272
257
273
// Page content
@@ -766,7 +782,12 @@ var jsPDF = (function(global) {
766
782
out ( '0 ' + ( objectNumber + 1 ) ) ;
767
783
out ( p + ' 65535 f ' ) ;
768
784
for ( i = 1 ; i <= objectNumber ; i ++ ) {
769
- out ( ( p + offsets [ i ] ) . slice ( - 10 ) + ' 00000 n ' ) ;
785
+ var offset = offsets [ i ] ;
786
+ if ( typeof offset === 'function' ) {
787
+ out ( ( p + offsets [ i ] ( ) ) . slice ( - 10 ) + ' 00000 n ' ) ;
788
+ } else {
789
+ out ( ( p + offsets [ i ] ) . slice ( - 10 ) + ' 00000 n ' ) ;
790
+ }
770
791
}
771
792
// Trailer
772
793
out ( 'trailer' ) ;
@@ -918,6 +939,8 @@ var jsPDF = (function(global) {
918
939
} ,
919
940
'collections' : { } ,
920
941
'newObject' : newObject ,
942
+ 'newObjectDeferred' : newObjectDeferred ,
943
+ 'newObjectDeferredBegin' : newObjectDeferredBegin ,
921
944
'putStream' : putStream ,
922
945
'events' : events ,
923
946
// ratio that you use in multiplication of a given "size" number to arrive to 'point'
@@ -941,7 +964,17 @@ var jsPDF = (function(global) {
941
964
'getNumberOfPages' : function ( ) {
942
965
return pages . length - 1 ;
943
966
} ,
944
- 'pages' : pages
967
+ 'pages' : pages ,
968
+ 'out' : out ,
969
+ 'f2' : f2 ,
970
+ 'getPageInfo' : function ( pageNumberOneBased ) {
971
+ var objId = ( pageNumberOneBased - 1 ) * 2 + 3 ;
972
+ return { objId :objId , pageNumber :pageNumberOneBased } ;
973
+ } ,
974
+ 'getCurrentPageInfo' : function ( ) {
975
+ var objId = ( currentPage - 1 ) * 2 + 3 ;
976
+ return { objId :objId , pageNumber :currentPage } ;
977
+ }
945
978
} ;
946
979
947
980
/**
@@ -960,6 +993,47 @@ var jsPDF = (function(global) {
960
993
_setPage . apply ( this , arguments ) ;
961
994
return this ;
962
995
} ;
996
+ API . insertPage = function ( beforePage ) {
997
+ this . addPage ( ) ;
998
+ this . movePage ( currentPage , beforePage ) ;
999
+ return this ;
1000
+ } ;
1001
+ API . movePage = function ( targetPage , beforePage ) {
1002
+ if ( targetPage > beforePage ) {
1003
+ var tmpPages = pages [ targetPage ] ;
1004
+ var tmpPagedim = pagedim [ targetPage ] ;
1005
+ for ( var i = targetPage ; i > beforePage ; i -- ) {
1006
+ pages [ i ] = pages [ i - 1 ] ;
1007
+ pagedim [ i ] = pagedim [ i - 1 ] ;
1008
+ }
1009
+ pages [ beforePage ] = tmpPages ;
1010
+ pagedim [ beforePage ] = tmpPagedim ;
1011
+ this . setPage ( beforePage ) ;
1012
+ } else if ( targetPage < beforePage ) {
1013
+ var tmpPages = pages [ targetPage ] ;
1014
+ var tmpPagedim = pagedim [ targetPage ] ;
1015
+ for ( var i = targetPage ; i < beforePage ; i ++ ) {
1016
+ pages [ i ] = pages [ i + 1 ] ;
1017
+ pagedim [ i ] = pagedim [ i + 1 ] ;
1018
+ }
1019
+ pages [ beforePage ] = tmpPages ;
1020
+ pagedim [ beforePage ] = tmpPagedim ;
1021
+ this . setPage ( beforePage ) ;
1022
+ }
1023
+ return this ;
1024
+ } ;
1025
+ API . deletePage = function ( targetPage ) {
1026
+ for ( var i = targetPage ; i < page ; i ++ ) {
1027
+ pages [ i ] = pages [ i + 1 ] ;
1028
+ pagedim [ i ] = pagedim [ i + 1 ] ;
1029
+ }
1030
+ page -- ;
1031
+ if ( currentPage > page ) {
1032
+ currentPage = page ;
1033
+ }
1034
+ this . setPage ( currentPage ) ;
1035
+ return this ;
1036
+ } ;
963
1037
API . setDisplayMode = function ( zoom , layout , pmode ) {
964
1038
zoomMode = zoom ;
965
1039
layoutMode = layout ;
@@ -1047,7 +1121,23 @@ var jsPDF = (function(global) {
1047
1121
flags . noBOM = true ;
1048
1122
if ( ! ( 'autoencode' in flags ) )
1049
1123
flags . autoencode = true ;
1050
-
1124
+
1125
+ //TODO this might not work after object block changes
1126
+ // It would be better to pass in a page context
1127
+ var strokeOption = '' ;
1128
+ if ( true === flags . stroke ) {
1129
+ if ( this . lastTextWasStroke !== true ) {
1130
+ strokeOption = '1 Tr\n' ;
1131
+ this . lastTextWasStroke = true ;
1132
+ }
1133
+ }
1134
+ else {
1135
+ if ( this . lastTextWasStroke ) {
1136
+ strokeOption = '0 Tr\n' ;
1137
+ }
1138
+ this . lastTextWasStroke = false ;
1139
+ }
1140
+
1051
1141
if ( text instanceof Array ) {
1052
1142
// we don't want to destroy original text array, so cloning it
1053
1143
var sa = text . concat ( ) , da = [ ] , i , len = sa . length ;
@@ -1108,6 +1198,7 @@ var jsPDF = (function(global) {
1108
1198
'BT\n/' +
1109
1199
activeFontKey + ' ' + activeFontSize + ' Tf\n' + // font face, style, size
1110
1200
( activeFontSize * lineHeightProportion ) + ' TL\n' + // line spacing
1201
+ strokeOption + // stroke option
1111
1202
textColor +
1112
1203
'\n' + xtra + f2 ( x * k ) + ' ' + f2 ( ( pageHeight - y ) * k ) + ' ' + mode + '\n(' +
1113
1204
text +
0 commit comments