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

打印编程

开发平台:

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. #define RPCL_WIDTH  800
  8. #define RPCL_HEIGTH 1100
  9. //static unsigned char bits[1100][2400];
  10. static unsigned char bits[RPCL_HEIGTH][RPCL_WIDTH*3];
  11. static BMPINFO bmpinfo;
  12. //----------------------------------------------------------------
  13. static long PageNo = 1;
  14. static long oldPageNo = 1;
  15. static char PageNameBmp[1024];
  16. static int i_count;
  17. static int i_dpi;
  18. static int i_hegint;
  19. static int i_h;
  20. static int i_width;
  21. static int i_size;
  22. static int i_row;
  23. static bool b_row;
  24. void set_bit()
  25. {
  26. for (int i_i =0;i_i<=RPCL_HEIGTH-1;i_i++){
  27. for (int i_i1 =0;i_i1<=(RPCL_WIDTH*3)-1;i_i1++){
  28. bits[i_i][i_i1]=0x0ff;
  29.         }
  30. }
  31. }
  32. int start_convert (char *NamePcl, char *NameBmp ,int img_format, int img_format_ext, char* extApp)
  33. {
  34.         i_count=0;    
  35. bmpinfo.bits    = (unsigned char *)bits;
  36. //bmpinfo.width   = 800;
  37.         //bmpinfo.height  = 1100;
  38. bmpinfo.width   = RPCL_WIDTH;
  39.         bmpinfo.height  = RPCL_HEIGTH;
  40.         bmpinfo.colours = 24;
  41.         bmpinfo.palette = NULL;
  42. memset( bits, 0, sizeof(bits) );
  43.         pcl2bmp(NamePcl,NameBmp,img_format, img_format_ext, extApp);
  44.         return i_count;
  45. }
  46. int pcl2bmp( char *NamePcl, char *NameBmp,int img_format, int img_format_ext, char* extApp)
  47. {
  48.     set_bit();
  49.     ifstream ifPcl( NamePcl, ios::in | ios::binary  );
  50.     ifPcl.setf(  ios::hex, ios::dec );
  51.     int ch;
  52. ch = ifPcl.get();
  53. while( ch != EOF ){
  54. switch( ch ){
  55.         case 0x2A:{
  56. ch = ifPcl.get();
  57. ///read dpi
  58. if ((ch==0x74)&&(i_dpi==0)){
  59. int i_tmp=0;
  60. std::string s_dpi;
  61. while ( (ch != 82)&&(i_tmp<6 )){
  62. ch = ifPcl.get();
  63. s_dpi +=ch;
  64. i_tmp++;
  65. }
  66. i_dpi=atoi((char *)s_dpi.c_str());
  67. }
  68. ///read hegint and width
  69. if (ch==0x70){
  70. int i_tmp=0;
  71. std::string s_size;
  72. while ( (ch != 0x59)&&(i_tmp<10 )&&(ch != 0x58)){
  73.     ch = ifPcl.get();
  74. s_size +=ch;
  75. i_tmp++;
  76. }
  77. if ((ch==0x59)&&(s_size!="CC90x0Y")){
  78. i_hegint=atoi((char *)s_size.c_str());
  79. i_row=i_hegint /6;
  80. b_row=true;
  81. i_h++;
  82. }
  83. if (ch==0x58){
  84. i_width=atoi((char *)s_size.c_str());
  85. }
  86. if(s_size=="PORTRAITx0"){
  87.                                bmpinfo.height  = /*1100*/RPCL_HEIGTH;
  88.                             }
  89.       if(s_size=="CC90x0Y"){
  90.                                bmpinfo.height  = 600;                   
  91.                             }
  92. }
  93.              if (ch==0x63){
  94.   int i_tmp=0;
  95.   std::string s_size;
  96.    while ( i_tmp<10 ){
  97.       ch = ifPcl.get();
  98.   s_size +=ch;
  99.   i_tmp++;
  100.                           }
  101.            if(s_size=="0t8129x571"){
  102.                             bmpinfo.height  = 600;                   
  103.                           }
  104.    }
  105. ///   Begin raster graphics at  the current cursor    position.
  106. if (ch==0x62){
  107.                                         if (b_row)  b_row=false;  else  i_row++;
  108.                                    int i_tmp=0;
  109. std::string s_size;
  110. while ( (i_tmp<4 )&&(ch != 0x57)&&(ch != 'M')){
  111. ch = ifPcl.get();
  112. s_size +=ch;
  113. i_tmp++;
  114. }
  115. if (ch!='M'){
  116.               i_size=atoi((char *)s_size.c_str());
  117. int q=0,i=0,qq;
  118. char pdata[8000];
  119. ch = ifPcl.get();
  120.    ifPcl.read( pdata,i_size);   
  121.                                             for ( qq=0; qq < i_size; qq++) {
  122. if (img_format!=4){
  123. if (q==3){
  124. q=bits[i_row][i-3];
  125. bits[i_row][i-3]=bits[i_row][i-1];
  126. bits[i_row][i-1]=q;
  127. q=0;
  128. } q++;
  129. }
  130.                                                      if ((i_row<RPCL_HEIGTH/*1100*/)&&(i<(3*RPCL_WIDTH)))        
  131.                                                      bits[i_row][i++] =pdata[qq];
  132. }
  133. }
  134. } // end  graphics 
  135. if (ch==0x72){///end page
  136. ch = ifPcl.get();
  137. if ((ch==0x43)||(ch==0x42)){
  138. ch = ifPcl.get();
  139. if (ch==0x0C){
  140.                                                 sprintf( PageNameBmp, "%s%d", NameBmp, PageNo );
  141.                                                 i_count++;
  142. if (img_format==4) pdf_save( PageNameBmp, &bmpinfo );
  143. else{
  144. bmp_save( PageNameBmp, &bmpinfo );
  145. if (img_format==0)
  146. start_toJPG(PageNameBmp,PageNameBmp);
  147. if (img_format==1)
  148. {
  149.                                                             if( (COMPRESSION_CCITTFAX4 == img_format_ext)||(COMPRESSION_CCITTFAX3 == img_format_ext) )
  150.                                                                 convert_bitmap_to_monochrome( PageNameBmp, PageNameBmp );                                                                                                                    
  151. start_toTiff(PageNameBmp,PageNameBmp,img_format_ext);      
  152. }
  153. if (img_format==2)                                                   
  154. start_toPNG(PageNameBmp,PageNameBmp);
  155. if (img_format==3){                                                 
  156. std::string  namebmp; 
  157. namebmp=PageNameBmp;
  158. namebmp +=".bmp";
  159. rename(PageNameBmp,(const char *)namebmp.c_str());
  160. }//else remove(PageNameBmp);
  161. }
  162.                                                 memset( bits, 0, sizeof(bits) );
  163. i_row=0; PageNo++;
  164. set_bit();
  165. }
  166. }
  167. }
  168.   }///end case 0x1B
  169. }///end switch( ch )
  170. ch = ifPcl.get();
  171. } //while
  172.         if( (COMPRESSION_CCITTFAX4 == img_format_ext)||(COMPRESSION_CCITTFAX3 == img_format_ext) )
  173.         {
  174.                 STARTUPINFOA si;
  175.                 PROCESS_INFORMATION pi;
  176.             std::string  names;
  177.                 char nstr[100] = "";
  178.                 if( COMPRESSION_CCITTFAX4 == img_format_ext )
  179.                     names = "tiffcp.exe -c g4";  
  180.                 else                    
  181.                     names = "tiffcp.exe -c g3:2d";
  182.                 
  183.          for( int i = oldPageNo; i <= PageNo; i++)
  184.                 {
  185.                      names += " ";
  186.                      names += NameBmp;
  187.                      sprintf( nstr, "%d", i );
  188.                      names += nstr;
  189.                      names += ".tif";
  190.                 }
  191.                 names += " ";
  192.                 names += NameBmp;
  193.                 names += "_res_";
  194.                 sprintf( nstr, "%d", oldPageNo );
  195.                 names += nstr;
  196.                 names += "_";
  197.                 sprintf( nstr, "%d", PageNo - oldPageNo );
  198.                 names += nstr;
  199.                 names += ".tif";
  200.           
  201.                 ZeroMemory( &si, sizeof(si) );
  202.                 si.cb = sizeof(si);
  203.                 ZeroMemory( &pi, sizeof(pi) );
  204.          //ShellExecuteA( NULL, "open", "tiffcp.exe", names.c_str(), NULL, SW_HIDE);
  205.                 if( CreateProcessA( NULL, (char*)names.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
  206.                 {
  207.                    // Wait until child process exits.
  208.                    WaitForSingleObject( pi.hProcess, INFINITE );
  209.                    // Close process and thread handles. 
  210.                    CloseHandle( pi.hProcess );
  211.                    CloseHandle( pi.hThread );                     
  212.                 }
  213.          for( int i = oldPageNo; i <= PageNo; i++)
  214.                 {
  215.                      names = NameBmp;
  216.                      sprintf( nstr, "%d", i );
  217.                      names += nstr;
  218.                      names += ".tif";
  219.                      DeleteFileA( names.c_str() );
  220.                 }
  221.                 const char* regPath = "Software\Microsoft\Windows\CurrentVersion\App Paths\PopFax.exe";
  222.         HKEY hKey = HKEY_LOCAL_MACHINE;
  223.         char popFaxPath[4*MAX_PATH] = "";
  224.          DWORD pathSize = 4*MAX_PATH;
  225.         if( ERROR_SUCCESS == RegOpenKeyExA( hKey, regPath, 0, KEY_READ, &hKey ) )
  226.               {
  227.      RegQueryValueExA( hKey, NULL, NULL, NULL, (LPBYTE)popFaxPath, &pathSize );
  228.      RegCloseKey( hKey );
  229.              }
  230.                 if( strlen(popFaxPath) )
  231.                 {
  232.                     names = NameBmp;
  233.                     names += "_res_";
  234.                     sprintf( nstr, "%d", oldPageNo );
  235.                     names += nstr;
  236.                     names += "_";
  237.                     sprintf( nstr, "%d", PageNo - oldPageNo );
  238.                     names += nstr;
  239.                     names += ".tif";
  240.                     ShellExecuteA( NULL, "open", popFaxPath, names.c_str(), NULL, SW_SHOW); 
  241.                 }
  242.          }
  243.          oldPageNo = PageNo;  
  244.     if(bmpinfo.bits) free(bmpinfo.bits);
  245. return 0;
  246. }
  247. BOOL convert_bitmap_to_monochrome( const char* inBmp, const char* outBmp )
  248. {
  249. BOOL ret = FALSE;
  250. HBITMAP hBmp = NULL;
  251. if( NULL != (hBmp = (HBITMAP)LoadImageA( NULL, inBmp, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_MONOCHROME) ) )
  252. {
  253. BITMAP bm;
  254. HDC hdcSrc = CreateCompatibleDC( NULL );
  255. HDC hdcDest = CreateCompatibleDC( hdcSrc );
  256. SelectObject( hdcSrc, hBmp );
  257. GetObject( hBmp, sizeof(BITMAP), &bm );
  258. HBITMAP hBmpDest = CreateBitmap( FAX_WIDTH, FAX_HEIGTH, 1, 1, NULL);
  259. SelectObject( hdcDest, hBmpDest );
  260. StretchBlt( hdcDest, 0, 0, FAX_WIDTH, FAX_HEIGTH, hdcSrc, 0, 0, bm.bmWidth, bm.bmHeight, NOTSRCCOPY);
  261. DeleteObject( hBmp );
  262. ret = save_bitmap( outBmp, hBmpDest );
  263. DeleteObject( hBmpDest );
  264. DeleteDC( hdcSrc );
  265. DeleteDC( hdcDest );
  266. }
  267. return ret;
  268. }
  269. BOOL save_bitmap( const char* name,HBITMAP bitmap)
  270. {
  271. HDC hdcScreen = NULL; // Device context of the screen
  272. HWND hwndScreen = NULL; // Desktop window handle
  273. int i = 0; // Counts the number of scanlines
  274. BYTE *bits = NULL; // Pointer to the bitmap's bits
  275. BITMAPINFOHEADER *info; // Info structure about this bitmap
  276. HANDLE fp = NULL; // A file handle
  277. BITMAPFILEHEADER finfo; // File info header
  278. long ctsize = 0;        // 
  279. long imgsize = 0;       // Various sizes needed to build the file
  280. long pixels = 0;        //
  281. DWORD dw = 0; // Doubleword return code
  282. char *ptr = NULL; // Pointer used to write the opening BM
  283. hwndScreen = GetDesktopWindow();
  284. hdcScreen = GetDC( hwndScreen );
  285. info = (BITMAPINFOHEADER*)GlobalAlloc(GMEM_FIXED,sizeof(BITMAPFILEHEADER)+(1024*sizeof(RGBQUAD)));
  286. info->biSize = sizeof(BITMAPINFOHEADER);
  287. info->biBitCount = 0;
  288. i = GetDIBits( hdcScreen, // handle of device context 
  289. bitmap, // handle of bitmap 
  290. 0, // first scan line to set in destination bitmap 
  291. 0, // number of scan lines to copy 
  292. NULL, // address of array for bitmap bits 
  293. (BITMAPINFO*)info, // address of structure with bitmap data 
  294. DIB_RGB_COLORS // RGB or palette index
  295.  );
  296. //if( (info->biBitCount!=4) && (info->biBitCount!=8) && (info->biBitCount!=24) )
  297. // info->biBitCount = 24;
  298. info->biBitCount = 1;
  299. info->biCompression = BI_RGB;
  300. pixels = info->biWidth*info->biHeight;
  301. switch( info->biBitCount )
  302. {
  303. case 1:ctsize=2;imgsize=pixels/8;break;
  304. case 4:ctsize=16;imgsize=pixels/2;break;
  305. case 8:ctsize=256;imgsize=pixels;break;
  306. case 16:ctsize=0;imgsize=pixels*2;break;
  307. case 24:ctsize=0;imgsize=pixels*3;break;
  308. case 32:ctsize=0;imgsize=pixels*4;break;
  309. default:
  310. ReleaseDC( hwndScreen, hdcScreen );
  311. return FALSE;
  312. }
  313. bits = (unsigned char*)GlobalAlloc(GMEM_FIXED,imgsize);
  314. i = GetDIBits( hdcScreen, // handle of device context 
  315. bitmap, // handle of bitmap 
  316. 0, // first scan line to set in destination bitmap 
  317. info->biHeight, // number of scan lines to copy 
  318. bits, // address of array for bitmap bits 
  319. (BITMAPINFO*)info, // address of structure with bitmap data 
  320. DIB_RGB_COLORS // RGB or palette index
  321.  );
  322. ptr = (char *)&finfo.bfType;
  323. ptr[0]='B';
  324. ptr[1]='M';
  325. finfo.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*ctsize);
  326. finfo.bfSize = finfo.bfOffBits+imgsize;
  327. finfo.bfReserved1 = 0;
  328.     finfo.bfReserved2 = 0;       
  329. fp = CreateFileA(name,// pointer to name of the file 
  330. GENERIC_WRITE, // access (read-write) mode 
  331. 0, // share mode 
  332. NULL, // pointer to security attributes 
  333. CREATE_ALWAYS,// how to create
  334. FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,// file attributes 
  335. NULL // handle to file with attributes to copy 
  336. );
  337. WriteFile( fp, &finfo, sizeof(BITMAPFILEHEADER), &dw, NULL);
  338. WriteFile( fp, info, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*ctsize, &dw, NULL);
  339. WriteFile( fp, bits, imgsize, &dw, NULL);
  340. CloseHandle( fp );
  341. GlobalFree( info );
  342. GlobalFree( bits );
  343. ReleaseDC( hwndScreen,hdcScreen );
  344. return TRUE;
  345. }