2015-11-30 156 views
3

在我的應用程序(MFC, C++)中,我有一個按鈕,用於在路徑中創建PDF文件。 現在我想創建另一個按鈕,將打印PDF從路徑開始,並選擇像方向和副本數量一些選項...但我不能這樣做...使用MFC打印PDF文件

我看到CPrintDialog顯示打印機的默認對話框,但我無法使用路徑附加PDF文件。

我也看到了

ShellExecute(NULL, L"print", L"C:\\Documents\\1.pdf", NULL, NULL, SW_SHOWNORMAL); 

的作品,但這種方式我不能選擇的任何參數...

我如何使用CPrintDialog打印現有的PDF是在路徑?

回答

-2

我已經解決了一個解決辦法。我不使用ShellExecute,而是使用連接到CPrintDialog類的hDC的CDC對象來繪製所有我想要打印的內容。 Rember根據打印機DPI(如here)管理繪圖的大小。

一個只有片斷有一個想法:

CPrintDialog printDialog(FALSE); 

    printDialog.GetDefaults(); 

    printDialog.m_pd.Flags &= ~PD_RETURNDEFAULT; 

    DEVMODE* pDevMode = printDialog.GetDevMode(); 
    pDevMode->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_PRINTQUALITY ; 
    pDevMode->dmOrientation = DMORIENT_LANDSCAPE; 
    pDevMode->dmPaperSize = DMPAPER_A4; 
    ::GlobalUnlock(printDialog.m_pd.hDevMode); 

    if (printDialog.DoModal() == IDOK) 
    { 
     CDC* pDC = new CDC; 
     pDC->Attach(printDialog.m_pd.hDC); 
     pDCPDF->StartDoc(_T("")); 
     pDCPDF->StartPage(); 
     // ... 
     //draw what you want 
     // ... 
     pDCPDF->EndPage(); 
     pDCPDF->EndDoc(); //this starts the printer   
     pDCPDF->DeleteDC(); 
    } 

希望能達到15很快的聲譽投票的其他問題的答案。 感謝Andrew Komiagin的回答。

+0

您問過有關打印PDF,但這與PDF –

+0

沒有任何關係我的目標是打印PDF,與第一個片段「1.pdf」相同,但我獲得了相同的結果換個方式可能會更好。 – GiordiX

1

你必須使用ShellExecuteEx和動詞printto在印刷,以獲得更多的控制:

 SHELLEXECUTEINFO ShellInfo; 
     ZeroMemory(&ShellInfo, sizeof(SHELLEXECUTEINFO)); 
     ShellInfo.cbSize = sizeof(SHELLEXECUTEINFO); 
     ShellInfo.lpVerb = L"printto"; 
     ShellInfo.lpFile = L"C:\\Documents\\1.pdf"; 
     ShellInfo.lpParameters = szPrinter; 
     ShellInfo.nShow = SW_SHOWNORMAL; 
     ShellInfo.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_NOCLOSEPROCESS; 
     if(::ShellExecuteEx(&ShellInfo)) 
     { 
     if((int)ShellInfo.hInstApp > 32) 
     { 
      if(ShellInfo.hProcess != NULL) 
      { 
       DWORD dwExitCode = STILL_ACTIVE; 
       while(dwExitCode == STILL_ACTIVE) 
       { 
        if(!::GetExitCodeProcess(ShellInfo.hProcess, &dwExitCode)) 
        { 
        dwExitCode = 0; 
        } 
       } 
       ::CloseHandle(ShellInfo.hProcess); 
      } 
     } 
     } 

要獲得打印機名稱:

CPrintDialog dlg(TRUE); 
if (dlg.DoModal() == IDOK) 
{ 
    CString sPrinterName = dlg.GetDeviceName(); 
} 
+0

對不起,但我不清楚..什麼是'szPrinter'?如果我使用行 'ShellExecute(NULL,L「printto」,L「C:\\ Documents \\ 1.pdf」,NULL,NULL,SW_SHOWNORMAL);'沒有任何更改... – GiordiX

+0

'szPrinter'是你的目標打印機名稱 –

+0

我如何取這個名字?用戶如何通過CPrintDialog選擇打印機選項? – GiordiX