安装一个 PDF 虚拟打印机(比如 PDF Factory 等),你系统的打印机中就多了一个打印机。 报表打印时选择这个打印机、或者出报表前直接将该打印机设为默认,打印。 然后虚拟打印机会出一个对话框让你选择一个 .pdf 文件的保存路径;或者有的虚拟打印机有自动命名规则,那么到自动保存目录下找最新的 .pdf 文件。最后一步是有虚拟打印机完成,所以适用与任何支持打印的软件/报表。
谢谢各位的回复,我找到了一个以前的帖子,是类似的问题,我把代码贴出来,给大家分享!================================================================================ 注意:这个需要安装Adobe PDF 虚拟打印机(装完后应该在你的打印机列表中出现一个名称为Adobe PDF的打印机 Option Explicit '---------------------------------------------------------------------------------------- ' Const HWND_BROADCAST = &HFFFF& Const WM_WININICHANGE = &H1A Private Declare Function GetProfileString Lib "kernel32 " Alias "GetProfileStringA " (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long Private Declare Function WriteProfileString Lib "kernel32 " Alias "WriteProfileStringA " (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long '--------------------------------------------------------------------------------------- Private Sub cmdExportToPdf_Click() Dim i As Long Dim gFlag As Boolean Dim strDefaultPrinterName As String Dim PrinterName As String strDefaultPrinterName = Printer.DeviceName '判断有没有安装打印机 If strDefaultPrinterName = " " Then MsgBox "没有安装打印机! " vbExclamation + vbOKOnly, Me.Caption Exit Sub End If '----------------------------------------------------------------------- '判断所有打印机列表中有没有Adobe PDF 打印机 gFlag = False For i = 0 To Printers.count - 1 If Printers(i).DeviceName = "Adobe PDF " Then gFlag = True Exit For End If Next i If gFlag = False Then MsgBox "没有安装 Adobe PDF 打印机!! ", vbExclamation + vbOKOnly, Me.Caption Exit Sub End If '----------------------------------------------------------------------- '*********************************************************************** '把默认打印机设置为Adobe PDF PrinterName = "Adobe PDF " Dim S As String, length As Long, hKey As Long S = String(80, Chr(0)) length = GetProfileString( "devices ", PrinterName, " ", S, Len(S)) S = Left(S, length) Call WriteProfileString( "windows ", "device ", PrinterName & ", " & S) Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, &H7FFF&, ByVal "windows ") CsRpt.ReportFileName= "你的水晶报表的路径 " PrintPreview.ReportFileName CsRpt.PrintReport
楼主可以把相同的一份数据考虑写到Word里面,调用Word的另存功能
crxRpt.ExportOptions.FormatType = crEFTPortableDocFormat
crxRpt.ExportOptions.DestinationType = crEDTDiskFile
crxRpt.EnableParameterPrompting = False
crxRpt.PaperSize = crPaperA4
crxRpt.Export False
1,安装PDF打印机,后台生成报表时另存为*.PDF
2,生成PDF程序,要另写一个服务放在报务器实时运行.
报表打印时选择这个打印机、或者出报表前直接将该打印机设为默认,打印。
然后虚拟打印机会出一个对话框让你选择一个 .pdf 文件的保存路径;或者有的虚拟打印机有自动命名规则,那么到自动保存目录下找最新的 .pdf 文件。最后一步是有虚拟打印机完成,所以适用与任何支持打印的软件/报表。
注意:这个需要安装Adobe PDF 虚拟打印机(装完后应该在你的打印机列表中出现一个名称为Adobe PDF的打印机 Option Explicit '----------------------------------------------------------------------------------------
'
Const HWND_BROADCAST = &HFFFF&
Const WM_WININICHANGE = &H1A
Private Declare Function GetProfileString Lib "kernel32 " Alias "GetProfileStringA " (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Private Declare Function WriteProfileString Lib "kernel32 " Alias "WriteProfileStringA " (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'---------------------------------------------------------------------------------------
Private Sub cmdExportToPdf_Click()
Dim i As Long
Dim gFlag As Boolean
Dim strDefaultPrinterName As String
Dim PrinterName As String
strDefaultPrinterName = Printer.DeviceName
'判断有没有安装打印机
If strDefaultPrinterName = " " Then
MsgBox "没有安装打印机! " vbExclamation + vbOKOnly, Me.Caption
Exit Sub
End If '-----------------------------------------------------------------------
'判断所有打印机列表中有没有Adobe PDF 打印机
gFlag = False
For i = 0 To Printers.count - 1
If Printers(i).DeviceName = "Adobe PDF " Then
gFlag = True
Exit For
End If
Next i If gFlag = False Then
MsgBox "没有安装 Adobe PDF 打印机!! ", vbExclamation + vbOKOnly, Me.Caption
Exit Sub
End If '----------------------------------------------------------------------- '***********************************************************************
'把默认打印机设置为Adobe PDF
PrinterName = "Adobe PDF "
Dim S As String, length As Long, hKey As Long
S = String(80, Chr(0))
length = GetProfileString( "devices ", PrinterName, " ", S, Len(S))
S = Left(S, length)
Call WriteProfileString( "windows ", "device ", PrinterName & ", " & S)
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, &H7FFF&, ByVal "windows ")
CsRpt.ReportFileName= "你的水晶报表的路径 " PrintPreview.ReportFileName CsRpt.PrintReport
'******************************************************************************
'打印结束后再把默认打印机设置为最初的那个打印机
PrinterName = strDefaultPrinterName
S = String(80, Chr(0))
length = GetProfileString( "devices ", PrinterName, " ", S, Len(S))
S = Left(S, length)
Call WriteProfileString( "windows ", "device ", PrinterName & ", " & S)
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, &H7FFF&, ByVal "windows ") '******************************************************************************
End Sub