MS Access:自定义纸张大小

7
我正在构建一个MS Access(2010)应用程序,将从该应用程序打印条形码标签。还会打印各种其他报告和表单,使用标准打印机设置,但对于需要条形码的情况,我需要将其打印到特定的打印机,并设置为使用特殊页面大小。
在搜索中,我找到了打印机对象属性“Papersize”,它本身有许多“标准”默认选项,包括acPRPSLetter表示标准US Letter尺寸为8.5“x 11”,acPRPSA4表示A4纸张大小。没有任何预设尺寸适合我的用途。有一个预设尺寸代表用户自定义尺寸,即acPRPSUser,但我没有找到任何以编程方式设置自定义尺寸的方法。
我确实阅读了关于打印机的“.height”和“.width”属性的内容,但似乎它们不存在于用于Access 2010的VB中(我认为它基于VB6)。
有人可以帮助我在Access 2010中使用VB代码设置自定义纸张大小吗?

这个http://msdn.microsoft.com/en-us/library/ff836635.aspx怎么样? - Fionnuala
我看到了,并打算在我的帖子中包含它。谢谢你找到它。这显示了使用“.papersize”属性,在示例中它使用了如上所述的acPRPSLetter。那就是我所说的,缺乏更好术语的预设。我需要使用自定义大小。 - CertifiedKennedy
列表中的最后一个是 acPRPSUser(http://msdn.microsoft.com/en-us/library/ff845524.aspx)。 - Fionnuala
正如我在上面的问题中所指出的那样。我要找的是如何准确地设置自定义“用户”大小的纸张,由acPRPSUser表示。 - CertifiedKennedy
3个回答

2
我遇到了同样的问题。我使用如何以编程方式检索打印机功能解决了这个问题。
我创建了一个带有Printout过程的模块。使用Printerselection函数,我可以调用使用打印机名称特定部分的打印机。使用PaperSelection函数,我可以指定使用纸张名称特定部分的纸张。
首先,我需要使用DeviceCapabilities函数API调用声明。
    ' Declaration for the DeviceCapabilities function API call.
Private Declare Function DeviceCapabilities Lib "winspool.drv" _
    Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _
    ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _
    ByVal lpDevMode As Long) As Long

' DeviceCapabilities function constants.
Private Const DC_PAPERNAMES = 16
Private Const DC_PAPERS = 2
Private Const DC_BINNAMES = 12
Private Const DC_BINS = 6
Private Const DEFAULT_VALUES = 0

Private Type str_DEVMODE
    RGB As String * 94
End Type

Private Type type_DEVMODE
    strDeviceName As String * 32
    intSpecVersion As Integer
    intDriverVersion As Integer
    intSize As Integer
    intDriverExtra As Integer
    lngFields As Long
    intOrientation As Integer
    intPaperSize As Integer
    intPaperLength As Integer
    intPaperWidth As Integer
    intScale As Integer
    intCopies As Integer
    intDefaultSource As Integer
    intPrintQuality As Integer
    intColor As Integer
    intDuplex As Integer
    intResolution As Integer
    intTTOption As Integer
    intCollate As Integer
    strFormName As String * 32
    lngPad As Long
    lngBits As Long
    lngPW As Long
    lngPH As Long
    lngDFI As Long
    lngDFr As Long
End Type

Private Cnt As Integer, PrinterSelect As Integer

Public Sub PrintOut(ByVal rptName As String, Printer As String, Paper As String, BinName As String, Optional Landscape As Boolean, Optional WhereCond)
Dim rpt As Report
DoCmd.OpenReport rptName, acViewPreview, , WhereCond
Set rpt = Reports(rptName)
PrinterSelect = PrinterSelection(Printer)
rpt.Printer = Application.Printers(PrinterSelect)
rpt.Printer.PaperSize = PaperSelection(Paper, PrinterSelect)
If Landscape Then
    rpt.Printer.Orientation = acPRORLandscape
Else
    rpt.Printer.Orientation = acPRORPortrait
End If
rpt.Printer.PaperBin = BinSelection(BinName, PrinterSelect)
End Sub

Public Function PrinterSelection(Printer As String) As Integer
For Cnt = 0 To Application.Printers.Count - 1
    If InStr(1, Application.Printers(Cnt).DeviceName, Printer) > 0 Then
        PrinterSelection = Cnt
    End If
Next Cnt
End Function

Public Function PaperSelection(Paper As String, Printer As Integer) As Integer

    Dim lngPaperCount As Long
    Dim lngCounter As Long
    Dim hPrinter As Long
    Dim strDeviceName As String
    Dim strDevicePort As String
    Dim strPaperNamesList As String
    Dim strPaperName As String
    Dim intLength As Integer
    Dim strMsg As String
    Dim aintNumPaper() As Integer

    On Error GoTo GetPaperList_Err

    ' Get the name and port of the selected printer.
    strDeviceName = Application.Printers(Printer).DeviceName
    strDevicePort = Application.Printers(Printer).Port

    ' Get the count of paper names supported by the printer.
    lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _
        lpPort:=strDevicePort, _
        iIndex:=DC_PAPERNAMES, _
        lpOutput:=ByVal vbNullString, _
        lpDevMode:=DEFAULT_VALUES)

    ' Re-dimension the array to the count of paper names.
    ReDim aintNumPaper(1 To lngPaperCount)

    ' Pad the variable to accept 64 bytes for each paper name.
    strPaperNamesList = String(64 * lngPaperCount, 0)

    ' Get the string buffer of all paper names supported by the printer.
    lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _
        lpPort:=strDevicePort, _
        iIndex:=DC_PAPERNAMES, _
        lpOutput:=ByVal strPaperNamesList, _
        lpDevMode:=DEFAULT_VALUES)

    ' Get the array of all paper numbers supported by the printer.
    lngPaperCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _
        lpPort:=strDevicePort, _
        iIndex:=DC_PAPERS, _
        lpOutput:=aintNumPaper(1), _
        lpDevMode:=DEFAULT_VALUES)

    ' List the available paper names.
    For lngCounter = 1 To lngPaperCount

        ' Parse a paper name from the string buffer.
        strPaperName = Mid(String:=strPaperNamesList, Start:=64 * (lngCounter - 1) + 1, Length:=64)
        intLength = VBA.InStr(Start:=1, String1:=strPaperName, String2:=Chr(0)) - 1
        strPaperName = Left(String:=strPaperName, Length:=intLength)
        If InStr(1, strPaperName, Paper) > 0 Then
        ' Select the a paper number corresponding to the paper name.
            PaperSelection = aintNumPaper(lngCounter)
        End If
    Next lngCounter


GetPaperList_End:
    Exit Function

GetPaperList_Err:
    MsgBox Prompt:=err.Description, Buttons:=vbCritical & vbOKOnly, _
        Title:="Error Number " & err.Number & " Occurred"
    Resume GetPaperList_End

End Function

Public Function BinSelection(BIN As String, Printer As Integer) As Integer
' Uses the DeviceCapabilities API function to choose the desired paper bin supported by the    chosen printer

    Dim lngBinCount As Long
    Dim lngCounter As Long
    Dim hPrinter As Long
    Dim strDeviceName As String
    Dim strDevicePort As String
    Dim strBinNamesList As String
    Dim strBinName As String
    Dim intLength As Integer
    Dim strMsg As String
    Dim aintNumBin() As Integer

    On Error GoTo GetBinList_Err

    ' Get name and port of the default printer.
    strDeviceName = Application.Printers(Printer).DeviceName
    strDevicePort = Application.Printers(Printer).Port

    ' Get count of paper bin names supported by the printer.
    lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _
        lpPort:=strDevicePort, _
        iIndex:=DC_BINNAMES, _
        lpOutput:=ByVal vbNullString, _
        lpDevMode:=DEFAULT_VALUES)

    ' Re-dimension the array to count of paper bins.
    ReDim aintNumBin(1 To lngBinCount)

    ' Pad variable to accept 24 bytes for each bin name.
    strBinNamesList = String(Number:=24 * lngBinCount, Character:=0)

    ' Get string buffer of paper bin names supported by the printer.
    lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _
        lpPort:=strDevicePort, _
        iIndex:=DC_BINNAMES, _
        lpOutput:=ByVal strBinNamesList, _
        lpDevMode:=DEFAULT_VALUES)

    ' Get array of paper bin numbers supported by the printer.
    lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _
        lpPort:=strDevicePort, _
        iIndex:=DC_BINS, _
        lpOutput:=aintNumBin(1), _
        lpDevMode:=0)

    ' List available paper bin names.
    strMsg = "Paper bins available for " & strDeviceName & vbCrLf
    For lngCounter = 1 To lngBinCount

        ' Parse a paper bin name from string buffer.
        strBinName = Mid(String:=strBinNamesList, _
            Start:=24 * (lngCounter - 1) + 1, _
            Length:=24)
        intLength = VBA.InStr(Start:=1, _
            String1:=strBinName, String2:=Chr(0)) - 1
        strBinName = Left(String:=strBinName, _
                Length:=intLength)

        If InStr(1, strBinName, BIN) > 0 Then
        ' Select the bin number corresponding to the bin name.
            BinSelection = aintNumBin(lngCounter)
        End If
     Next lngCounter


GetBinList_End:
    Exit Function
GetBinList_Err:
    MsgBox Prompt:=err.Description, Buttons:=vbCritical & vbOKOnly, _
        Title:="Error Number " & err.Number & " Occurred"
    Resume GetBinList_End
End Function

1

不需要使用VBA。您可以通过使用菜单中的页面设置命令来设置所有页面设置,包括边距、方向、纸张、打印机和列:报告设计工具 > 页面设置 > 页面设置 > 页面 > 纸张 > 大小,或者 > 页面 > 报告名称的打印机 > 使用特定的打印机 > 打印机 > 属性。这些设置将为每个单独的报告保存。

Screenshot


4
这比我要找的更接近了,但还不完全正确。这个文件将在不同的电脑上使用,因此需要使用Access文件配置纸张大小设置,因为从支持的角度考虑,在每台机器上手动配置打印机是不切实际的。如果可能的话,我希望能以编程方式设置它,这样运行该文件的每台计算机都会准确地知道如何处理标签。 - CertifiedKennedy

0

看起来你需要注意 .DefaultSize - 如果它为真,则会忽略你的 ItemSizeHeightItemSizeWidth 设置

MSDN 上有更多信息和一些示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接