2013-06-13 1 views
1

У меня есть файл postscript. Как отправить его на принтер с помощью Visual C++? Кажется, это должно быть просто.Отправка Postscript документа на принтер с использованием VC++

+0

Я ползком через API GDI и любые другие документы принтера можно увидеть от Microsoft. Я могу напрямую отправлять команды GDI. Я могу получить принтер HDC. Но я не вижу, как просто отправлять команды postscript напрямую. Для совместимого с постскриптумом принтера это должно быть возможно, нет? – chowey

ответ

5

Если принтер поддерживает PostScript напрямую можно намотать неразмеченное задание на печать, как это:

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) 

Повторять WritePrinter, пока вы не наматывали весь файл.

IsV4Driver() Проверяет версии 4 водителей, это необходимо в Windows 8 и сервер 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; 
} 
+0

Отлично, это сработало для меня. Одна коррекция - вы делаете «EndDocPrinter» дважды, но я уверен, что первого не должно быть. – chowey

1

Это сложнее, чем вы подозреваете. Если это принтер postscript, подключенный через последовательный порт или порт USB, вы можете просто открыть устройство и записать файл. Аналогично, если принтер с постскриптумом подключен к сети Ethernet, вы можете подключиться к порту 9100 (telnet my.network.printer 9100 < pic.ps) (возможно, я не могу правильно напомнить номер порта, возможно, вам нужно понюхать или провести некоторое исследование) и написать файл.

Но если это всего лишь старый принтер, вам необходимо интерпретировать код постскриптума и отправлять растрированные страницы на принтер.

Если это комбинированный принтер PCL/PS, вам может потребоваться добавить заголовок PCL для входа в режим PS в зависимости от настроек принтера (если все настроено на «автоматическое обнаружение», не беспокойтесь об этой части) , Вы узнаете, как это сделать, если вы получите фрагменты кода постскриптума, возможно, с другим gobbeldegook вместо желаемого результата.

я стесняюсь сказать, что я на самом деле не знаю, как открыть USB-устройства в Windows C++, но если это помогает, как DOS, чтобы использовать lpt1: в качестве имени файла (как в copy pic.ps lpt1:), который будет использовать устройство.

Если это общий принтер, вам действительно нужно пройти через сетевую очередь печати, а не напрямую на принтер.

0

Это не так сложно. Вы можете использовать протокол LPD (Line Printer Daemon) для разговора с сервером. Протокол прост, вы можете прочитать спецификацию и написать ее самостоятельно.

Другой способ - вызвать команду lpr напрямую. Однако эта команда отключена в Windows 7 по умолчанию. Поиск «lpr command windows 7» расскажет вам, как включить его.