HOWTO: Nastavte obojstrannú tlač Word automatizácie

Preklady článku Preklady článku
ID článku: 230743 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

Microsoft Word pre Windows neposkytuje spôsob automatizácie klientov nastaviť obojstrannú tlač vlajkou pred začatím tlačovú úlohu. Hoci neexistuje parameter v Výpis metóda, ktorá označuje podporu pre obojstrannú tlač, parameter neposkytuje pravda obojstranná tlač a nemusia byť dostupné v závislosti od operačného systému alebo nainštalovanom jazyku. Však vývojári sa dá obísť toto obmedzenie na Windows systémov zmena duplexnú príznak pre ovládač aktívnej tlačiarne pred volaním Word Výpis Funkcia.

Tento článok ukazuje ako používať Windows API zmeniť hodnotu nastavenia duplexu aktívnej tlačiarne a umožniť dokumentu programu Word sa vytlačia v duplexné.

DALSIE INFORMACIE

Tento kód používa DocumentProperties API zmeniť nastavenia tlače ovládača tlačiarne na umožnenie obojstrannú tlač. Pre tento kód úspešne pracovať, konečný užívateľ potrebovať primerané povolenia chcete zmeniť globálne nastavenia tlače pre tlačiareň. Ak používateľ nemá náležité povolenie na zmenu nastavenia ovládača, budú mať prístup odmietnutý chyba OpenPrinter API pohotovosť.

Pre používateľov systému Microsoft Windows NT a Microsoft Windows 2000, ktorí potrebujú tlačiť na zdieľanú tlačiareň v sieti, môže to byť problém pretože ovládač tlače nemá bydlisko na lokálnom počítači, ale na tlačovom serveri. Hoci je možné pre správcu konfigurácia tlačového servera koncovým používateľom riadne povolenie na zmenu globálne nastavenia, nie je žiaduce, aby tak urobili vo väčšine prípadov. Obísť tento problém, je možné nainštalovať ovládač miestnej tlače sieťovej tlačiarne, a nech každý užívateľ ovládať nastavenie pre ich lokálne systémy.

Kroky na pridanie miestnej tlači ovládač pre sieťovú tlačiareň na Windows NT a Windows 2000

  1. Jeden Štart menu vyberte Nastavenie, potom vyberte tlačiarne, a dvakrát kliknite na Pridať tlačiareň vychovávať sprievodcu Add Printer.
  2. Keď sa zobrazí výzva, vyberte tlačiareň z"Tento počítač"a nie zo siete. Hoci sa pripojíte sieťovú tlačiareň, ktorú chcete použitie ovládača v tomto počítači. Klávesová skratka Next pokračovať.
  3. Kliknite na"Pridanie portu."
  4. Vyberte Local Port do rozbaľovacieho zoznamu poľa a potom kliknite na tlačidlo Nový Port.
  5. Zadajte umiestnenie tlačiarne v sieti. Napríklad:
        \\printserver\printername (using the exact path name to the printer)
    					
  6. Vyberte ok a pokračovať so zvyškom inštalácie.
Zmena vlastnosti tlačiarne pre aktívnej tlačiarne ovplyvní všetky aplikácie, ktoré používajú tlačiareň, a nie len slovo. Ak máte v pláne na zmenou nastavenia pre konkrétne tlačovú úlohu, uistite sa, obnovíte nastavenie po dokončení projektu.

Kroky na vybudovanie vzorky

  1. Otvorte program Visual Basic a vytvoriť nový projekt. Form1 sa vytvorí na základe predvoleného nastavenia.
  2. Pridať štandardný modul BAS do projektu a pridať nasledujúci kód do okna s kódom modulu:
      
     Option Explicit
    
       Public Type PRINTER_DEFAULTS
    
           pDatatype As Long
           pDevmode As Long
           DesiredAccess As Long
       End Type
    
       Public Type PRINTER_INFO_2
           pServerName As Long
           pPrinterName As Long
           pShareName As Long
           pPortName As Long
           pDriverName As Long
           pComment As Long
           pLocation As Long
           pDevmode As Long       ' Pointer to DEVMODE
           pSepFile As Long
           pPrintProcessor As Long
           pDatatype As Long
           pParameters As Long
           pSecurityDescriptor As Long  ' Pointer to SECURITY_DESCRIPTOR
           Attributes As Long
    
    
           Priority As Long
           DefaultPriority As Long
           StartTime As Long
           UntilTime As Long
           Status As Long
           cJobs As Long
           AveragePPM As Long
       End Type
    
       Public Type DEVMODE
           dmDeviceName As String * 32
    
           dmSpecVersion As Integer
           dmDriverVersion As Integer
           dmSize As Integer
           dmDriverExtra As Integer
           dmFields As Long
           dmOrientation As Integer
           dmPaperSize As Integer
           dmPaperLength As Integer
           dmPaperWidth As Integer
           dmScale As Integer
           dmCopies As Integer
           dmDefaultSource As Integer
           dmPrintQuality As Integer
           dmColor As Integer
           dmDuplex As Integer
           dmYResolution As Integer
           dmTTOption As Integer
           dmCollate As Integer
           dmFormName As String * 32
           dmUnusedPadding As Integer
           dmBitsPerPel As Integer
           dmPelsWidth As Long
           dmPelsHeight As Long
           dmDisplayFlags As Long
           dmDisplayFrequency As Long
           dmICMMethod As Long
           dmICMIntent As Long
           dmMediaType As Long
           dmDitherType As Long
           dmReserved1 As Long
           dmReserved2 As Long
       End Type
    
       Public Const DM_DUPLEX = &H1000&
       Public Const DM_IN_BUFFER = 8
    
       Public Const DM_OUT_BUFFER = 2
       Public Const PRINTER_ACCESS_ADMINISTER = &H4
       Public Const PRINTER_ACCESS_USE = &H8
       Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
       Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
                 PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
    
       Public Declare Function ClosePrinter Lib "winspool.drv" _
        (ByVal hPrinter As Long) As Long
       Public Declare Function DocumentProperties Lib "winspool.drv" _
         Alias "DocumentPropertiesA" (ByVal hwnd As Long, _
         ByVal hPrinter As Long, ByVal pDeviceName As String, _
         ByVal pDevModeOutput As Long, ByVal pDevModeInput As Long, _
         ByVal fMode As Long) As Long
       Public Declare Function GetPrinter Lib "winspool.drv" Alias _
         "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
         pPrinter As Byte, ByVal cbBuf As Long, pcbNeeded As Long) 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 SetPrinter Lib "winspool.drv" Alias _
         "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
         pPrinter As Byte, ByVal Command As Long) As Long
    
       Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (pDest As Any, pSource As Any, ByVal cbLength As Long)
     
       ' ==================================================================
       ' SetPrinterDuplex 
       '
       '  Programmatically set the Duplex flag for the specified printer
       '  driver's default properties.
       '
       '  Returns: True on success, False on error. (An error will also
    
       '  display a message box. This is done for informational value
       '  only. You should modify the code to support better error
       '  handling in your production application.)
       '
       '  Parameters:
       '    sPrinterName - The name of the printer to be used.
       '
       '    nDuplexSetting - One of the following standard settings:
       '       1 = None
       '       2 = Duplex on long edge (book)
       '       3 = Duplex on short edge (legal)
       '
       ' ==================================================================
       Public Function SetPrinterDuplex(ByVal sPrinterName As String, _
    
           ByVal nDuplexSetting As Long) As Boolean
    
          Dim hPrinter As Long
          Dim pd As PRINTER_DEFAULTS
          Dim pinfo As PRINTER_INFO_2
          Dim dm As DEVMODE
       
          Dim yDevModeData() As Byte
          Dim yPInfoMemory() As Byte
          Dim nBytesNeeded As Long
          Dim nRet As Long, nJunk As Long
       
          On Error GoTo cleanup
       
          If (nDuplexSetting < 1) Or (nDuplexSetting > 3) Then
             MsgBox "Error: dwDuplexSetting is incorrect."
             Exit Function
          End If
          
          pd.DesiredAccess = PRINTER_ALL_ACCESS
          nRet = OpenPrinter(sPrinterName, hPrinter, pd)
          If (nRet = 0) Or (hPrinter = 0) Then
             If Err.LastDllError = 5 Then
                MsgBox "Access denied -- See the article for more info."
             Else
                MsgBox "Cannot open the printer specified " & _
                  "(make sure the printer name is correct)."
             End If
             Exit Function
          End If
       
          nRet = DocumentProperties(0, hPrinter, sPrinterName, 0, 0, 0)
          If (nRet < 0) Then
             MsgBox "Cannot get the size of the DEVMODE structure."
             GoTo cleanup
          End If
       
          ReDim yDevModeData(nRet + 100) As Byte
          nRet = DocumentProperties(0, hPrinter, sPrinterName, _
                      VarPtr(yDevModeData(0)), 0, DM_OUT_BUFFER)
          If (nRet < 0) Then
             MsgBox "Cannot get the DEVMODE structure."
             GoTo cleanup
          End If
       
          Call CopyMemory(dm, yDevModeData(0), Len(dm))
       
          If Not CBool(dm.dmFields And DM_DUPLEX) Then
            MsgBox "You cannot modify the duplex flag for this printer " & _
                   "because it does not support duplex or the driver " & _
                   "does not support setting it from the Windows API."
             GoTo cleanup
          End If
       
          dm.dmDuplex = nDuplexSetting
          Call CopyMemory(yDevModeData(0), dm, Len(dm))
       
          nRet = DocumentProperties(0, hPrinter, sPrinterName, _
            VarPtr(yDevModeData(0)), VarPtr(yDevModeData(0)), _
            DM_IN_BUFFER Or DM_OUT_BUFFER)
    
          If (nRet < 0) Then
            MsgBox "Unable to set duplex setting to this printer."
            GoTo cleanup
          End If
       
          Call GetPrinter(hPrinter, 2, 0, 0, nBytesNeeded)
          If (nBytesNeeded = 0) Then GoTo cleanup
       
          ReDim yPInfoMemory(nBytesNeeded + 100) As Byte
    
          nRet = GetPrinter(hPrinter, 2, yPInfoMemory(0), nBytesNeeded, nJunk)
          If (nRet = 0) Then
             MsgBox "Unable to get shared printer settings."
             GoTo cleanup
          End If
       
          Call CopyMemory(pinfo, yPInfoMemory(0), Len(pinfo))
          pinfo.pDevmode = VarPtr(yDevModeData(0))
          pinfo.pSecurityDescriptor = 0
          Call CopyMemory(yPInfoMemory(0), pinfo, Len(pinfo))
       
          nRet = SetPrinter(hPrinter, 2, yPInfoMemory(0), 0)
          If (nRet = 0) Then
             MsgBox "Unable to set shared printer settings."
          End If
       
          SetPrinterDuplex = CBool(nRet)
    
       cleanup:
          If (hPrinter <> 0) Then Call ClosePrinter(hPrinter)
    
       End Function
    
    
    					
  3. Form1, pridať štandardné príkazového tlačidla.
  4. Pridať nasledujúci kód do okna pre kód pre Form1:
       Option Explicit
       
       Private Sub Command1_Click()
          Dim oWord As Object
          Dim oDoc As Object
          
          Set oWord = CreateObject("Word.application")
    
          oWord.Visible = True
          
          Set oDoc = oWord.Documents.Add
          oDoc.Range.Select
          
    
          oWord.Selection.TypeText "This is on page 1" & vbCr
          oWord.Selection.InsertBreak 1
          oWord.Selection.TypeText "This is page 2"
          
          SetPrinterDuplex Printer.DeviceName, 2
          
          oDoc.PrintOut Background:=False
          
          SetPrinterDuplex Printer.DeviceName, 1
          
          MsgBox "Print Done", vbMsgBoxSetForeground
          
          oDoc.Saved = True
          oDoc.Close
          Set oDoc = Nothing
       
          oWord.Quit
          Set oWord = Nothing
       End Sub
    
    					
  5. Spustiť vzorky. Ak máte tlačiareň, ktorá podporuje obojstrannú tlač, testovaný doklad by mali tlačiť na obe strany stránky.

ODKAZY

Ďalšie informácie o problémoch, môže zobraziť pri pokuse o tlač dokumentov programu Word pomocou duplexnú tlačiareň, prečítajte si nasledujúce články v databáze Microsoft Knowledge Base:

176189 WD97: Podfarbenie čiernou alebo Gray nevytlačí Duplex na NT

196857 WD97: Prvý stránke tlačí na zadnej strane poslednú stranu s Duplex

214683 WD97: Obojstranná tlač robí nie duplexu s objektmi na stránke

Vlastnosti

ID článku: 230743 - Posledná kontrola: 23. októbra 2011 - Revízia: 3.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
Kľúčové slová: 
kbapi kbautomation kbhowto kbprint kbmt KB230743 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:230743

Odošlite odozvu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com