Проблема размера страницы принтера

Я пытаюсь установить нестандартный размер бумаги, выполнив следующие действия:

Printer.Height = 2160
Printer.Width = 11900

Но не видно никакого эффекта. После настройки я запрашиваю эти значения, и они возвращают значения по умолчанию. И это:

Printer.PaperSize = 256

Возвращает ошибку...

Есть идеи??


person mRt    schedule 10.02.2010    source источник


Ответы (5)


Либо ваш принтер не позволяет устанавливать эти свойства, либо вы превышаете их максимально допустимые значения. Из Справочник по Visual Basic

Если задать свойства «Высота» и «Ширина» для драйвера принтера, который не позволяет устанавливать эти свойства, ошибки не возникает, и размер бумаги остается прежним. Если вы устанавливаете высоту и ширину для драйвера принтера, который позволяет указывать только определенные значения, ошибка не возникает, и свойство устанавливается на то, что разрешено драйвером. Например, вы можете установить высоту на 150, а драйвер установит ее на 144.

Я не знаю, почему вы получаете сообщение об ошибке, когда устанавливаете для свойства Papersize значение 256. У меня это работает. Кроме того, документация гласит: "Настройка свойство Height или Width принтера автоматически устанавливает для PaperSize значение vbPRPSUser.", что равно 256.

person raven    schedule 10.02.2010

На самом деле я был вовлечен в ту же проблему, но я просто нашел прорыв. Сначала вам нужно создать пользовательскую форму, которая определяет ваш пользовательский размер бумаги. Затем вам нужно обратиться к API Windows, чтобы проверить имя формы, которое вы только что создали. Вы получите имя for из массива, возвращаемого функцией, и используете индекс массива, в котором было найдено имя формы. Наконец, используйте его как значение для принтера.бумагаразмер

Пример ниже:

Public Type PRINTER_DEFAULTS
   pDatatype            As Long
   pDevMode             As Long
   DesiredAccess        As Long
End Type

Public Type FORM_INFO_1
        Flags As Long
        pName As Long   ' String
        Size As SIZEL
        ImageableArea As RECTL
End Type

Public Declare Function EnumForms Lib "winspool.drv" Alias "EnumFormsA" _
    (ByVal hPrinter As Long, ByVal Level As Long, ByRef pForm As Any, _
    ByVal cbBuf As Long, ByRef pcbNeeded As Long, _
    ByRef pcReturned As Long) As Long

Public Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
   (pDest As Any, pSource As Any, ByVal cbLength As Long)
Public Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)

Public Declare Function OpenPrinter Lib "winspool.drv" Alias _
   "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
   pDefault As PRINTER_DEFAULTS) As Long

Public Declare Function ClosePrinter Lib "winspool.drv" _
   (ByVal hPrinter As Long) As Long

Public Declare Function lstrcpy Lib "KERNEL32" Alias "lstrcpyA" _
    (ByVal lpString1 As String, ByRef lpString2 As Long) As Long

'UDF
Public Function PtrCtoVbString(ByVal Add As Long) As String
Dim sTemp As String * 512, x As Long

x = lstrcpy(sTemp, ByVal Add)
If (InStr(1, sTemp, Chr(0)) = 0) Then
     PtrCtoVbString = ""
Else
     PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
End If
End Function

Public Function IsFormExist(ByVal DeviceName As String, ByVal isFormName As String, ByVal PrinterHandle As Long) As Long
Dim NumForms As Long, i As Long
Dim FI1 As FORM_INFO_1
Dim pd As PRINTER_DEFAULTS
Dim aFI1() As FORM_INFO_1           ' Working FI1 array
Dim Temp() As Byte                  ' Temp FI1 array
Dim FormIndex As Integer
Dim BytesNeeded As Long
Dim RetVal As Long

On Error GoTo cleanup

FormIndex = 0
ReDim aFI1(1)
' First call retrieves the BytesNeeded.

RetVal = OpenPrinter(DeviceName, PrinterHandle, pd)
  If (RetVal = 0) Or (PrinterHandle = 0) Then
  'Can't access current printer. Bail out doing nothing
  Exit Function
End If

RetVal = EnumForms(PrinterHandle, 1, aFI1(0), 0&, BytesNeeded, NumForms)
ReDim Temp(BytesNeeded)
ReDim aFI1(BytesNeeded / Len(FI1))
' Second call actually enumerates the supported forms.
RetVal = EnumForms(PrinterHandle, 1, Temp(0), BytesNeeded, BytesNeeded, _
         NumForms)
Call CopyMemory(aFI1(0), Temp(0), BytesNeeded)
For i = 0 To NumForms - 1
    With aFI1(i)
        If isFormName = PtrCtoVbString(.pName) Then
           ' Found the desired form
            FormIndex = i + 1
            Exit For
        End If
    End With
Next i
IsFormExist = FormIndex ' Returns the number when form is found.

cleanup:
   'Release the printer handle
   If (PrinterHandle <> 0) Then Call ClosePrinter(PrinterHandle)
End Function


'Here We Go

dim papercode as long, printername as string, formname as string
printername=printer.Devicename 
formname = "myform"   

papercode=IsFormExist(printername, formname, Printer.hdc)

if papercode<>0 then
  printer.papersize=papercode
end if

Попробуйте, удачи

person zulridzwan    schedule 29.04.2010

Вы уверены, что ошибка не связана с максимальной шириной печати самого принтера? Многие принтеры имеют максимальную ширину печати 8,25 дюйма (11880), что позволяет оставлять поля шириной 1/4 дюйма с обеих сторон бумаги шириной 8,5 дюйма.

Самый быстрый способ проверить — просто установить ширину печати на 11880 или ниже и посмотреть, работает ли она.

Другой возможностью были бы разрешения на принтер. Если это общий сетевой ресурс, он может быть заблокирован.

person jasonk    schedule 10.02.2010

Решение - использовать windows 98. Не работает ни с win2k, ни с winXP. Тот же код, тот же принтер.

С уважением.

person mRt    schedule 10.02.2010

Я тестирую этот код, но не вижу настраиваемую форму, созданную с помощью принтеров и сканеров, в Панели управления Windows XP Professional SP3. Примечание. Я мог бы проверить в regedit, что эта форма существует, и ее идентификатор равен 512 в строковом значении, и он содержит имя формы, созданной в панели управления принтерами.

Почему эта функция не возвращает мою пользовательскую форму, я использую HP Laserjet 1020.

person MyDesc    schedule 02.06.2010