Mercurial > mercurial > hgweb_xdwtools.cgi
comparison xdwaddatn2.cpp @ 7:8de5b1bd9506
update xdwgrep2.
author | pyon@macmini |
---|---|
date | Sat, 24 Mar 2018 08:51:45 +0900 |
parents | |
children | 61ce4754737e |
comparison
equal
deleted
inserted
replaced
6:a4af60a0ec32 | 7:8de5b1bd9506 |
---|---|
1 /* Makefile | |
2 debug: xdwaddatn2.c | |
3 #rm -rf tempXXXX | |
4 #cls | |
5 g++ -g -O0 -I. xdwaddatn2.c xdwapi.lib | |
6 #date | |
7 #./a.exe -m -i target.xdw | |
8 #date | |
9 | |
10 release: xdwaddatn2.c | |
11 g++ -I. xdwaddatn2.c xdwapi.lib -static -o xdwaddatn2.exe | |
12 strip xdwaddatn2.exe | |
13 | |
14 clean: | |
15 rm -rf tempXXXX | |
16 */ | |
17 | |
18 #include <stdbool.h> | |
19 #include <stdio.h> | |
20 #include <string.h> | |
21 #include <stdlib.h> | |
22 #include <time.h> | |
23 #include <glob.h> | |
24 #include <io.h> | |
25 #include <windows.h> | |
26 #include <xdw_api.h> | |
27 #include <xdwapian.h> | |
28 | |
29 #define MAXCOL 1024 | |
30 #define MAXLINE 9999 | |
31 #define BLOCKSZ 64 | |
32 | |
33 void print_error( int code ) { | |
34 switch ( code ) { | |
35 case XDW_E_NOT_INSTALLED: | |
36 fprintf( stderr, "DocuWorksがインストールされていません。" ); | |
37 break; | |
38 case XDW_E_FILE_NOT_FOUND: | |
39 fprintf( stderr, "指定されたファイルが見つかりません。" ); | |
40 break; | |
41 case XDW_E_FILE_EXISTS: | |
42 fprintf( stderr, "指定されたファイルはすでに存在します。" ); | |
43 break; | |
44 case XDW_E_ACCESSDENIED: | |
45 fprintf( stderr, "指定されたファイルを開くことができません。" ); | |
46 break; | |
47 case XDW_E_INVALID_NAME: | |
48 case XDW_E_BAD_NETPATH: | |
49 fprintf( stderr, "指定されたファイルを開くことができません。(ネットワーク)" ); | |
50 break; | |
51 case XDW_E_BAD_FORMAT: | |
52 fprintf( stderr, "指定されたファイルは正しいフォーマットではありません。" ); | |
53 break; | |
54 case XDW_E_INVALID_ACCESS: | |
55 fprintf( stderr, "指定された操作をする権利がありません。" ); | |
56 break; | |
57 case XDW_E_SHARING_VIOLATION: | |
58 fprintf( stderr, "ファイルが使用中です。" ); | |
59 break; | |
60 default: | |
61 fprintf( stderr, "エラーが発生しました。" ); | |
62 break; | |
63 } | |
64 fprintf( stderr, "[ Error code : %d ]\n", code ); | |
65 } | |
66 | |
67 void print_now( const char *msg ) { | |
68 time_t now = time( NULL ); | |
69 struct tm *ts = localtime( &now ); | |
70 | |
71 char buf[80]; | |
72 strftime( buf, sizeof( buf ), "%H:%M:%S %Z", ts ); | |
73 printf( "%s\t%s\n", buf, msg ); | |
74 } | |
75 | |
76 int add_annotation( XDW_DOCUMENT_HANDLE h, int page, int x, int y, char* string, int* sz, int tr ) | |
77 { | |
78 // テキストアノテーションを作成する | |
79 XDW_ANNOTATION_HANDLE annoation; | |
80 int api_result = XDW_AddAnnotation( h, XDW_AID_TEXT, page, x, y, NULL, &annoation, NULL ); | |
81 if ( api_result < 0 ) return api_result; | |
82 | |
83 // 作成したアノテーションに文字列を設定する | |
84 api_result = XDW_SetAnnotationAttribute( h, annoation, XDW_ATN_Text, XDW_ATYPE_STRING, string, 0, NULL ); // 文字テキスト | |
85 api_result = XDW_SetAnnotationAttribute( h, annoation, XDW_ATN_FontSize, XDW_ATYPE_INT, reinterpret_cast<char*>(sz), 0, NULL ); // フォントサイズ | |
86 if ( tr ) { | |
87 int color = XDW_COLOR_NONE; | |
88 api_result = XDW_SetAnnotationAttribute( h, annoation, XDW_ATN_BackColor, XDW_ATYPE_INT, reinterpret_cast<char*>(&color), 0, NULL ); | |
89 } | |
90 | |
91 return api_result; | |
92 } | |
93 | |
94 | |
95 int main( int argc, char* argv[] ) { | |
96 | |
97 /* オプションの解析 */ | |
98 char prog[128]; | |
99 strcpy( prog, argv[0] ); | |
100 | |
101 bool pnow = false; | |
102 bool mmode = false; | |
103 bool csv = false; | |
104 char c; | |
105 while ( --argc > 0 && ( *++argv )[0] == '-' ) { | |
106 while ( c = *++argv[0] ) { | |
107 switch ( c ) { | |
108 case 'v': | |
109 pnow = true; | |
110 print_now( "start." ); | |
111 break; | |
112 case 'm': /* matched page: now writing... */ | |
113 mmode = true; | |
114 break; | |
115 case 'p': /* page number: now writing... */ | |
116 break; | |
117 case 'i': /* csv file: now writing... */ | |
118 csv = true; | |
119 break; | |
120 default: | |
121 fprintf( stderr, "error: illegal option '%c'.\n", c ); | |
122 exit( 1 ); | |
123 } | |
124 } | |
125 } | |
126 | |
127 if ( argc < 1 ) { | |
128 fprintf( stderr, "%s -m mtxt x y txt sz tr infile\n", prog ); | |
129 fprintf( stderr, "%s -p page x y txt sz tr infile\n", prog ); | |
130 fprintf( stderr, "%s -m -i infile\n", prog ); | |
131 fprintf( stderr, "%s -p -i infile\n", prog ); | |
132 fprintf( stderr, "%s -v -p -i infile\n", prog ); | |
133 fprintf( stderr, "%s -v -m -i infile\n", prog ); | |
134 exit( 1 ); | |
135 } | |
136 | |
137 /* リストの取り込み */ | |
138 char *al = (char*)malloc( MAXLINE * sizeof( char ) * MAXCOL ); | |
139 char buf[ MAXCOL ]; | |
140 int alN = 0; | |
141 if ( csv ) { | |
142 if ( pnow ) print_now( "reading list." ); | |
143 FILE *fp; | |
144 | |
145 if ( al == NULL ) { | |
146 fprintf( stderr, "can't allocate memory\n" ); | |
147 exit( 1 ); | |
148 } | |
149 | |
150 if ( ( fp = fopen( "addatn.list", "r" ) ) == NULL ) { | |
151 fprintf( stderr, "%s: can't open file [addatn.list]\n", argv[0] ); | |
152 exit ( 1 ); | |
153 } | |
154 char *p; | |
155 while ( fgets( buf, sizeof buf, fp ) ) { | |
156 if ( !strncmp( buf, "#", 1 ) ) continue; | |
157 if ( !strncmp( buf, "//", 2 ) ) continue; | |
158 if ( !strcmp( buf, "\n" ) ) continue; | |
159 | |
160 if ( ( p = strchr( buf, '\n' ) ) != NULL ) { | |
161 *p = '\0'; | |
162 } | |
163 strncpy( &al[ alN * MAXCOL ], buf, MAXCOL ); | |
164 alN++; | |
165 } | |
166 fclose( fp ); | |
167 } | |
168 | |
169 /* 本処理:アノテーションを貼付け */ | |
170 if ( pnow ) print_now( "analizing xdw-file." ); | |
171 | |
172 char in_path[ _MAX_PATH ]; | |
173 sprintf( buf, "copy %s %s", argv[0], "tmpXXXX.xdw" ); | |
174 system( buf ); | |
175 _fullpath( in_path, "tmpXXXX.xdw", _MAX_PATH ); | |
176 | |
177 int api_result = 0; | |
178 | |
179 XDW_DOCUMENT_HANDLE h = NULL; // 文書ハンドルを開く | |
180 XDW_OPEN_MODE_EX mode = { | |
181 sizeof( XDW_OPEN_MODE_EX ), XDW_OPEN_UPDATE, XDW_AUTH_NODIALOGUE | |
182 }; | |
183 api_result = XDW_OpenDocumentHandle( in_path, &h, (XDW_OPEN_MODE*)&mode ); | |
184 if ( api_result < 0 ) { | |
185 print_error( api_result ); | |
186 return 0; | |
187 } | |
188 | |
189 if ( !csv ) { | |
190 if ( mmode ) { | |
191 for ( int i = 0; i < alN; i++ ) { | |
192 } | |
193 } | |
194 else { | |
195 } | |
196 } | |
197 else { | |
198 if ( pnow ) print_now( "csv mode." ); | |
199 XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る | |
200 XDW_GetDocumentInformation( h, &info ); | |
201 int last_page = info.nPages; | |
202 | |
203 int x, y, sz, tr; | |
204 char *str, *m, *s; | |
205 if ( mmode ) { | |
206 XDW_FOUND_HANDLE pFoundHandle = NULL; | |
207 for ( int p = 0; p < last_page; p++ ) { | |
208 for ( int i = 0; i < alN; i++ ) { | |
209 strncpy( buf, &al[ i * MAXCOL ], MAXCOL ); | |
210 m = strtok( buf, "," ); | |
211 api_result = XDW_FindTextInPage( h, p + 1, m, NULL, &pFoundHandle, NULL ); | |
212 if ( pFoundHandle ) { | |
213 x = atoi( strtok( NULL, "," ) ); | |
214 y = atoi( strtok( NULL, "," ) ); | |
215 s = strtok( NULL, "," ); | |
216 sz = atoi( strtok( NULL, "," ) ); | |
217 tr = atoi( strtok( NULL, "," ) ); | |
218 api_result = add_annotation( h, p + 1, x, y, s, &sz, tr ); | |
219 if ( api_result < 0 ) { | |
220 print_error( api_result ); | |
221 break; | |
222 } | |
223 } | |
224 } | |
225 } | |
226 XDW_CloseFoundHandle( pFoundHandle ); | |
227 } | |
228 else { | |
229 } | |
230 } | |
231 | |
232 api_result = XDW_SaveDocument( h, NULL ); // 変更をファイルに反映する | |
233 XDW_CloseDocumentHandle( h, NULL ); // 文書ハンドルを閉じる | |
234 | |
235 /* 最適化 */ | |
236 if ( pnow ) print_now( "optimizing." ); | |
237 char out_path[ _MAX_PATH ]; | |
238 _fullpath( out_path, "out.xdw", _MAX_PATH ); | |
239 remove( out_path ); | |
240 api_result = XDW_OptimizeDocument( in_path, out_path, NULL ); | |
241 if ( api_result < 0 ) { | |
242 print_error( api_result ); | |
243 exit( 1 ); | |
244 } | |
245 | |
246 /* 後処理 */ | |
247 if ( pnow ) print_now( "cleaning." ); | |
248 remove( in_path ); | |
249 free( al ); | |
250 | |
251 if ( pnow ) print_now( "done." ); | |
252 return 0; | |
253 } | |
254 |