Expert100+ | Hi Lisa What I have used successfully in the past is PDF995. I have vba code that allows you to print your report as PDF using PDF995 Add the following to a module, note u would need to tweak this to reflect the path where you have installed it - read the comments within the procedure called pdfwrite i.e. '***** IMPORTANT - SEE THIS ***** ' set the location of the PDF995.ini and the pdfsync files iniFileName = 'C:Program Filespdf995respdf995.ini' - 'Read INI settings
- Declare Function GetPrivateProfileString Lib 'kernel32' Alias _
- 'GetPrivateProfileStringA' (ByVal lpApplicationName As String, _
- ByVal lpKeyName As Any, ByVal lpDefault As String, _
- ByVal lpReturnedString As String, ByVal nSize As Long, _
- ByVal lpFileName As String) As Long
- 'Write settings
- Declare Function WritePrivateProfileString Lib 'kernel32' Alias _
- 'WritePrivateProfileStringA' (ByVal lpApplicationName As String, _
- ByVal lpKeyName As Any, ByVal lpString As Any, _
- ByVal lpFileName As String) As Long
- Declare Sub Sleep Lib 'kernel32' (ByVal dwMilliseconds As Long)
- Sub pdfwrite(reportname As String, destpath As String, Optional strcriteria As String)
- ' Runs an Access report to PDF995 to create a pdf file from the report.
- ' Input parameters are the name of the report within the current database,
- ' the path for the output file, and an optional criteria for the report
- ' Be sure to check that the 'Generating PDF CS' setting in pdfsync.ini is set to 0
- ' when pdf995 is idle. This codes uses that as a completion flag as it seems to be
- ' the most reliable indication that PDF995 is done writing the pdf file.
- ' Note: The application.printer object is not valid in Access 2000
- ' and earlier. In that case, set the printer in the report to pdf995
- ' and comment out the references herein to the application.printer
- Dim syncfile As String, maxwaittime As Long
- Dim iniFileName As String, tmpPrinter As Printer
- Dim outputfile As String, X As Long
- Dim tmpoutputfile As String, tmpAutoLaunch As String
- '***** IMPORTANT - SEE THIS *****
- ' set the location of the PDF995.ini and the pdfsync files
- iniFileName = 'C:Program Filespdf995respdf995.ini'
- syncfile = 'c:documents and settingsall usersapplication datapdf995pdfsync.ini'
- ' build the output file name from the path parameter and the report name
- If Mid(destpath, Len(destpath), 1) <> ' Then destpath = destpath & '
- outputfile = destpath & reportname & '.pdf'
- ' PDF995 operates asynchronously. We need to determine when it is done so we can
- ' continue. This is done by creating a file and having PDF995 delete it using the
- ' ProcessPDF parameter in its ini file which runs a command when it is complete.
- ' save current settings from the PDF995.ini file
- tmpoutputfile = ReadINIfile('PARAMETERS', 'Output File', iniFileName)
- tmpAutoLaunch = ReadINIfile('PARAMETERS', 'Autolaunch', iniFileName)
- ' remove previous pdf if it exists
- On Error Resume Next
- Kill outputfile
- On Error GoTo Cleanup
- ' setup new values in PDF995.ini
- X = WritePrivateProfileString('PARAMETERS', 'Output File', outputfile, iniFileName)
- X = WritePrivateProfileString('PARAMETERS', 'AutoLaunch', '0', iniFileName)
- ' change the default printer to PDF995
- ' if running on Access 2000 or earlier, comment out the next two lines
- Set tmpPrinter = Application.Printer
- Application.Printer = Application.Printers('PDF995')
- 'print the report
- DoCmd.OpenReport reportname, acViewNormal, , strcriteria
- ' cleanup delay to allow PDF995 to finish up. When flagfile is nolonger present, PDF995 is done.
- Sleep (10000)
- maxwaittime = 300000 'If pdf995 isn't done in 5 min, quit anyway
- Do While ReadINIfile('PARAMETERS', 'Generating PDF CS', syncfile) = '1' And maxwaittime > 0
- Sleep (10000)
- maxwaittime = maxwaittime - 10000
- Loop
- ' restore the original default printer and the PDF995.ini settings
- Cleanup:
- Sleep (10000)
- X = WritePrivateProfileString('PARAMETERS', 'Output File', tmpoutputfile, iniFileName)
- X = WritePrivateProfileString('PARAMETERS', 'AutoLaunch', tmpAutoLaunch, iniFileName)
- X = WritePrivateProfileString('PARAMETERS', 'Launch', ', iniFileName)
- On Error Resume Next
- ' if running on Access 2000 or earlier, comment out the next line
- Application.Printer = tmpPrinter
- End Sub
- Function ReadINIfile(sSection As String, sEntry As String, sFileName As String) As String
- Dim X As Long
- Dim sDefault As String
- Dim sRetBuf As String, iLenBuf As Integer
- Dim sValue As String
- 'Six arguments
- 'Explanation of arguments:
- 'sSection: ini file section (always between brackets)
- 'sEntry : word on left side of '=' sign
- 'sDefault$: value returned if function is unsuccessful
- 'sRetBuf$ : the value you're looking for will be copied to this buffer string
- 'iLenBuf% : Length in characters of the buffer string
- 'sFileName: Path to the ini file
- sDefault$ = '
- sRetBuf$ = String$(256, 0) '256 null characters
- iLenBuf% = Len(sRetBuf$)
- X = GetPrivateProfileString(sSection, sEntry, _
- sDefault$, sRetBuf$, iLenBuf%, sFileName)
- ReadINIfile = Left$(sRetBuf$, X)
- End Function
Now to call it, just call pdfwrite eg pass in report name and folder where u want it dumped to pdfwrite 'Report1', 'c:myreports' |
|