如何判断Microsoft打印到 PDF 打印机驱动程序何时完成
How to tell when Microsoft Print to PDF printer driver is finished?
我需要一种便宜的方式来让我的应用程序创建一个PDF文件。所以我直接使用Windows API的打印功能(CreateDC()
,StartDoc()
,StartPage()
,EndPage()
,EndDoc()
等(,并选择Microsoft打印到PDF打印机驱动程序。
此外,我发现如果我将DOCINFO
结构的lpszOutput
成员设置为文件名,驱动程序会将 PDF 文件写入命名文件,而不会提示用户输入名称。
目前为止,一切都好。但是我怎么知道PDF文件何时创建?有后台处理程序 API,但驱动程序不一定仅仅因为后台处理程序已完成而完成。或者我可以创建一个查找文件的循环,但当然它会在实际完成之前就存在。我还考虑过尝试在我的循环中锁定文件,如果文件尚不存在或仍在写入,则应该会失败。
但我不禁想知道是否有更直接的方法来知道 PDF 文件何时准备就绪。
如果您使用的是 GDI 打印 API (wingdi.h(,则此链接显示用于查询打印机上打印作业状态的示例代码。
我包含链接中的代码,但您可能也想阅读这篇文章。
#include <Windows.h>
#include <wingdi.h>
BOOL GetJobs(HANDLE hPrinter, /* Handle to the printer. */
JOB_INFO_2 **ppJobInfo, /* Pointer to be filled. */
int *pcJobs, /* Count of jobs filled. */
DWORD *pStatus) /* Print Queue status. */
{
DWORD cByteNeeded,
nReturned,
cByteUsed;
JOB_INFO_2 *pJobStorage = NULL;
PRINTER_INFO_2 *pPrinterInfo = NULL;
/* Get the buffer size needed. */
if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded)) {
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return FALSE;
}
pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
if (!(pPrinterInfo))
/* Failure to allocate memory. */
return FALSE;
/* Get the printer information. */
if (!GetPrinter(hPrinter,
2,
(LPSTR)pPrinterInfo,
cByteNeeded,
&cByteUsed)) {
/* Failure to access the printer. */
free(pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
/* Get job storage space. */
if (!EnumJobs(hPrinter,
0,
pPrinterInfo->cJobs,
2,
NULL,
0,
(LPDWORD)&cByteNeeded,
(LPDWORD)&nReturned)) {
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
free(pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
}
pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
if (!pJobStorage) {
/* Failure to allocate Job storage space. */
free(pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
ZeroMemory(pJobStorage, cByteNeeded);
/* Get the list of jobs. */
if (!EnumJobs(hPrinter,
0,
pPrinterInfo->cJobs,
2,
(LPBYTE)pJobStorage,
cByteNeeded,
(LPDWORD)&cByteUsed,
(LPDWORD)&nReturned)) {
free(pPrinterInfo);
free(pJobStorage);
pJobStorage = NULL;
pPrinterInfo = NULL;
return FALSE;
}
/*
* Return the information.
*/
*pcJobs = nReturned;
*pStatus = pPrinterInfo->Status;
*ppJobInfo = pJobStorage;
free(pPrinterInfo);
return TRUE;
}
BOOL IsPrinterError(HANDLE hPrinter) {
JOB_INFO_2 *pJobs;
int cJobs,
i;
DWORD dwPrinterStatus;
/*
* Get the state information for the Printer Queue and
* the jobs in the Printer Queue.
*/
if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
return FALSE;
/*
* If the Printer reports an error, believe it.
*/
if (dwPrinterStatus &
(PRINTER_STATUS_ERROR |
PRINTER_STATUS_PAPER_JAM |
PRINTER_STATUS_PAPER_OUT |
PRINTER_STATUS_PAPER_PROBLEM |
PRINTER_STATUS_OUTPUT_BIN_FULL |
PRINTER_STATUS_NOT_AVAILABLE |
PRINTER_STATUS_NO_TONER |
PRINTER_STATUS_OUT_OF_MEMORY |
PRINTER_STATUS_OFFLINE |
PRINTER_STATUS_DOOR_OPEN)) {
free(pJobs);
return TRUE;
}
/*
* Find the Job in the Queue that is printing.
*/
for (i = 0; i < cJobs; i++) {
if (pJobs[i].Status & JOB_STATUS_PRINTING) {
/*
* If the job is in an error state,
* report an error for the printer.
* Code could be inserted here to
* attempt an interpretation of the
* pStatus member as well.
*/
if (pJobs[i].Status &
(JOB_STATUS_ERROR |
JOB_STATUS_OFFLINE |
JOB_STATUS_PAPEROUT |
JOB_STATUS_BLOCKED_DEVQ)) {
free(pJobs);
return TRUE;
}
}
}
/*
* No error condition.
*/
free(pJobs);
return FALSE;
}
相关文章:
- 使用 cpprest (Casablanca) 返回 PDF 响应
- 如何使用打印到 PDF 打印机在 MFC 和 CView 中以编程方式打印而不提示输入文件名?
- GCC C++ STL 漂亮的打印机 - 手动调用并仅要求大小
- 用于从一个基派生的类的GDB漂亮的打印机
- 使用 C++/Qt(已知密码)打开加密的 PDF
- WDK 如何迁移到 v4 打印机驱动程序
- 如何获取字体数据以嵌入到 PDF 中?
- 无法为速推C++库生成 PDF 文档
- 将 QTableWidget 内容打印为 PDF
- 是否可以从从 QPrintPreviewDialog 调用的 QPrinter 对话框中删除"Write to PDF"?
- 是否有提供可调整 dpi、可选文本和 CSS 支持的 HTML 到 PDF 渲染器?
- 使用 c++ MuPDF 突出显示 PDF 中的一些单词
- 使用 C++文件 I/O 输出 pdf 文件
- 如何将OpenPrinter用于网络打印机?
- 如何将QWebEngineView渲染到打印机?
- 获取使用 Qt c++ 在 Linux 中通过 USB 连接的 ESC/POS 打印机的状态
- Qt 5.8 and Pdf.js error
- PDF 打印机仅在未设置输出文件名时生成 PDF
- 如何判断Microsoft打印到 PDF 打印机驱动程序何时完成
- 有没有用c++写的开源PDF打印机?