VCL Converter

Top  Previous  Next

The VCL Converter sample demonstrates how to convert an existing file by printing it to novaPDF Printer using the ShellExecute function. It also demonstrates how to set different options and manage profiles.

 

The same approach should be taken if you print using a "Print()" method from another object (like an internet browser or a report control). Just replace the ShellExecute call with the call of your Print method.

 

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 Printer 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 Printer before calling ShellExecute (using the SetDefaultPrinter method), register FileSaved message (or any other novaPDF Printer 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

  m_novaOptions : INovaPdfOptions;

 

2. Register novaPDF Printer messages

//register event messages

WM_NOVAPDF2_FILESAVED := RegisterWindowMessage(MSG_NOVAPDF2_FILESAVED);

WM_NOVAPDF2_PRINTERROR:= RegisterWindowMessage(MSG_NOVAPDF2_PRINTERROR);

 

// handle event messages

PUBLIC

  PROCEDURE WndProc(var Message: TMessage); override;

PROCEDURE TForm1.WndProc(var Message: TMessage);

BEGIN

  IF Message.Msg = WM_NOVAPDF2_FILESAVED then BEGIN

    // ...

  END ELSE IF Message.Msg = WM_NOVAPDF2_PRINTERROR then BEGIN

    // ...

  END ELSE BEGIN

    inherited WndProc(Message);

  END;

END;

 

3. Initialize INovaPdfOptions

PROCEDURE TForm1.FormCreate(Sender: TObject);

BEGIN

  // ...

 

  // initialize COM libraries

  hr := ActiveX.CoInitialize(NIL);

  IF FAILED(hr) then BEGIN

    MessageDlg('Failed to initialize COM' +#13+SysErrorMessage(hr) +#13+

               SysErrorMessage(GetLastError()), mtWarning, [mbOK], 0);

  END;

 

  //create an instance of INovaPdfOptions

  m_novaOptions := NIL;

  hr := ActiveX.CoCreateInstance(

          CLASS_NovaPdfOptions, //CLSID_CNovaPdfSource

          NIL,

          CLSCTX_INPROC_SERVER,

          IID_INovaPdfOptions,

          m_novaOptions);

  IF (FAILED(hr))    then BEGIN

    MessageDlg('Failed to create novaPDF COM object',

               mtWarning, [mbOK], 0);

    EXIT;

  END;

 

  //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 Initialize2() function

  //hr := m_novaOptions.Initialize2( PRINTER_NAME, '<registration name>', '<license key>');

  hr := m_novaOptions.Initialize2( PRINTER_NAME, '', '', '' );

  IF (FAILED(hr))    then BEGIN

    MessageDlg('Failed to initialize NovaPdfOptions',

               mtWarning, [mbOK], 0);

    EXIT;

  END;

 

  // add 2 profiles in registry

  CreateProfiles();

 

  // load profiles from registry

  LoadProfiles();

 

END;

 

4. Release INovaPDFOptions

PROCEDURE TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

BEGIN

    //...

    //delete profiles

    hr := m_novaOptions.DeleteProfile2( SMALL_SIZE_PROFILE, PROFILE_IS_PUBLIC );

    hr := m_novaOptions.DeleteProfile2( FULL_OPT_PROFILE, PROFILE_IS_PUBLIC );

 

    // destroy m_novaOptions object

    //  - no need for this as the Delphi takes care of it automatically

 

    // uninitialize COM libraries

    ActiveX.CoUninitialize();

   

    //...

END;

 

5. Set novaPDF Printer Options

PROCEDURE TForm1.CreateProfiles();

BEGIN

  // Add a profile called "Small size". if profile L"Small size" exists this will fail

  hr := m_novaOptions.AddProfile2(SMALL_SIZE_PROFILE, PROFILE_IS_PUBLIC);

 

  // Set some options to this profile

 

  // disable the "Save PDF file as" prompt

  hr := m_novaOptions.SetOptionLong2(NOVAPDF_SAVE_PROMPT,

                                     0,

                                     SMALL_SIZE_PROFILE, 

                                     PROFILE_IS_PUBLIC);

  // set generated Pdf files destination folder to the application path

  hr := m_novaOptions.SetOptionString2(

                        NOVAPDF_SAVE_FOLDER,

                        ExtractFilePath(Application.ExeName),

                        SMALL_SIZE_PROFILE,

                        PROFILE_IS_PUBLIC);

  // set output file name

  hr := m_novaOptions.SetOptionString2(NOVAPDF_SAVE_FILE,

                                       'PDF Converter small size.pdf',

                                       SMALL_SIZE_PROFILE,

                                       PROFILE_IS_PUBLIC);

 

  //Set other options and profiles

  //...

END;

 

6. Start a print job

PROCEDURE TForm1.btnStartPrintClick(Sender: TObject);

var

  hExec : HINST;

BEGIN

  //...

 

  hr := S_OK;

 

  // set the active profile to be used for printing

  hr := m_novaOptions.SetActiveProfile2(cbProfiles.TEXT, PROFILE_IS_PUBLIC);

 

  // register our window to receive messages from the printer

  hr := m_novaOptions.RegisterEventWindow(SELF.Handle);

 

  // set novaPDF as default printer, so it will be used by ShellExecute

  hr := m_novaOptions.SetDefaultPrinter();

 

  //license the file to be converted with Shellexecute

  hr := m_novaOptions.LicenseShellExecuteFile(efFileToConvert.TEXT);

 

  // print the document

  m_bPrintJobPending := TRUE;

                                                                  

  hExec := ShellAPI.ShellExecute(SELF.handle,

                                 'print',

                                 PChar(efFileToConvert.TEXT),

                                 PChar(''), PChar(''), SW_HIDE);

 

  IF (hExec <= 32) then BEGIN // failed to execute program

    m_bPrintJobPending := FALSE;

    hr := m_novaOptions.UnRegisterEventWindow();

    hr := m_novaOptions.RestoreDefaultPrinter();

  END;

 

END;

 

7. Restore default printer when printing finished

PROCEDURE TForm1.WndProc(var Message: TMessage);

BEGIN

  IF Message.Msg = WM_NOVAPDF2_FILESAVED then BEGIN

 

    // restore original default printer

    hr := m_novaOptions.UnRegisterEventWindow();

    hr := m_novaOptions.RestoreDefaultPrinter();

    m_bPrintJobPending := FALSE;

 

  END ELSE IF Message.Msg = WM_NOVAPDF2_PRINTERROR then BEGIN

 

    CASE (Message.WParam) OF

      ERROR_MSG_TEMP_FILE : BEGIN

        MessageDlg('Error saving temporary file on printer server',

                   mtWarning, [mbOK], 0);

      END;

      ERROR_MSG_LIC_INFO : BEGIN

        MessageDlg('Error reading license information',

                   mtWarning, [mbOK], 0);

      END;

      ERROR_MSG_SAVE_PDF : BEGIN

        MessageDlg('Error saving PDF file', mtWarning, [mbOK], 0);

      END;

      ERROR_MSG_JOB_CANCELED : BEGIN

        MessageDlg('Print job was canceled', mtWarning, [mbOK], 0);

      END;

    END;

    // restore original default printer

    hr := m_novaOptions.UnRegisterEventWindow();

    hr := m_novaOptions.RestoreDefaultPrinter();

    m_bPrintJobPending := FALSE;

   

  END ELSE BEGIN

 

    inherited WndProc(Message);

   

  END;

END;