使用MFC打印PDF文件

时间:2015-11-30 12:03:07

标签: c++ pdf printing mfc

在我的应用(MFC, C++)中,我有一个按钮,可在路径中创建PDF文件。 现在我想创建另一个按钮,从路径开始打印pdf并选择一些选项,如方向和副本数量......但我无法做到这一点......

我看到CPrintDialog显示了打印机的默认对话框,但我无法使用路径附加PDF文件。

我也看到了

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

有效,但这样我就无法选择任何参数......

如何使用CPrintDialog打印路径中的现有PDF?

2 个答案:

答案 0 :(得分:2)

您必须使用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();
}

答案 1 :(得分:-3)

我解决了一个解决方法。我没有使用ShellExecute,而是使用附加到CDC类的hDC的CPrintDialog对象来绘制我要打印的所有内容。 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的回答。