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.
The
MFC Converter sample demonstrates how to convert an existing file by printing it to novaPDF using the
ShellExecute function. It also demonstrates how to set different options and manage profiles.
When the application starts, it creates a few profiles and makes different settings in the profiles. Then it shows a dialog from where the user can select the active profile and change its settings using the controls from the dialog.
After that a document can be selected from the harddisk and printed to novaPDF using the
ShellExecute function call.
When using this technique to convert a file to PDF, you have to take care of the fact that
ShellExecute prints to the default printer. This function returns immediately and does not wait until the print is finished (it may return before the printing is actually started). Therefore you have to set the default printer to novaPDF before calling
ShellExecute (using the
SetDefaultPrinter method), register
StartDoc (or any other Windows message) to be sure that the print job was started. In this message handler restore the default printer (with the
RestoreDefaultPrinter method). This way you made sure that the default printer was restored and your document is printed to novaPDF Printer.
Source Code Snippets
1. Declare INovaPdfOptions variable
//declare an INovaPdfOptions member variable
private :
INovaPdfOptions *m_novaOptions;
2. Register novaPDF Printer messages
const UINT wm_Nova_FileSaved = RegisterWindowMessageW( MSG_NOVAPDF2_FILESAVED );
const UINT wm_Nova_PrintError = RegisterWindowMessageW( MSG_NOVAPDF2_PRINTERROR );
BEGIN_MESSAGE_MAP(CnovaPrintDlg, CDialog)
//...
ON_REGISTERED_MESSAGE(wm_Nova_FileSaved, OnNovaPDFFileSaved)
ON_REGISTERED_MESSAGE(wm_Nova_PrintError, OnNovaPDFPrintError)
//...
END_MESSAGE_MAP()
3. Initialize INovaPdfOptions
BOOL CnovaPrintDlg::OnInitDialog()
{
//...
HRESULT hr = S_OK;
m_novaOptions = 0;
//create an instance of INovaPdfOptions
hr = CoCreateInstance(__uuidof(NovaPdfOptions), NULL, CLSCTX_INPROC_SERVER, __uuidof(INovaPdfOptions), (LPVOID*) &m_novaOptions);
if (SUCCEEDED(hr)) {
//initialize NovaPdfOptions and pass printer name
// if you have an application license for novaPDF SDK,
// pass both the registration name and the license key to the Initialize() function
// hr = m_novaOptions->Initialize(PRINTER_NAME, L"<registration name>", L"<license key>");
hr = m_novaOptions->Initialize(PRINTER_NAME, L"", L"", L"");
}
else {
::MessageBoxW(NULL, L"Failed to create novaPDF COM object", L"novaPDF", MB_OK);
}
//...
}
4. Release INovaPDFOptions
CnovaPrintDlg::~CnovaPrintDlg()
{
//...
//delete profiles
m_novaOptions->DeleteProfile(SMALL_SIZE_PROFILE, PROFILE_IS_PUBLIC);
// destroy our nova options object
if (m_novaOptions) {
m_novaOptions->Release();
}
// uninitialize COM libraries
CoUninitialize();
//...
}
5. Set novaPDF Printer Options
BOOL CnovaPrintDlg::OnInitDialog()
{
//...
//initialize m_novaOptions (see above)
//...
// Add a profile called "Small size". If profile L"Small size" exists this will fail
hr = m_novaOptions->AddProfile(SMALL_SIZE_PROFILE, PROFILE_IS_PUBLIC);
// Set some options to this profile
// disable the "Save PDF file as" prompt
hr = m_novaOptions->SetOptionLong(NOVAPDF_SAVE_PROMPT, FALSE, SMALL_SIZE_PROFILE, PROFILE_IS_PUBLIC);
// set generated Pdf files destination folder ("c:\")
hr = m_novaOptions->SetOptionString(NOVAPDF_SAVE_FOLDER, L"", SMALL_SIZE_PROFILE, PROFILE_IS_PUBLIC);
// set output file name
hr = m_novaOptions->SetOptionString(NOVAPDF_SAVE_FILE, L"PDF Converter small size.pdf", SMALL_SIZE_PROFILE, PROFILE_IS_PUBLIC);
//Set other options
//...
}
6. Start a print job
void CnovaPrintDlg::OnBnClickedOk()
{
//...
HRESULT hr = S_OK;
// set the active profile to be used for printing
hr = m_novaOptions->SetActiveProfile(m_strProfile, PROFILE_IS_PUBLIC);
// register our window to receive messages from the printer
hr = m_novaOptions->RegisterEventWindow((LONG) GetSafeHwnd());
// set novaPDF as default printer, so it will be used by ShellExecute
hr = m_novaOptions->SetDefaultPrinter();
// license file for ShellExecute
hr = m_novaOptions- >LicenseShellExecuteFile(m_strFileToConvert.AllocSysString());
// print the document
m_bPrintJobPending = TRUE;
HINSTANCE hExec = ShellExecute(GetSafeHwnd(), L"print", m_strFileToConvert, NULL, NULL, SW_HIDE);
//...
}
7. Restore default printer when printing finished
LRESULT CnovaPrintDlg::OnNovaPDFFileSaved(WPARAM wParam, LPARAM lParam)
{
// restore original default printer
m_novaOptions->UnRegisterEventWindow();
m_novaOptions->RestoreDefaultPrinter();
m_bPrintJobPending = FALSE;
return 0;
}
LRESULT CnovaPrintDlg::OnNovaPDFPrintError(WPARAM wParam, LPARAM lParam)
{
switch(wParam){
case ERROR_MSG_TEMP_FILE:
MessageBox(L"Error saving temporary file on printer server", L"novaPDF", MB_OK);
break;
case ERROR_MSG_LIC_INFO:
MessageBox(L"Error reading license information", L"novaPDF", MB_OK);
break;
case ERROR_MSG_SAVE_PDF:
MessageBox(L"Error saving PDF file", L"novaPDF", MB_OK);
break;
case ERROR_MSG_JOB_CANCELED:
MessageBox(L"Print job was canceled", L"novaPDF", MB_OK);
break;
}
// restore original default printer
m_novaOptions->UnRegisterEventWindow();
m_novaOptions->RestoreDefaultPrinter();
m_bPrintJobPending = FALSE;
return 0;
}