This code examples is built for PDFCreator, an open source PDF writer utility. Unlike Adobe Acrobat and CutePDF, which both require pro versions to create PDF's via code, PDFCreator is completely free! Download PDF Creator from Sourceforge here. Please note that this code will NOT work with Adobe Acrobat.
It should also be noted that this code example uses an Early Bind. If you are not familiar with the difference between Early and Late Binding, please read our article on Early vs Late binding.
This routine was tested successfully using PDFCreator 0.9.1, GPLGhostscript.exe download package, on Windows XP Pro (SP2), using Microsoft Access 2003.
NOTE: Before you "go it alone" with trying to adapt this routine, you may want to read this article, which shares some of the idiosyncrasies discovered in the development of the PDFCreator code samples.
This code goes in a standard module. You will need to set a reference to PDFCreator, and change the name of the report. You may also want to update the directory to save the file into (sPDFPath), as it will currently save the file into the database's directory.
Option Compare Database Option Explicit Sub PrintAccessReportToPDF_Early() 'Author : Ken Puls ( www.excelguru.ca) 'Macro Purpose: Print to PDF file using PDFCreator ' (Download from http://sourceforge.net/projects/pdfcreator/ ) ' Designed for early bind, set reference to PDFCreator Dim pdfjob As PDFCreator.clsPDFCreator Dim sPDFName As String Dim sPDFPath As String Dim sPrinterName As String Dim sReportName As String Dim lPrinters As Long Dim lPrinterCurrent As Long Dim lPrinterPDF As Long Dim prtDefault As Printer '/// Change the report and output file name here! /// sReportName = "Chart of Accounts" sPDFName = sReportName & ".pdf" sPDFPath = Application.CurrentProject.Path & "\" 'Resolve index number of printers to allow changing and preserving sPrinterName = Application.Printer.DeviceName On Error Resume Next For lPrinters = 0 To Application.Printers.Count Set Application.Printer = Application.Printers(lPrinters) Set prtDefault = Application.Printer Select Case prtDefault.DeviceName Case Is = sPrinterName lPrinterCurrent = lPrinters Case Is = "PDFCreator" lPrinterPDF = lPrinters Case Else 'do nothing End Select Next lPrinters On Error GoTo 0 'Change the default printer Set Application.Printer = Application.Printers(lPrinterPDF) Set prtDefault = Application.Printer 'Start PFF Creator Set pdfjob = New PDFCreator.clsPDFCreator With pdfjob If .cStart("/NoProcessingAtStartup") = False Then MsgBox "Can't initialize PDFCreator.", vbCritical + _ vbOKOnly, "PrtPDFCreator" Exit Sub End If .cOption("UseAutosave") = 1 .cOption("UseAutosaveDirectory") = 1 .cOption("AutosaveDirectory") = sPDFPath .cOption("AutosaveFilename") = sPDFName .cOption("AutosaveFormat") = 0 ' 0 = PDF .cClearCache End With 'Print the document to PDF DoCmd.OpenReport (sReportName) 'Wait until the print job has entered the print queue Do Until pdfjob.cCountOfPrintjobs = 1 DoEvents Loop pdfjob.cPrinterStop = False 'Wait until PDF creator is finished then release the objects Do Until pdfjob.cCountOfPrintjobs = 0 DoEvents Loop pdfjob.cClose 'Reset the (original) default printer and release PDF Creator Set Application.Printer = Application.Printers(lPrinterCurrent) Set pdfjob = Nothing End Sub