6
|
1 /* Makefile
|
8
|
2 debug: xdwextpage2.cpp
|
|
3 gcc -g -O0 -I. xdwextpage2.cpp xdwapi.lib
|
6
|
4 #date
|
|
5 #./a.exe target.xdw
|
|
6 #date
|
|
7
|
8
|
8 release: xdwextpage2.cpp
|
|
9 gcc -I. xdwextpage2.cpp xdwapi.lib -static -o xdwextpage2.exe
|
6
|
10 strip xdwextpage2.exe
|
|
11
|
|
12 */
|
|
13
|
8
|
14 #include <stdbool.h>
|
6
|
15 #include <stdio.h>
|
|
16 #include <string.h>
|
|
17 #include <stdlib.h>
|
|
18 #include <time.h>
|
|
19 #include <io.h>
|
|
20 #include <windows.h>
|
|
21 #include <xdw_api.h>
|
|
22
|
8
|
23 #define MAXCOL 1024
|
|
24 #define MAXLINE 9999
|
|
25
|
6
|
26 void print_error( int code ) {
|
|
27 fprintf( stderr, "Error code : %d\n", code );
|
|
28 switch ( code ) {
|
|
29 case XDW_E_NOT_INSTALLED:
|
|
30 fprintf( stderr, "DocuWorksがインストールされていません。" );
|
|
31 break;
|
|
32 case XDW_E_FILE_NOT_FOUND:
|
|
33 fprintf( stderr, "指定されたファイルが見つかりません。" );
|
|
34 break;
|
|
35 case XDW_E_FILE_EXISTS:
|
|
36 fprintf( stderr, "指定されたファイルはすでに存在します。" );
|
|
37 break;
|
|
38 case XDW_E_ACCESSDENIED:
|
|
39 case XDW_E_INVALID_NAME:
|
|
40 case XDW_E_BAD_NETPATH:
|
|
41 fprintf( stderr, "指定されたファイルを開くことができません。" );
|
|
42 break;
|
|
43 case XDW_E_BAD_FORMAT:
|
|
44 fprintf( stderr, "指定されたファイルは正しいフォーマットではありません。" );
|
|
45 break;
|
|
46 case XDW_E_INVALID_ACCESS:
|
|
47 fprintf( stderr, "指定された操作をする権利がありません。" );
|
|
48 break;
|
|
49 default:
|
|
50 fprintf( stderr, "エラーが発生しました。" );
|
|
51 break;
|
|
52 }
|
|
53 }
|
|
54
|
8
|
55 void print_help( const char *prog ) {
|
|
56 fprintf( stderr, "%s p infile outfile\n", prog );
|
|
57 fprintf( stderr, "%s -i infile outfile\n", prog );
|
|
58 fprintf( stderr, "%s -i -v infile outfile\n", prog );
|
|
59 fprintf( stderr, "%s -l p infile outfile\n", prog );
|
|
60 fprintf( stderr, "%s p:q infile outfile\n", prog );
|
|
61 fprintf( stderr, "%s p: infile outfile\n", prog );
|
|
62 fprintf( stderr, "%s :q infile outfile\n", prog );
|
|
63 }
|
|
64
|
|
65 void print_now( const char *msg ) {
|
6
|
66 time_t now = time( NULL );
|
|
67 struct tm *ts = localtime( &now );
|
|
68
|
|
69 char buf[80];
|
|
70 strftime( buf, sizeof( buf ), "%H:%M:%S %Z", ts );
|
|
71 printf( "%s\t%s\n", buf, msg );
|
|
72 }
|
|
73
|
|
74 int main( int argc, char* argv[] ) {
|
|
75
|
|
76 /* オプションの解析 */
|
|
77 char prog[128];
|
|
78 strcpy( prog, argv[0] );
|
|
79
|
8
|
80 bool pnow = false;
|
|
81 bool plist = false;
|
|
82 bool inv = false;
|
6
|
83 char c;
|
|
84 while ( --argc > 0 && ( *++argv )[0] == '-' ) {
|
|
85 while ( c = *++argv[0] ) {
|
|
86 switch ( c ) {
|
|
87 case 'l':
|
8
|
88 pnow = true;
|
6
|
89 print_now( "start." );
|
|
90 break;
|
8
|
91 case 'v':
|
|
92 inv = true;
|
|
93 break;
|
|
94 case 'i':
|
|
95 plist = true;
|
|
96 break;
|
|
97 case 'h':
|
|
98 print_help( prog );
|
|
99 exit( 1 );
|
6
|
100 default:
|
|
101 fprintf( stderr, "error: illegal option '%c'.\n", c );
|
|
102 exit( 1 );
|
|
103 }
|
|
104 }
|
|
105 }
|
|
106
|
8
|
107 if ( argc != 3 && !plist ) {
|
|
108 print_help( prog );
|
6
|
109 exit( 1 );
|
|
110 }
|
|
111
|
|
112 /* メイン処理 */
|
|
113
|
|
114 char in_path[ _MAX_PATH ], out_path[ _MAX_PATH ], tmp_path[ _MAX_PATH ];
|
|
115 _fullpath( in_path, argv[1], _MAX_PATH );
|
|
116 _fullpath( out_path, argv[2], _MAX_PATH );
|
8
|
117 if ( plist ) {
|
|
118 _fullpath( in_path, argv[0], _MAX_PATH );
|
|
119 _fullpath( out_path, argv[1], _MAX_PATH );
|
|
120 }
|
6
|
121 _fullpath( tmp_path, "tempXXXX.xdw", _MAX_PATH );
|
|
122
|
|
123 remove( tmp_path );
|
|
124 remove( out_path );
|
|
125
|
8
|
126 char buf[ MAXCOL ];
|
6
|
127 sprintf( buf, "copy %s %s", in_path, tmp_path );
|
|
128 system( buf );
|
|
129
|
|
130 int api_result = 0;
|
|
131
|
|
132 // 文書ハンドルを開く
|
|
133 XDW_DOCUMENT_HANDLE h = NULL;
|
|
134 XDW_OPEN_MODE_EX mode = { sizeof( XDW_OPEN_MODE_EX ), XDW_OPEN_UPDATE, XDW_AUTH_NODIALOGUE };
|
|
135 api_result = XDW_OpenDocumentHandle( tmp_path, &h, ( XDW_OPEN_MODE* )&mode );
|
|
136 if ( api_result < 0 ) {
|
|
137 print_error( api_result );
|
|
138 return 1;
|
|
139 }
|
|
140
|
|
141 XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る
|
|
142 XDW_GetDocumentInformation( h, &info );
|
|
143 int last_page = info.nPages;
|
|
144
|
8
|
145 if ( plist ) {
|
|
146 /* リストの取り込み */
|
|
147 char *al = (char*)malloc( MAXLINE * sizeof( char ) * MAXCOL );
|
|
148 int alN = 0;
|
|
149 if ( plist ) {
|
|
150 if ( pnow ) print_now( "reading list." );
|
|
151 FILE *fp;
|
|
152
|
|
153 if ( al == NULL ) {
|
|
154 fprintf( stderr, "can't allocate memory\n" );
|
|
155 exit( 1 );
|
|
156 }
|
|
157
|
|
158 if ( ( fp = fopen( "extpage.list", "r" ) ) == NULL ) {
|
|
159 fprintf( stderr, "%s: can't open file [extpage.list]\n", prog );
|
|
160 exit ( 1 );
|
|
161 }
|
|
162 char *p;
|
|
163 while ( fgets( buf, sizeof buf, fp ) ) {
|
|
164 if ( !strncmp( buf, "#", 1 ) ) continue;
|
|
165 if ( !strncmp( buf, "//", 2 ) ) continue;
|
|
166 if ( !strcmp( buf, "\n" ) ) continue;
|
|
167
|
|
168 if ( ( p = strchr( buf, '\n' ) ) != NULL ) {
|
|
169 *p = '\0';
|
|
170 }
|
|
171 strncpy( &al[ alN * MAXCOL ], buf, MAXCOL );
|
|
172 alN++;
|
|
173 }
|
|
174 fclose( fp );
|
|
175 }
|
|
176
|
|
177 bool ext[MAXLINE];
|
|
178 for ( int p = 0; p < last_page; p++ ) ext[p] = false;
|
|
179 for ( int i = 0; i < alN; i++ ) {
|
|
180 int p = atoi( &al[ i * MAXCOL ] );
|
|
181 if ( p != 0 ) ext[ p - 1 ] = true;
|
|
182 }
|
|
183 if ( inv ) for ( int p = 0; p < last_page; p++ ) ext[p] = !ext[p];
|
|
184
|
|
185 for ( int p = last_page; p > 0; p-- ) {
|
|
186 if ( !ext[ p - 1 ] ) {
|
|
187 api_result = XDW_DeletePage( h, p, NULL );
|
|
188 if ( api_result < 0 ) {
|
|
189 print_error( api_result );
|
|
190 exit( 1 );
|
|
191 }
|
|
192 }
|
|
193 }
|
|
194 }
|
|
195 else {
|
|
196 int bgn = 1;
|
|
197 int end = 0;
|
|
198 if ( strchr( argv[0], ':' ) == NULL ) {
|
|
199 bgn = end = atoi( argv[0] );
|
|
200 } else {
|
|
201 if ( strcmp( argv[0], ":" ) == 0 ) {
|
|
202 fprintf( stderr, "bad page range.\n" );
|
|
203 exit( 1 );
|
|
204 }
|
|
205 if ( argv[0][0] == ':' ) {
|
|
206 end = atoi( strtok( argv[0], ":" ) );
|
|
207 } else {
|
|
208 bgn = atoi( strtok( argv[0], ":" ) );
|
|
209 end = atoi( strtok( NULL, ":" ) );
|
|
210 if ( end == 0 ) end = last_page;
|
|
211 }
|
|
212 }
|
|
213
|
|
214 //printf( "bgn = %d, end = %d\n", bgn, end );
|
|
215 if ( bgn < 1 || end < 1 || bgn > end || bgn > last_page || end > last_page ) {
|
6
|
216 fprintf( stderr, "bad page range.\n" );
|
|
217 exit( 1 );
|
|
218 }
|
8
|
219
|
|
220 for ( int i = last_page; i > 0; i-- ) {
|
|
221 if ( i < bgn || i > end ) api_result = XDW_DeletePage( h, i, NULL );
|
6
|
222 }
|
|
223 }
|
|
224
|
|
225 // 文書ハンドルを閉じる
|
|
226 XDW_SaveDocument( h, NULL );
|
|
227 XDW_CloseDocumentHandle( h, NULL );
|
|
228
|
|
229 // 最適化
|
|
230 api_result = XDW_OptimizeDocument( tmp_path, out_path, NULL );
|
|
231 if ( api_result < 0 ) {
|
|
232 print_error( api_result );
|
|
233 exit( 1 );
|
|
234 }
|
|
235 remove( tmp_path );
|
|
236
|
|
237 if ( pnow ) print_now( "done." );
|
|
238 return 0;
|
|
239 }
|
|
240
|