1+ using System ;
2+ using iTextSharp . text ;
3+ using iTextSharp . text . pdf ;
4+ using Org . BouncyCastle . Asn1 . Ocsp ;
5+
6+ namespace PDFBookletMaker
7+ {
8+ class Program
9+ {
10+ static void Main ( string [ ] args )
11+ {
12+ if ( args != null && args . Length == 6 ) {
13+ if ( ! ( args . Contains ( "-source" ) || args . Contains ( "-s" ) ) || ! ( args . Contains ( "-dest" ) || args . Contains ( "-d" ) ) || ! ( args . Contains ( "-bsize" ) || args . Contains ( "-b" ) ) ) {
14+ printHelp ( ) ;
15+ return ;
16+ }
17+ string source = "" , dest = "" ;
18+ int bookletSize = 0 ;
19+ for ( int i = 0 ; i < 5 ; i += 2 ) {
20+ if ( args [ i ] . Equals ( "-source" ) || args [ i ] . Equals ( "-s" ) ) {
21+ source = args [ i + 1 ] ;
22+ }
23+ if ( args [ i ] . Equals ( "-dest" ) || args [ i ] . Equals ( "-d" ) ) {
24+ dest = args [ i + 1 ] ;
25+ }
26+ if ( args [ i ] . Equals ( "-bsize" ) || args [ i ] . Equals ( "-b" ) ) {
27+ try {
28+ bookletSize = Convert . ToInt32 ( args [ i + 1 ] ) ;
29+ if ( bookletSize < 4 || bookletSize % 4 != 0 ) {
30+ Console . WriteLine ( "Booklet Size must be a positive integer and multiple of 4" ) ;
31+ return ;
32+ }
33+ }
34+ catch {
35+ Console . WriteLine ( "Booklet Size must be a positive integer and multiple of 4" ) ;
36+ return ;
37+ }
38+ }
39+ }
40+ try {
41+ PdfReader reader = new PdfReader ( source ) ;
42+ int booklets = reader . NumberOfPages / bookletSize ;
43+ int pagesNeeded = reader . NumberOfPages % bookletSize ;
44+ pagesNeeded = bookletSize - pagesNeeded ;
45+ if ( pagesNeeded > 0 )
46+ booklets ++ ;
47+ int addToFront = 0 ;
48+ int addToBack = 0 ;
49+ if ( pagesNeeded % 2 == 0 ) {
50+ addToFront = pagesNeeded / 2 ;
51+ addToBack = pagesNeeded / 2 ;
52+ }
53+ else {
54+ addToFront = ( pagesNeeded - 1 ) / 2 ;
55+ addToBack = ( ( pagesNeeded - 1 ) / 2 ) + 1 ;
56+ }
57+ Console . WriteLine ( $ "This will create { booklets } booklets") ;
58+ Console . WriteLine ( $ "{ pagesNeeded } pages must be added for a booklet size of { bookletSize } .") ;
59+ char response = 't' ;
60+ do {
61+ Console . WriteLine ( $ "Would you like to add { addToFront } blank pages to the Front and { addToBack } blank pages to the Back? (Y/N)") ;
62+ response = Console . ReadKey ( ) . KeyChar ;
63+ } while ( response != 'y' && response != 'n' && response != 'Y' && response != 'N' ) ;
64+ if ( response == 'n' || response == 'N' ) {
65+ Console . WriteLine ( "\n Goodbye!" ) ;
66+ return ;
67+ }
68+ else {
69+ Console . WriteLine ( $ "\n Converting { source } to { dest } with a booklet size of { bookletSize } ") ;
70+ string tempfile = $ "temp-{ Guid . NewGuid ( ) . ToString ( ) } .pdf";
71+ using ( var tempStream = new FileStream ( tempfile , FileMode . Create ) ) {
72+ PdfStamper stamper = new PdfStamper ( reader , tempStream ) ;
73+ for ( int j = 0 ; j < addToFront ; j ++ ) {
74+ stamper . InsertPage ( 0 , PageSize . A4 ) ;
75+ }
76+ for ( int j = 0 ; j < addToFront ; j ++ ) {
77+ stamper . InsertPage ( reader . NumberOfPages + 1 , PageSize . A4 ) ;
78+ }
79+ stamper . Close ( ) ;
80+ }
81+ List < int > pageOrder = new List < int > ( ) ;
82+ int count = 0 ;
83+ int n = ( booklets * bookletSize ) - 1 ;
84+ int i = 0 ;
85+ do {
86+ pageOrder . Add ( n + 1 ) ;
87+ pageOrder . Add ( i + 1 ) ;
88+ n -- ;
89+ i ++ ;
90+ pageOrder . Add ( i + 1 ) ;
91+ pageOrder . Add ( n + 1 ) ;
92+ n -- ;
93+ i ++ ;
94+ } while ( i < n ) ;
95+ PdfReader reader2 = new PdfReader ( tempfile ) ;
96+ using ( var destDocStream = new FileStream ( dest , FileMode . Create ) ) {
97+ var pdfConcat = new PdfConcatenate ( destDocStream ) ;
98+ reader2 . SelectPages ( pageOrder ) ;
99+ pdfConcat . AddPages ( reader2 ) ;
100+ reader2 . Close ( ) ;
101+ pdfConcat . Close ( ) ;
102+ }
103+ File . Delete ( tempfile ) ;
104+ Console . WriteLine ( $ "resulting pdf can be found at { dest } .") ;
105+ Console . WriteLine ( "When printing result use 2 page per side option and duplex printing on short edge" ) ;
106+ }
107+ reader . Close ( ) ;
108+ }
109+ catch ( Exception ex ) {
110+ Console . WriteLine ( ex . Message ) ;
111+ return ;
112+ }
113+ }
114+ else {
115+ printHelp ( ) ;
116+ }
117+ }
118+
119+ static private void printHelp ( ) {
120+ Console . WriteLine ( "Invalid Arguments! Must have all 3 parameters" ) ;
121+ Console . WriteLine ( "-source (-s)\t \t \t source document location" ) ;
122+ Console . WriteLine ( "-dest (-d)\t \t \t destination document location" ) ;
123+ Console . WriteLine ( "-bsize (-b)\t \t \t booklet size (multiple of 4)" ) ;
124+ }
125+ }
126+ }
0 commit comments