Rainier, Is it possible PrinterFileText() converts ESC codes to pdfcreator letter attributes ?
Regards Ranier escribió en mensaje <4bdf205e.2080...@cultura.com.br>... Hi, This is a simple draft, but maybe is useful for anyone... Original Win_PrinterFileRaw, bypass the driver to printer, with PDFCreator does not work. But, changing from "RAW" to "TEXT" with PDFCreator works, maybe with others drivers printers works too. Additionally, SetPrinterCFG allows change Orientation direct with driver (extract from microsoft msdn site). Question: Is possible add a set functions like SET( PRINTER_CFG, HB_ORIENTATION, HB_LANDSCAPE) ... SET( PRINTER_CFG, HB_PAPER, HB_PAPER_A4) Best regards, Ranier Vilela BOOL SetPrinterCFG(HANDLE hPrinter, LPCTSTR lpPrinterName, short dmOrientation) { DWORD dwNeeded = 0; PRINTER_INFO_2 *pi2 = NULL; DEVMODE *pDevMode = NULL; BOOL bFlag; LONG lFlag; assert(hPrinter != NULL); // The first GetPrinter tells you how big the buffer should be in // order to hold all of PRINTER_INFO_2. Note that this should fail with // ERROR_INSUFFICIENT_BUFFER. If GetPrinter fails for any other reason // or dwNeeded isn't set for some reason, then there is a problem... SetLastError(0); bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded); if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0)) { return FALSE; } // Allocate enough space for PRINTER_INFO_2... pi2 = (PRINTER_INFO_2 *) hb_xgrab( dwNeeded ); if (pi2 == NULL) { return FALSE; } // The second GetPrinter fills in all the current settings, so all you // need to do is modify what you're interested in... bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded); if (!bFlag) { hb_xfree( pi2 ); return FALSE; } // If GetPrinter didn't fill in the DEVMODE, try to get it by calling // DocumentProperties... if (pi2->pDevMode == NULL) { LONG lSize = DocumentProperties(NULL, hPrinter,( LPTSTR ) lpPrinterName, NULL, NULL, 0); if (lSize <= 0) { hb_xfree( pi2 ); return FALSE; } pDevMode = (DEVMODE *) hb_xgrab( lSize ); if (pDevMode == NULL) { hb_xfree( pi2 ); return FALSE; } lFlag = DocumentProperties(NULL, hPrinter,( LPTSTR ) lpPrinterName, pDevMode, NULL, DM_OUT_BUFFER); if (lFlag != IDOK || pDevMode == NULL) { hb_xfree( pDevMode ); hb_xfree( pi2 ); return FALSE; } pi2->pDevMode = pDevMode; } // Driver is reporting that it doesn't support this change... if (!(pi2->pDevMode->dmFields & DM_ORIENTATION)) { hb_xfree( pi2 ); if (pDevMode) { hb_xfree( pDevMode ); } return FALSE; } // Specify exactly what we are attempting to change... pi2->pDevMode->dmFields = DM_ORIENTATION; pi2->pDevMode->dmOrientation = dmOrientation; // Do not attempt to set security descriptor... pi2->pSecurityDescriptor = NULL; // Make sure the driver-dependent part of devmode is updated... lFlag = DocumentProperties(NULL, hPrinter,( LPTSTR ) lpPrinterName, pi2->pDevMode, pi2->pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER); if (lFlag != IDOK) { hb_xfree( pi2 ); if (pDevMode) { hb_xfree( pDevMode ); } return FALSE; } // Update printer information... bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0); if (!bFlag) // The driver doesn't support, or it is unable to make the change... { hb_xfree( pi2 ); if ( pDevMode ) { hb_xfree( pDevMode ); } return FALSE; } // Tell other apps that there was a change... SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L, (LPARAM)(LPCSTR)lpPrinterName, SMTO_NORMAL, 1000, NULL); // Clean up... if ( pi2 ) { hb_xfree( pi2 ); } if ( pDevMode ) { hb_xfree( pDevMode ); } return TRUE; } HB_FUNC( PRINTFILETEXT ) { int iResult = -1; if( HB_ISCHAR( 1 ) && HB_ISCHAR( 2 ) && HB_ISNUM( 3 ) ) { const char * pszFileName = hb_parc( 2 ); const unsigned int iWidth = hb_parni( 3 ); HANDLE hPrinter; void * hDeviceName; LPCTSTR lpDeviceName = HB_PARSTR( 1, &hDeviceName, NULL ); if( OpenPrinter( ( LPTSTR ) lpDeviceName, &hPrinter, NULL ) != 0 ) { void * hDocName; DOC_INFO_1 DocInfo; // change orientation to LANDSCAPE, only if Width > 112 if ( iWidth > 112 ) { if (SetPrinterCFG(hPrinter, lpDeviceName, DMORIENT_LANDSCAPE)) { // Tell other apps that there was a change... SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L, (LPARAM)(LPCSTR)lpDeviceName, SMTO_NORMAL, 1000, NULL); } } DocInfo.pDocName = ( LPTSTR ) HB_PARSTR( HB_ISCHAR( 3 ) ? 3 : 2, &hDocName, NULL ); DocInfo.pOutputFile = NULL; DocInfo.pDatatype = ( LPTSTR ) TEXT( "TEXT" ); //DocInfo.pDatatype = ( LPTSTR ) TEXT( "RAW" ); if( StartDocPrinter( hPrinter, 1, ( LPBYTE ) &DocInfo ) != 0 ) { if( StartPagePrinter( hPrinter ) != 0 ) { HB_FHANDLE fhnd = hb_fsOpen( pszFileName, FO_READ | FO_SHARED ); if( fhnd != FS_ERROR ) { HB_BYTE pbyBuffer[ 32 * 1024 ]; DWORD dwWritten = 0; HB_SIZE nRead; while( ( nRead = hb_fsReadLarge( fhnd, pbyBuffer, sizeof( pbyBuffer ) ) ) > 0 ) { WritePrinter( hPrinter, pbyBuffer, ( DWORD ) nRead, &dwWritten ); } iResult = 1; hb_fsClose( fhnd ); } else iResult = -6; EndPagePrinter( hPrinter ); } else iResult = -4; EndDocPrinter( hPrinter ); } else iResult = -3; ClosePrinter( hPrinter ); hb_strfree( hDocName ); } else iResult = -2; hb_strfree( hDeviceName ); } }
_______________________________________________ Harbour mailing list (attachment size limit: 40KB) Harbour@harbour-project.org http://lists.harbour-project.org/mailman/listinfo/harbour