如何获取Microsoft Print to PDF生成的PDF文件路径及设置初始文件夹
关于Microsoft Print to PDF的路径获取与初始文件夹设置
针对你的两个问题,直接给出解决方案:
1. 能否获取用户选择/创建的PDF文件完整路径?
CPrintDialog本身无法直接获取这个路径——因为Microsoft Print to PDF的保存对话框是由打印机驱动弹出的,不属于MFC打印对话框的控制范围。有两种可行方案:
方案一:自定义文件选择对话框(推荐)
自己弹出文件保存对话框让用户选择路径,再将该路径指定给打印机,既可以拿到完整路径,还能控制初始文件夹。示例代码:
// 先弹出自定义保存对话框,设置初始文件夹 CFileDialog saveDlg(FALSE, _T(".pdf"), _T("output.pdf"), OFN_OVERWRITEPROMPT, _T("PDF Files (*.pdf)|*.pdf||"), this); saveDlg.m_ofn.lpstrInitialDir = _T("D:\\MyCustomFolder"); // 替换为你需要的初始文件夹路径 if (saveDlg.DoModal() != IDOK) return FALSE; CString strPdfPath = saveDlg.GetPathName(); // 直接获取完整PDF路径 // 将路径传给Microsoft Print to PDF打印机 CString strPrinterName = printDlg.GetDeviceName(); HANDLE hPrinter; if (!OpenPrinter(strPrinterName.GetBuffer(), &hPrinter, NULL)) { AfxMessageBox(_T("打开打印机失败")); return FALSE; } strPrinterName.ReleaseBuffer(); // 设置打印机的输出文件路径 SetPrinterData(hPrinter, _T("OutputFile"), REG_SZ, (BYTE*)strPdfPath.GetBuffer(), strPdfPath.GetLength() * sizeof(TCHAR)); strPdfPath.ReleaseBuffer(); ClosePrinter(hPrinter); // 后续正常执行打印流程 if (printDlg.DoModal() == IDCANCEL) return FALSE; // ... 你的打印绘制代码
这种方式下,打印机驱动不会再弹出默认的保存对话框,直接输出到你指定的路径。
方案二:监控打印作业(复杂且不稳定)
通过Windows打印队列API监听打印作业的完成事件,从作业属性中提取路径。但这种方法需要处理打印作业的生命周期,多作业场景下容易出错,不推荐使用。
2. 能否设置文件选择对话框的初始文件夹?
如果依赖驱动自带的保存对话框,无法直接设置初始文件夹。但使用上面方案一的自定义对话框,可以通过saveDlg.m_ofn.lpstrInitialDir直接指定初始文件夹,完全满足需求。
内容的提问来源于stack exchange,提问作者Jabberwocky
相关产品推荐
相关产品推荐

