2017-05-22 20 views
0

다음 코드는 CutePDF 프린터로 (pBuf 버퍼에 저장) 포스트 스크립트 내용을 전송 설정되지 않은 경우에만 PDF 생성이 코드의 실행 중에PDF 프린터 출력 파일 이름이

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 파일이 생성됩니다. 여태까지는 그런대로 잘됐다. 결과 D:/out.pdf ISN은

di1.pOutputFile = L"D:/out.pdf"; 

이러한 코드 (예상대로)의 실행 중에 대화 상자를 표시하지 않습니다 :하지만, 문제는 내가 조각의 4 호선을 변경하여 단계를 지정하는 파일 이름을 피하기 위해 노력하고있을 때 시작 pdf 파일은 프린터로 전송 된 PostScript 파일의 사본입니다 (pBuf 버퍼의 내용 사본). PDF Writer는 같은 방식으로 작동합니다. PDF 프린터가 이런 식으로 작동하는 이유와 UI에서 이름을 지정하지 않고 PDF 파일을 생성하는 데 필요한 동작을 수행하는 방법은 무엇입니까?

답변

1

Windows 인쇄 시스템은 이런 방식으로 작동합니다. 왜냐하면, 무딘이기 때문에 그 동작 방식 때문입니다. 그 시점에서 파일 이름을 지정하면 인쇄 시스템이 출력을 해당 파일로 보냅니다. 파일 이름을 지정하지 않으면 정상 처리로 진행합니다.

일반적으로 포트에 프린터 드라이버 출력을 보내고 PDF 프린터의 경우 사용자 지정 포트 모니터가 출력 (이 경우 PostScript)을 선택하여 더 처리합니다. PDF 프린터의 경우 PostScript를 PostScript를 PDF로 변환하는 프로세스로 보내며 (거의 항상 Ghostscript를 사용합니다. Adobe에서 PDF로 인쇄하는 도구도 같은 방식으로 작동합니다).

PDF 프로세스의 출력을 변경하려는 경우 (즉, 다른 파일에 쓰는 경우) 포트 모니터가 작동하는 방식이 아닌 포트 모니터의 방식을 변경해야합니다. 코드가 현재 수행 중입니다. 파일 위치를 설정하면 프로세스를 단락시키고 포트 모니터를 호출하지 않으므로 '파일 저장'대화 상자가 나타나지 않고 출력이 PostScript 인 이유가됩니다.

사용중인 특정 PDF 프린터에 대해 문서화 된 출력 파일을 지정할 수있는 방법이있을 수 있습니다. 그렇지 않다면 오픈 소스 제품에 대해 (그리고 GS가 내장되어 있으면 GPL 라이센스를 받아야한다) 제품의 소스 코드 복사본을 요청하고 자신에게 맞게 변경할 수있다.

또는 Ghostscript 및 RedMon (오픈 소스 포트 모니터)을 가져 와서 동일한 작업을 수행하기위한 도구를 직접 만들 수 있습니다.