Следующий фрагмент кода отправляет содержимое PostScript (сохранено в pBuf
буфер) на принтер CutePDF:
if (OpenPrinter(printerName, &hPrinter, NULL))
{
DOC_INFO_1 di1;
di1.pDatatype = L"RAW";
di1.pDocName = L"Raw print document";
di1.pOutputFile = NULL;
StartDocPrinter(hPrinter, 1, (LPBYTE)&di1);
StartPagePrinter(hPrinter);
DWORD dwWritten = 0;
WritePrinter(hPrinter, pBuf, dwBufSize, &dwWritten);
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
}
Во время выполнения этого кода появляется диалоговое окно, в котором я указываю имя выходного файла (например, D:/out.pdf
), после этого генерируется файл PDF. Все идет нормально. Проблемы начинаются, когда я пытаюсь избежать шага указания имени файла, изменяя строку 4 фрагмента:
di1.pOutputFile = L"D:/out.pdf";
Такой код не показывает диалог во время его выполнения (как ожидалось), но результат D:/out.pdf
это не файл PDF, это копия файла PostScript, отправленная на принтер (копия содержимого pBuf
буфер). PDF Writer ведет себя так же. Почему принтеры PDF ведут себя таким образом и как я могу добиться необходимого поведения (генерировать файл PDF без указания его имени в пользовательском интерфейсе)?
Система печати Windows ведет себя так, потому что, прямо скажем, именно так она и должна себя вести. Если вы укажете имя файла в этой точке, то система печати отправит вывод в этот файл. Если вы не укажете имя файла, оно перейдет к нормальной обработке.
Обычно вы отправляете выходные данные драйвера принтера в порт, а в случае принтеров PDF монитор нестандартного порта получает выходные данные (в данном случае PostScript) и обрабатывает их дальше. Для принтеров PDF они отправляют PostScript в процесс, который преобразует PostScript в PDF (почти всегда с использованием Ghostscript, хотя инструменты Adobe для печати в PDF работают одинаково).
Если вы хотите изменить вывод процесса PDF (т.е. записать его в другой файл), то вам нужно изменить способ портовый монитор работает, а не так, как работает подсистема печати, что в настоящее время делает ваш код. Устанавливая имя файла там, где вы находитесь, вы просто замыкаете процесс, никогда не вызывая монитор порта, поэтому диалоговое окно «сохранить файл» не появляется и почему вывод PostScript.
Может быть способ указать выходной файл, документированный для конкретного используемого вами принтера PDF. Если нет, то для продуктов с открытым исходным кодом (и если GS встроен, они должны иметь лицензию GPL), вы можете запросить копию исходного кода для продукта и изменить его для себя.
Кроме того, вы можете взять копию Ghostscript и RedMon (Port Monitor с открытым исходным кодом) и создать свой собственный инструмент для выполнения той же работы.
Других решений пока нет …