Multiple printers sample is similar with the Temporary printer sample but it uses several threads.
Note
To be able to use the samples you must install novaPDF SDK as samples work only with it. Download it here: nova PDF SDK.
Source code
cpp
// HelloWorld.cpp
#include "stdafx.h"
//Include novaPDF headers
#include "..\..\..\include\novaOptions.h"
#include "..\..\..\include\novaEvents.h"
//NovaPdfOptions
#include "..\..\..\include\novapi.h"
#include "nova.h"
//name of novaPDF Printer Demo
#define PRINTER_NAME1 L"novaPDF 10 temporary printer1"
#define PRINTER_NAME2 L"novaPDF 10 temporary printer2"
#define PRINTER_NAME3 L"novaPDF 10 temporary printer3"
#define PORT_NAME1 L"novaPDF10temp1"
#define PORT_NAME2 L"novaPDF10temp2"
#define PORT_NAME3 L"novaPDF10temp3"
#define FILE_NAME1 L"first.pdf"
#define FILE_NAME2 L"second.pdf"
#define FILE_NAME3 L"third.pdf"
//text to be written in the PDF file
#define PDF_TEXT L"Hello world!"
//PDF file name
#define PDF_FILE_NAME L"HelloWorld.pdf"
//Print profile name
#define PROFILE_NAME L"HelloWorld Profile"
#define PROFILE_IS_PUBLIC 0
typedef struct _PRT_THREAD_PARAM {
WCHAR wsPrinterName[255];
WCHAR wsPortName[255];
WCHAR wsFileName[255];
} PRT_THREAD_PARAM;
DWORD WINAPI PrtThreadProc(LPVOID lpParameter);
HANDLE CreatePrtThread(LPWSTR p_strPrinterName, LPWSTR p_wsPortName, LPWSTR p_wsFileName);
//entry point for the console application
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread1 = CreatePrtThread(PRINTER_NAME1, PORT_NAME1, FILE_NAME1);
HANDLE hThread2 = CreatePrtThread(PRINTER_NAME2, PORT_NAME2, FILE_NAME2);
HANDLE hThread3 = CreatePrtThread(PRINTER_NAME3, PORT_NAME3, FILE_NAME3);
if (hThread1 > 0){
//wait to stop processing events
WaitForSingleObject(hThread1, INFINITE);
CloseHandle(hThread1);
}
if (hThread2 > 0){
//wait to stop processing events
WaitForSingleObject(hThread2, INFINITE);
CloseHandle(hThread2);
}
if (hThread3 > 0){
//wait to stop processing events
WaitForSingleObject(hThread3, INFINITE);
CloseHandle(hThread3);
}
return 0;
}
HANDLE CreatePrtThread(LPWSTR p_strPrinterName, LPWSTR p_wsPortName, LPWSTR p_wsFileName)
{
PRT_THREAD_PARAM* pParams;
DWORD dwThreadId;
// Transmit parameters for thread: pipe handle and PDF temp file name
pParams = (PRT_THREAD_PARAM*)GlobalAlloc(LPTR, sizeof(PRT_THREAD_PARAM));
wcscpy_s(pParams->wsPrinterName, p_strPrinterName);
wcscpy_s(pParams->wsPortName, p_wsPortName);
wcscpy_s(pParams->wsFileName, p_wsFileName);
// Create the thread
HANDLE hThread =CreateThread(
NULL, // no security attribute
0, // default stack size
(LPTHREAD_START_ROUTINE) PrtThreadProc,
(LPVOID) pParams, // thread parameter
0, // not suspended
&dwThreadId); // returns thread ID
return hThread;
}
DWORD WINAPI PrtThreadProc(LPVOID lpParameter)
{
HRESULT hr = S_OK;
//initialize COM
hr = CoInitialize(NULL);
if (FAILED (hr))
{
MessageBox(NULL, L"Failed to initialize COM", L"novaPDF", MB_OK);
return hr;
}
// Read thread's parameter: a handle to a pipe instance and the name of the temporary PDF file
PRT_THREAD_PARAM* pParams = ((PRT_THREAD_PARAM*)lpParameter);
INovaPdfOptions10 *pNova = 0;
hr = CoCreateInstance(__uuidof(NovaPdfOptions10), NULL, CLSCTX_INPROC_SERVER, __uuidof(INovaPdfOptions10), (LPVOID*) &pNova);
if (FAILED(hr))
{
MessageBox(NULL, L"Failed to create novaPDF COM object", L"novaPDF", MB_OK);
return hr;
}
//if you have an application license for novaPDF SDK, call the RegisterLicenseKey() function
//hr = pNova->RegisterLicenseKey(<register name>, <license key>, <application name>);
if (SUCCEEDED(hr))
{
//add temporary printer
//8501 is default service port, check next registry key:
//HKEY_LOCAL_MACHINE\SOFTWARE\Softland\novaPDF 10\ServicePort
//nPdfSdk10_Softland is the default OEMID for novaPDF SDK change it with your license OEMID
pNova->AddNovaPrinter(pParams->wsPrinterName, pParams->wsPortName, L"nPdfSdk10_Softland", L"8503", L"");
// set optional PDF settings
LPWSTR pwsNewProfileID = NULL;
//create a new profile with default settings
hr = pNova->AddProfile(PROFILE_NAME, PROFILE_IS_PUBLIC, &pwsNewProfileID);
//load the newly created profile
if (SUCCEEDED(hr) && pwsNewProfileID)
{
hr = pNova->LoadProfile(pwsNewProfileID);
}
else
{
pNova->Release();
return hr;
}
if (SUCCEEDED(hr) && pwsNewProfileID)
{
// set novaPDF options
// set resulting file name
pNova->SetOptionLong(NOVAPDF_SAVE_FOLDER_TYPE, SAVEFOLDER_CUSTOM);
pNova->SetOptionLong(NOVAPDF_SAVE_LOCATION, LOCATION_TYPE_LOCAL);
pNova->SetOptionLong(NOVAPDF_SAVE_FOLDER_TYPE, SAVEFOLDER_CUSTOM);
pNova->SetOptionString(NOVAPDF_SAVE_FOLDER, L"C:\\temp\\novaPDF");
pNova->SetOptionString(NOVAPDF_SAVE_FILE_NAME, pParams->wsFileName);
//do not show prompt dialog
pNova->SetOptionLong(NOVAPDF_SAVE_PROMPT_TYPE, PROMPT_SAVE_NONE);
//if file exists, override
pNova->SetOptionLong(NOVAPDF_SAVE_FILEEXIST_ACTION, FILE_CONFLICT_STRATEGY_AUTONUMBER_NEW);
//do not open
pNova->DisableActionType(NOVA_ACTION_OPEN);
//save profile changes
hr = pNova->SaveProfile();
//set as active profile for printer
pNova->SetActiveProfile(pwsNewProfileID);
HANDLE hPrinter;
BOOL bTimeout;
PDEVMODEW pDevmode = NULL;
PRINTER_DEFAULTS pd = { NULL, NULL, PRINTER_ACCESS_USE };
for (int i = 1; i <= 10; i++)
{
//start print job
if (OpenPrinter(pParams->wsPrinterName, &hPrinter, &pd))
{
//register to wait for a nova event - wait until PDf is finished
pNova->RegisterNovaEvent(L"NOVAPDF_EVENT_START_DOC");
//get default printer DEVMODE
int nSize = DocumentProperties(NULL, hPrinter, pParams->wsPrinterName, NULL, NULL, 0);
pDevmode = (PDEVMODEW)LocalAlloc(LPTR, nSize);
DocumentProperties(NULL, hPrinter, pParams->wsPrinterName, pDevmode, NULL, DM_OUT_BUFFER);
//set page size in DEVMODE
pDevmode->dmPaperSize = DMPAPER_USER;
pDevmode->dmPaperLength = 2970;//5940;
pDevmode->dmPaperWidth = 2100;//4200;
pDevmode->dmFields = DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH;
DocumentProperties(NULL, hPrinter, pParams->wsPrinterName, pDevmode, pDevmode, DM_IN_BUFFER | DM_OUT_BUFFER);
//Print a page
HDC hDC = CreateDC(L"", pParams->wsPrinterName, NULL, pDevmode);
DOCINFO docInfo = {sizeof(DOCINFO)};
// PDF document name and path
docInfo.lpszDocName = PDF_FILE_NAME;
StartDoc(hDC,&docInfo);
StartPage(hDC);
// Draw text on page
TextOut(hDC, 100, 80, PDF_TEXT, (int) wcslen(PDF_TEXT));
EndPage(hDC);
EndDoc(hDC);
DeleteDC(hDC);
LocalFree(pDevmode);
ClosePrinter(hPrinter);
pNova->WaitForNovaEvent(-1, &bTimeout);
}
}
//delete profile
pNova->DeleteProfile(pwsNewProfileID);
CoTaskMemFree(pwsNewProfileID);
}
//delete temporarry printer
pNova->DeleteNovaPrinter(pParams->wsPrinterName);
//release NovaPdfOptions
pNova->Release();
}
return 0;
}