@@ -4,8 +4,7 @@ var Promise = require("es6-promise").Promise;
44
55var path = require ( "path" ) ;
66var fs = require ( "fs" ) ;
7- var util = require ( "util" ) ;
8- var exec = require ( "child_process" ) . exec ;
7+ var spawn = require ( "child-process-promise" ) . spawn ;
98
109function PDFImage ( pdfFilePath , options ) {
1110 if ( ! options ) options = { } ;
@@ -23,10 +22,10 @@ function PDFImage(pdfFilePath, options) {
2322
2423PDFImage . prototype = {
2524 constructGetInfoCommand : function ( ) {
26- return util . format (
27- "pdfinfo \"%s\" ",
28- this . pdfFilePath
29- ) ;
25+ return {
26+ cmd : "pdfinfo ",
27+ args : [ this . pdfFilePath ]
28+ } ;
3029 } ,
3130 parseGetInfoCommandOutput : function ( output ) {
3231 var info = { } ;
@@ -40,20 +39,12 @@ PDFImage.prototype = {
4039 getInfo : function ( ) {
4140 var self = this ;
4241 var getInfoCommand = this . constructGetInfoCommand ( ) ;
43- var promise = new Promise ( function ( resolve , reject ) {
44- exec ( getInfoCommand , function ( err , stdout , stderr ) {
45- if ( err ) {
46- return reject ( {
47- message : "Failed to get PDF'S information" ,
48- error : err ,
49- stdout : stdout ,
50- stderr : stderr
51- } ) ;
52- }
53- return resolve ( self . parseGetInfoCommandOutput ( stdout ) ) ;
54- } ) ;
42+ return new Promise ( function ( resolve , reject ) {
43+ spawn ( getInfoCommand . cmd , getInfoCommand . args , { capture : [ 'stdout' , 'stderr' ] } )
44+ . then ( function ( cmdResult ) {
45+ resolve ( self . parseGetInfoCommandOutput ( cmdResult . stdout . toString ( ) ) ) ;
46+ } ) . catch ( reject ) ;
5547 } ) ;
56- return promise ;
5748 } ,
5849 numberOfPages : function ( ) {
5950 return this . getInfo ( ) . then ( function ( info ) {
@@ -84,46 +75,53 @@ PDFImage.prototype = {
8475 constructConvertCommandForPage : function ( pageNumber ) {
8576 var pdfFilePath = this . pdfFilePath ;
8677 var outputImagePath = this . getOutputImagePathForPage ( pageNumber ) ;
87- var convertOptionsString = this . constructConvertOptions ( ) ;
88- return util . format (
89- "%s %s\"%s[%d]\" \"%s\"" ,
90- this . useGM ? "gm convert" : "convert" ,
91- convertOptionsString ? convertOptionsString + " " : "" ,
92- pdfFilePath , pageNumber , outputImagePath
93- ) ;
78+ var convertOptions = this . constructConvertOptions ( ) ;
79+ var args = [ ] ;
80+ if ( convertOptions ) args = convertOptions . slice ( ) ;
81+ args . push ( pdfFilePath + "[" + pageNumber + "]" ) ;
82+ args . push ( outputImagePath ) ;
83+
84+ return {
85+ cmd : this . useGM ? "gm convert" : "convert" ,
86+ args : args
87+ } ;
9488 } ,
9589 constructCombineCommandForFile : function ( imagePaths ) {
96- return util . format (
97- "%s -append %s \"%s\"" ,
98- this . useGM ? "gm convert" : "convert" ,
99- imagePaths . join ( ' ' ) ,
100- this . getOutputImagePathForFile ( )
101- ) ;
90+ var args = imagePaths . slice ( ) ;
91+ args . push ( this . getOutputImagePathForFile ( ) ) ;
92+ args . unshift ( "-append" ) ;
93+ return {
94+ cmd : this . useGM ? "gm convert" : "convert" ,
95+ args : args
96+ } ;
10297 } ,
10398 constructConvertOptions : function ( ) {
104- return Object . keys ( this . convertOptions ) . sort ( ) . map ( function ( optionName ) {
99+ var convertOptions = [ ] ;
100+ Object . keys ( this . convertOptions ) . sort ( ) . map ( function ( optionName ) {
105101 if ( this . convertOptions [ optionName ] !== null ) {
106- return optionName + " " + this . convertOptions [ optionName ] ;
102+ convertOptions . push ( optionName ) ;
103+ convertOptions . push ( this . convertOptions [ optionName ] ) ;
107104 } else {
108- return optionName ;
105+ convertOptions . push ( optionName ) ;
109106 }
110- } , this ) . join ( " " ) ;
107+ } , this ) ;
108+ return convertOptions ;
111109 } ,
112110 combineImages : function ( imagePaths ) {
113111 var pdfImage = this ;
114112 var combineCommand = pdfImage . constructCombineCommandForFile ( imagePaths ) ;
115113 return new Promise ( function ( resolve , reject ) {
116- exec ( combineCommand , function ( err , stdout , stderr ) {
117- if ( err ) {
118- return reject ( {
114+ spawn ( combineCommand . cmd , combineCommand . args , { capture : [ 'stdout' , 'stderr' ] } )
115+ . then ( function ( ) {
116+ spawn ( "rm" , imagePaths ) ; //cleanUp
117+ resolve ( pdfImage . getOutputImagePathForFile ( ) ) ;
118+ } ) . catch ( function ( error ) {
119+ reject ( {
119120 message : "Failed to combine images" ,
120- error : err ,
121- stdout : stdout ,
122- stderr : stderr
121+ error : error . message ,
122+ stdout : error . stdout ,
123+ stderr : error . stderr
123124 } ) ;
124- }
125- exec ( "rm " + imagePaths . join ( ' ' ) ) ; //cleanUp
126- return resolve ( pdfImage . getOutputImagePathForFile ( ) ) ;
127125 } ) ;
128126 } ) ;
129127 } ,
@@ -167,16 +165,18 @@ PDFImage.prototype = {
167165
168166 var promise = new Promise ( function ( resolve , reject ) {
169167 function convertPageToImage ( ) {
170- exec ( convertCommand , function ( err , stdout , stderr ) {
171- if ( err ) {
172- return reject ( {
168+ return new Promise ( function ( resolve , reject ) {
169+ spawn ( convertCommand . cmd , convertCommand . args , { capture : [ 'stdout' , 'stderr' ] } )
170+ . then ( function ( ) {
171+ resolve ( outputImagePath ) ;
172+ } ) . catch ( function ( error ) {
173+ reject ( {
173174 message : "Failed to convert page to image" ,
174- error : err ,
175- stdout : stdout ,
176- stderr : stderr
175+ error : error . message ,
176+ stdout : error . stdout ,
177+ stderr : error . stderr
177178 } ) ;
178- }
179- return resolve ( outputImagePath ) ;
179+ } ) ;
180180 } ) ;
181181 }
182182
@@ -194,7 +194,9 @@ PDFImage.prototype = {
194194
195195 if ( imageNotExists ) {
196196 // (1)
197- convertPageToImage ( ) ;
197+ convertPageToImage ( ) . then ( function ( result ) {
198+ resolve ( result ) ;
199+ } ) . catch ( reject ) ;
198200 return ;
199201 }
200202
@@ -209,11 +211,10 @@ PDFImage.prototype = {
209211
210212 if ( imageFileStat . mtime < pdfFileStat . mtime ) {
211213 // (2)
212- convertPageToImage ( ) ;
213- return ;
214+ convertPageToImage ( ) . then ( function ( result ) {
215+ resolve ( result ) ;
216+ } ) . catch ( reject ) ;
214217 }
215-
216- return resolve ( outputImagePath ) ;
217218 } ) ;
218219 } ) ;
219220 } ) ;
0 commit comments