visual-c++ - online - open ps files windows
Enviar documento Postscript a la impresora usando VC++ (3)
Es más complicado de lo que sospechas. Si se trata de una impresora postscript , conectada a través de un puerto serial o usb, puede simplemente abrir el dispositivo y escribir el archivo. Del mismo modo, si se trata de una impresora de postscript conectada a una red Ethernet, puede conectarse al puerto 9100 ( telnet my.network.printer 9100 < pic.ps
) (es posible que no telnet my.network.printer 9100 < pic.ps
correctamente el número de puerto, que deba olfatear o investigación) y escribe el archivo.
Pero si se trata de una impresora anterior, entonces debe interpretar el código de postscript y enviar páginas rasterizadas a la impresora.
Si se trata de una impresora PCL / PS combinada, es posible que deba agregar un encabezado PCL para ingresar al modo PS según la configuración de la impresora (si todo está configurado para "detección automática", no se preocupe por esta parte). Sabrá hacer esto si obtiene bits de código postscript impreso, posiblemente con otros gobbeldegook, en lugar de la salida deseada.
Me avergüenza decir que no sé realmente cómo abrir un dispositivo usb en Windows c ++, pero si me sirve, la forma de DOS era usar lpt1:
como el nombre de archivo (como en copy pic.ps lpt1:
que haría usa el dispositivo
Si se trata de una impresora compartida, realmente debería pasar por la cola de impresión de la red, en lugar de ir directamente a la impresora.
Tengo un archivo de postscript. ¿Cómo puedo enviarlo a una impresora usando Visual C ++? Esto parece que debería ser simple.
No es tan dificil. Puede usar el protocolo LPD (Line Printer Daemon) para hablar con el servidor. El protocolo es simple, puede leer la especificación y escribir una por su cuenta.
Otra forma es invocar el comando lpr
directamente. Sin embargo, este comando está deshabilitado en Windows 7 de forma predeterminada. Buscar "lpr command windows 7" le dirá cómo habilitarlo.
Si la impresora admite PostScript directamente, puede poner en cola trabajos de impresión como esta:
HANDLE ph;
OpenPrinter(&ph, "Printer Name", NULL);
di1.pDatatype = IsV4Driver("Printer Name") ? "XPS_PASS" : "RAW";
di1.pDocName = "Raw print document";
di1.pOutputFile = NULL;
StartDocPrinter(ph, 1, (LPBYTE)&di1);
StartPagePrinter(ph);
WritePrinter(ph, buffer, dwRead, &dwWritten);
EndPagePrinter(ph);
EndDocPrinter(ph)
Repita la WritePrinter hasta que haya puesto en cola todo el archivo.
IsV4Driver () Comprueba si hay controladores de la versión 4, esto es necesario en Windows 8 y Server 2012:
bool IsV4Driver(wchar_t* printerName)
{
HANDLE handle;
PRINTER_DEFAULTS defaults;
defaults.DesiredAccess = PRINTER_ACCESS_USE;
defaults.pDatatype = L"RAW";
defaults.pDevMode = NULL;
if (::OpenPrinter(printerName, &handle, &defaults) == 0)
{
return false;
}
DWORD version = GetVersion(handle);
ClosePrinter(handle);
return version == 4;
}
DWORD GetVersion(HANDLE handle)
{
DWORD needed;
GetPrinterDriver(handle, NULL, 2, NULL, 0, &needed);
std::vector<char> buffer(needed);
return ((DRIVER_INFO_2*) &buffer[0])->cVersion;
}