rpcl.cpp
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:16k
源码类别:

打印编程

开发平台:

Visual C++

  1. /*
  2.    Copyright (C) 2007    Ibadov Tariel   <itk@bk.ru>
  3. */
  4. #include "rpcl.h"
  5. #define FAX_WIDTH  1728
  6. #define FAX_HEIGTH 2292
  7. class IfStream
  8. {
  9. public:
  10. IfStream( const char* fileName );
  11. int get();
  12. BOOL read( char* buff, int len );
  13. ~IfStream();
  14. private:
  15. HANDLE hFile;
  16. };
  17. static BMPINFO bmpinfo;
  18. //----------------------------------------------------------------
  19. static long PageNo = 1;
  20. static long oldPageNo = 1;
  21. static char PageNameBmp[1024];
  22. static int i_count;
  23. static int i_dpi;
  24. static int i_hegint;
  25. static int i_h;
  26. static int i_width;
  27. static int i_size;
  28. static int i_row;
  29. static bool b_row;
  30. int start_convert (char *NamePcl, char *NameBmp ,int img_format, int img_format_ext, BOOL dither, char* extApp)
  31. {
  32. i_count = i_dpi = i_hegint = i_h = i_width = i_size = i_row = 0;
  33. b_row = false;
  34. bmpinfo.width = 0;
  35. bmpinfo.height = 0;
  36. bmpinfo.colours = 24;
  37. bmpinfo.palette = NULL;
  38. bmpinfo.bits = NULL;
  39. pcl2bmp( NamePcl, NameBmp, img_format, img_format_ext, dither, extApp);
  40. return i_count;
  41. }
  42. int pcl2bmp( char *NamePcl, char *NameBmp,int img_format, int img_format_ext, BOOL dither, char* extApp)
  43. {
  44. //std::ifstream ifPcl( NamePcl, std::ios::in | std::ios::binary );
  45. IfStream ifPcl( NamePcl );
  46. //ifPcl.setf( std::ios::hex, std::ios::dec );
  47. int ch = ifPcl.get();
  48. unsigned char* bits = NULL;
  49. int div = 6;
  50. int bmp_height = 0;
  51. int bmp_width = 0;
  52. while( ch != EOF )
  53. {
  54. switch( ch )
  55. {
  56. case 0x2A:
  57. {
  58. ch = ifPcl.get();
  59. ///read dpi
  60. if( ( ch == 0x74 )&&( i_dpi == 0 ) )
  61. {
  62. int i_tmp = 0;
  63. std::string s_dpi;
  64. while( ( ch != 82 )&&( i_tmp < 6 ) )
  65. {
  66. ch = ifPcl.get();
  67. s_dpi += ch;
  68. i_tmp++;
  69. }
  70. i_dpi = atoi((char *)s_dpi.c_str());
  71. switch( i_dpi )
  72. {
  73. case 100:
  74. div = 6;
  75. bmp_height = 1100;
  76. bmp_width = 800;
  77. //bits = new unsigned char[bmp_height*bmp_width*3];
  78. break;
  79. case 200:
  80. div = 3;
  81. bmp_height = 2300;
  82. bmp_width = 1640;
  83. //bits = (unsigned char*)bits_200dpi;
  84. break;
  85. case 300:
  86. div = 2;
  87. bmp_height = 3507;
  88. bmp_width = 2480;
  89. /*bits = (unsigned char*)bits_300dpi;*/
  90. break;
  91. case 600:
  92. div = 1;
  93. bmp_height = 7014;
  94. bmp_width = 4960;
  95. /*bits = (unsigned char*)bits_600dpi;*/
  96. break;
  97. }
  98. if( ( 0 != bmp_width ) && ( 0 != bmp_height ) )
  99. {
  100. bmpinfo.height = bmp_height;
  101. bmpinfo.width = bmp_width;
  102. bmpinfo.bits = (bits = new unsigned char[bmp_height*bmp_width*3]);
  103. memset( bits, 0xff, bmp_height*bmp_width*3 );
  104. }
  105. }
  106. ///read hegint and width
  107. if( ch == 0x70 )
  108. {
  109. int i_tmp = 0;
  110. std::string s_size;
  111. while( ( ch != 0x59 )&&( i_tmp < 10 )&&( ch != 0x58 ) )
  112. {
  113. ch = ifPcl.get();
  114. s_size += ch;
  115. i_tmp++;
  116. }
  117. if( ( ch == 0x59 )&&( s_size != "CC90x0Y" ) )
  118. {
  119. i_hegint = atoi((char *)s_size.c_str());
  120. i_row = i_hegint / div;
  121. b_row = true;
  122. i_h++;
  123. }
  124. if( ch == 0x58 )
  125. {
  126. i_width = atoi((char *)s_size.c_str());
  127. }
  128. if( s_size == "PORTRAITx0" )
  129. {
  130. bmpinfo.height = bmp_height;
  131. }
  132. if( s_size == "CC90x0Y" )
  133. {
  134. bmpinfo.height  = 600;                   
  135. }
  136. }
  137. if( ch == 0x63 )
  138. {
  139. int i_tmp = 0;
  140. std::string s_size;
  141. while( i_tmp < 10 )
  142. {
  143. ch = ifPcl.get();
  144. s_size += ch;
  145. i_tmp++;
  146. }
  147. if( s_size == "0t8129x571" )
  148. {
  149. bmpinfo.height  = 600;                   
  150. }
  151. }
  152. ///   Begin raster graphics at  the current cursor    position.
  153. if( ch == 0x62 )
  154. {
  155. int i_tmp = 0;
  156. std::string s_size;
  157. if( b_row )
  158. b_row = false;
  159. else
  160. i_row++;
  161. while( ( i_tmp < 5 )&&( ch != 0x57 )&&( ch != 'M' ) )
  162. {
  163. ch = ifPcl.get();
  164. s_size += ch;
  165. i_tmp++;
  166. }
  167. if( ch != 'M' )
  168. {
  169. i_size = atoi((char *)s_size.c_str());
  170. int q = 0,i = 0, qq = 0;
  171. char* pdata = new char[i_size];
  172. ch = ifPcl.get();
  173. if( NULL != pdata )
  174. {
  175. ifPcl.read( pdata,i_size);   
  176. for( qq = 0; qq < i_size; qq++)
  177. {
  178. if( img_format != 4 )
  179. {
  180. if( q == 3 )
  181. {
  182. q = (int)(bits+i_row*(3*bmp_width)+i-3)[0];
  183. (bits+i_row*(3*bmp_width)+i-3)[0] = (bits+i_row*(3*bmp_width)+i-1)[0];
  184. (bits+i_row*(3*bmp_width)+i-1)[0] = (unsigned char)q;
  185. q = 0;
  186. }
  187. q++;
  188. }
  189. if( ( i_row < bmp_height)&&( i < (3*bmp_width) ) )
  190. (bits+i_row*(3*bmp_width)+i++)[0] = pdata[qq];
  191. }
  192. delete [] pdata;
  193. }
  194. }
  195. } // end  graphics 
  196. if( ch == 0x72 )
  197. {///end page
  198. ch = ifPcl.get();
  199. if( ( ch == 0x43 )||( ch == 0x42 ) )
  200. {
  201. ch = ifPcl.get();
  202. if( ch == 0x0C )
  203. {
  204. sprintf( PageNameBmp, "%s%d", NameBmp, PageNo );
  205. i_count++;
  206.                             write_log( 3, "pcl2bmp", "%d %d %s", PageNo, i_count, PageNameBmp);   
  207. if (img_format==4)
  208. pdf_save( PageNameBmp, &bmpinfo );
  209. else
  210. {
  211. bmp_save( PageNameBmp, &bmpinfo );
  212. if (img_format==0)
  213. start_toJPG(PageNameBmp,PageNameBmp);
  214. if (img_format==1)
  215. {
  216. write_log( 3, "pcl2bmp", "tiff");
  217. if( (COMPRESSION_CCITTFAX4 == img_format_ext)||(COMPRESSION_CCITTFAX3 == img_format_ext) )
  218. {
  219. write_log( 3, "pcl2bmp", "tiff g3");
  220. if( dither )
  221. {
  222. const char* regPath = "Software\Microsoft\Windows\CurrentVersion\App Paths\PopFax.exe";
  223. HKEY hKey = HKEY_LOCAL_MACHINE;
  224. char ditherApp[4*MAX_PATH] = "";
  225. DWORD pathSize = 4*MAX_PATH;
  226. write_log( 3, "pcl2bmp", "dither");
  227. if( ERROR_SUCCESS == RegOpenKeyExA( hKey, regPath, 0, KEY_READ, &hKey ) )
  228. {
  229. RegQueryValueExA( hKey, NULL, NULL, NULL, (LPBYTE)ditherApp, &pathSize );
  230. RegCloseKey( hKey );
  231. }
  232. if( strlen(ditherApp) )
  233. {
  234. char* buffStr = strrchr( ditherApp, '\' );
  235. if( NULL != buffStr )
  236. {
  237. STARTUPINFOA si;
  238. PROCESS_INFORMATION pi;
  239. std::string  names;
  240. strcpy( buffStr+1, "dither.exe" ); 
  241. names = ditherApp;
  242. names += " /infile "";
  243. names += PageNameBmp;
  244. names += """;
  245. names += " /outfile "";
  246. names += PageNameBmp;
  247. names += "dither";
  248. names += """;//invert invert
  249. ZeroMemory( &si, sizeof(si) );
  250. si.cb = sizeof(si);
  251. ZeroMemory( &pi, sizeof(pi) );
  252. write_log( 3, "pcl2bmp", "%s", names.c_str());
  253. if( CreateProcessA( NULL, (char*)names.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
  254. {
  255. // Wait until child process exits.
  256. WaitForSingleObject( pi.hProcess, INFINITE );
  257. // Close process and thread handles. 
  258. CloseHandle( pi.hProcess );
  259. CloseHandle( pi.hThread );                     
  260. }
  261. remove( PageNameBmp );
  262. names = PageNameBmp;
  263. names += "dither";
  264. //MoveFileA( names.c_str(), PageNameBmp );
  265. CopyFileA( names.c_str(), PageNameBmp, FALSE );
  266. }
  267. }
  268. }
  269. //else
  270. convert_bitmap_to_monochrome( PageNameBmp, PageNameBmp, TRUE );
  271. }   
  272. start_toTiff( PageNameBmp, PageNameBmp, img_format_ext);      
  273. }
  274. if (img_format==2)                                                   
  275. start_toPNG(PageNameBmp,PageNameBmp);
  276. if (img_format==3){                                                 
  277. std::string  namebmp; 
  278. namebmp=PageNameBmp;
  279. namebmp +=".bmp";
  280. rename(PageNameBmp,(const char *)namebmp.c_str());
  281. }//else remove(PageNameBmp);
  282. }
  283. i_row = 0;
  284. PageNo++;
  285.                                                         memset( bits, 0xff, bmp_height*bmp_width*3 );
  286. }
  287. }
  288. }
  289. }///end case 0x1B
  290. }///end switch( ch )
  291. ch = ifPcl.get();
  292. } //while
  293. if( (COMPRESSION_CCITTFAX4 == img_format_ext)||(COMPRESSION_CCITTFAX3 == img_format_ext) )
  294. {
  295. STARTUPINFOA si;
  296. PROCESS_INFORMATION pi;
  297. std::string  names;
  298. char nstr[100] = "";
  299. if( COMPRESSION_CCITTFAX4 == img_format_ext )
  300. names = "tiffcp.exe -c g4";  
  301. else                    
  302. names = "tiffcp.exe -c g3:2d";
  303. for( int i = oldPageNo; i <= PageNo; i++)
  304. {
  305. names += " "";
  306. names += NameBmp;
  307. sprintf( nstr, "%d", i );
  308. names += nstr;
  309. names += ".tif"";
  310. }
  311. names += " "";
  312. names += NameBmp;
  313. names += "_res_";
  314. sprintf( nstr, "%d", oldPageNo );
  315. names += nstr;
  316. names += "_";
  317. sprintf( nstr, "%d", PageNo - oldPageNo );
  318. names += nstr;
  319. names += ".tif"";
  320. ZeroMemory( &si, sizeof(si) );
  321. si.cb = sizeof(si);
  322. ZeroMemory( &pi, sizeof(pi) );
  323. //ShellExecuteA( NULL, "open", "tiffcp.exe", names.c_str(), NULL, SW_HIDE);
  324. if( CreateProcessA( NULL, (char*)names.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
  325. {
  326. // Wait until child process exits.
  327. WaitForSingleObject( pi.hProcess, INFINITE );
  328. // Close process and thread handles. 
  329. CloseHandle( pi.hProcess );
  330. CloseHandle( pi.hThread );                     
  331. }
  332. /* for( int i = oldPageNo; i <= PageNo; i++)
  333. {
  334. names = NameBmp;
  335. sprintf( nstr, "%d", i );
  336. names += nstr;
  337. names += ".tif";
  338. DeleteFileA( names.c_str() );
  339. }*/
  340. const char* regPath = "Software\Microsoft\Windows\CurrentVersion\App Paths\PopFax.exe";
  341. HKEY hKey = HKEY_LOCAL_MACHINE;
  342. char popFaxPath[4*MAX_PATH] = "";
  343. DWORD pathSize = 4*MAX_PATH;
  344. if( ERROR_SUCCESS == RegOpenKeyExA( hKey, regPath, 0, KEY_READ, &hKey ) )
  345. {
  346. RegQueryValueExA( hKey, NULL, NULL, NULL, (LPBYTE)popFaxPath, &pathSize );
  347. RegCloseKey( hKey );
  348. }
  349. if( strlen(popFaxPath) )
  350. {
  351. names = """;
  352. names += NameBmp;
  353. names += "_res_";
  354. sprintf( nstr, "%d", oldPageNo );
  355. names += nstr;
  356. names += "_";
  357. sprintf( nstr, "%d", PageNo - oldPageNo );
  358. names += nstr;
  359. names += ".tif"";
  360. ShellExecuteA( NULL, "open", popFaxPath, names.c_str(), NULL, SW_SHOW); 
  361. }
  362. }
  363. oldPageNo = PageNo;  
  364. if( bits )
  365. delete [] bits;
  366. return 0;
  367. }
  368. //BOOL convert_bitmap_to_monochrome( const char* inBmp, const char* outBmp, BOOL dither, BOOL invert )
  369. //{
  370. // BOOL ret = FALSE;
  371. // HBITMAP hBmp = NULL;
  372. //
  373. // if( NULL != (hBmp = (HBITMAP)LoadImageA( NULL, inBmp, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_MONOCHROME) ) )
  374. // {
  375. // BITMAP bm;
  376. // HDC hdcSrc = CreateCompatibleDC( NULL );
  377. // HDC hdcDest = CreateCompatibleDC( hdcSrc );
  378. // SelectObject( hdcSrc, hBmp );
  379. // GetObject( hBmp, sizeof(BITMAP), &bm );
  380. //
  381. // HBITMAP hBmpDest = CreateBitmap( FAX_WIDTH, FAX_HEIGTH, 1, 1, NULL);
  382. // SelectObject( hdcDest, hBmpDest );
  383. // StretchBlt( hdcDest, 0, 0, FAX_WIDTH, FAX_HEIGTH, hdcSrc, 0, 0, bm.bmWidth, bm.bmHeight, NOTSRCCOPY);
  384. // DeleteObject( hBmp );
  385. //
  386. // ret = save_bitmap( outBmp, hBmpDest );
  387. //
  388. // DeleteObject( hBmpDest );
  389. // DeleteDC( hdcSrc );
  390. // DeleteDC( hdcDest );
  391. //
  392. // }
  393. // return ret;
  394. //}
  395. BOOL convert_bitmap_to_monochrome( const char* inBmp, const char* outBmp, BOOL invert  )
  396. {
  397. BOOL ret = FALSE;
  398. HBITMAP hBmp = NULL;
  399. BITMAP bm;
  400. HDC hdcSrc = NULL;
  401. HDC hdcDest = NULL;
  402. HBITMAP hBmpDest = NULL;
  403. hBmp = (HBITMAP)LoadImageA( NULL, inBmp, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_MONOCHROME);
  404. hdcSrc = CreateCompatibleDC( NULL );
  405. hdcDest = CreateCompatibleDC( hdcSrc );
  406. SelectObject( hdcSrc, hBmp );
  407. GetObject( hBmp, sizeof(BITMAP), &bm );
  408. hBmpDest = CreateBitmap( FAX_WIDTH, FAX_HEIGTH, 1, 1, NULL);
  409. SelectObject( hdcDest, hBmpDest );
  410.     StretchBlt( hdcDest, 0, 0, FAX_WIDTH, FAX_HEIGTH, hdcSrc, 0, 0, bm.bmWidth, bm.bmHeight, invert?NOTSRCCOPY:SRCCOPY);
  411. ret = save_bitmap( outBmp, (invert)?hBmpDest:hBmp );
  412. (NULL!=hBmpDest)?DeleteObject( hBmpDest ):0;
  413. (NULL!=hBmp)?DeleteObject( hBmp ):0;
  414. (NULL!=hdcSrc)?DeleteDC( hdcSrc ):0;
  415. (NULL!=hdcDest)?DeleteDC( hdcDest ):0;
  416. return ret;
  417. }
  418. BOOL save_bitmap( const char* name, HBITMAP bitmap)
  419. {
  420. HDC hdcScreen = NULL; // Device context of the screen
  421. HWND hwndScreen = NULL; // Desktop window handle
  422. int i = 0; // Counts the number of scanlines
  423. BYTE *bits = NULL; // Pointer to the bitmap's bits
  424. BITMAPINFOHEADER *info; // Info structure about this bitmap
  425. HANDLE fp = NULL; // A file handle
  426. BITMAPFILEHEADER finfo; // File info header
  427. long ctsize = 0;        // 
  428. DWORD dw = 0; // Doubleword return code
  429. char *ptr = NULL; // Pointer used to write the opening BM
  430. hwndScreen = GetDesktopWindow();
  431. hdcScreen = GetDC( hwndScreen );
  432. info = (BITMAPINFOHEADER*)GlobalAlloc(GMEM_FIXED,sizeof(BITMAPFILEHEADER)+(1024*sizeof(RGBQUAD)));
  433. info->biSize = sizeof(BITMAPINFOHEADER);
  434. info->biBitCount = 0;
  435. i = GetDIBits( hdcScreen, // handle of device context 
  436. bitmap, // handle of bitmap 
  437. 0, // first scan line to set in destination bitmap 
  438. 0, // number of scan lines to copy 
  439. NULL, // address of array for bitmap bits 
  440. (BITMAPINFO*)info, // address of structure with bitmap data 
  441. DIB_RGB_COLORS // RGB or palette index
  442.  );
  443. switch( info->biBitCount )
  444. {
  445. case 1:ctsize=2;break;
  446. case 4:ctsize=16;break;
  447. case 8:ctsize=256;break;
  448. case 16:ctsize=0;break;
  449. case 24:ctsize=0;break;
  450. case 32:ctsize=0;break;
  451. default:
  452. ReleaseDC( hwndScreen, hdcScreen );
  453. return FALSE;
  454. }
  455. bits = (unsigned char*)GlobalAlloc( GMEM_FIXED, info->biSizeImage);
  456. i = GetDIBits( hdcScreen, // handle of device context 
  457. bitmap, // handle of bitmap 
  458. 0, // first scan line to set in destination bitmap 
  459. info->biHeight, // number of scan lines to copy 
  460. bits, // address of array for bitmap bits 
  461. (BITMAPINFO*)info, // address of structure with bitmap data 
  462. DIB_RGB_COLORS // RGB or palette index
  463.  );
  464. ptr = (char *)&finfo.bfType;
  465. ptr[0]='B';
  466. ptr[1]='M';
  467. finfo.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*ctsize);
  468. finfo.bfSize = finfo.bfOffBits+info->biSizeImage/*imgsize*/;
  469. finfo.bfReserved1 = 0;
  470.     finfo.bfReserved2 = 0;       
  471. fp = CreateFileA(name,// pointer to name of the file 
  472. GENERIC_WRITE, // access (read-write) mode 
  473. 0, // share mode 
  474. NULL, // pointer to security attributes 
  475. CREATE_ALWAYS,// how to create
  476. FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,// file attributes 
  477. NULL // handle to file with attributes to copy 
  478. );
  479. WriteFile( fp, &finfo, sizeof(BITMAPFILEHEADER), &dw, NULL);
  480. WriteFile( fp, info, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*ctsize, &dw, NULL);
  481. WriteFile( fp, bits, info->biSizeImage/*imgsize*/, &dw, NULL);
  482. CloseHandle( fp );
  483. GlobalFree( info );
  484. GlobalFree( bits );
  485. ReleaseDC( hwndScreen,hdcScreen );
  486. return TRUE;
  487. }
  488. IfStream::IfStream( const char* fileName )
  489. {
  490. hFile = CreateFileA( fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
  491.         write_log( 3, "IfStream::IfStream", "%d %s", hFile, fileName );  
  492. }
  493. int IfStream::get()
  494. {
  495. char ch = EOF;
  496. int ret = EOF;
  497. DWORD dwReaded = 0;
  498. if( INVALID_HANDLE_VALUE != hFile )
  499. {
  500. ret = 0;
  501. ReadFile( hFile, &ch, sizeof(ch), &dwReaded, 0);
  502. memcpy( &ret, &ch, sizeof(ch) );
  503. if( 0 == dwReaded )
  504. ret = EOF;
  505. }
  506. return ret;
  507. }
  508. BOOL IfStream::read( char* buff, int len )
  509. {
  510. BOOL ret = FALSE;
  511. DWORD dwReaded = 0;
  512. if( INVALID_HANDLE_VALUE != hFile )
  513. {
  514. ret = ReadFile( hFile, buff, len, &dwReaded, 0);
  515. if( 0 == dwReaded )
  516. ret = FALSE;
  517. }
  518. return ret;
  519. }
  520. IfStream::~IfStream()
  521. {
  522. if( INVALID_HANDLE_VALUE != hFile )
  523. CloseHandle( hFile );
  524. }