Você está offline; aguardando reconexão

Como enviar dados não processados para uma impressora utilizando o Visual c# .NET

O suporte para o Windows XP terminou

A Microsoft terminou o suporte para o Windows XP em 8 de Abril de 2014. Esta alteração afetou as suas atualizações de software e opções de segurança. Aprenda o que isto significa para si e como pode ficar protegido.

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 322091
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Para obter uma versão do Microsoft Visual Basic .NET do presente artigo, consulte 322090.
Para uma uma versão de C++ não gerida do presente artigo, consulte o seguinte artigo na Microsoft Knowledge Base:
138594 Como enviar dados não processados para uma impressora utilizando a API do Win32
Este artigo refere-se os espaços de nomes de biblioteca de classes do Microsoft .NET Framework seguintes:
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropServices

NESTA TAREFA

Sumário
Este artigo passo a passo mostra como utilizar funções de spooler de Win32 de um programa que cria utilizando o Visual c# .NET.

back to the top

Mais informações

Para enviar dados não processados para uma impressora a partir do Microsoft .NET Framework, o programa terá de trabalhar com funções de spooler de Win32. Através do .NET Framework, pode imprimir utilizando PrintDocument, PrintControllere classes associadas. No entanto, com o .NET Framework, é possível enviar dados de impressora preparado pré-formatadas para uma impressora.

Poderá ter de enviar dados não processados para uma impressora para efectuar o seguinte:
  • Envie as sequências de escape.
  • Transferir e, em seguida, utilize tipos de letra carregáveis.
  • Ficheiros de spool pré-impresso.
Para enviar estes tipos e outros tipos de dados não processados para uma impressora, o código tem de trabalhar com Interfaces de Programador de aplicações (APIs) do Win32 Spooler. O código seguinte mostra como ler o conteúdo de um ficheiro pré-formatadas na memória e, em seguida, enviar esses bytes para a impressora através da utilização de WritePrinter.

Nota: não é possível utilizar esta abordagem da mesma tarefa de impressão como uma tarefa de impressão PrintDocument nativa. Terá de utilizar o .NET Framework para imprimir ou enviar o seus próprio bytes de tarefa de impressão.

back to the top

Criar um projecto que imprime dados pré-formatadas

  1. Inicie o Visual Studio .NET. No menu Ficheiro , clique em Novoe, em seguida, clique em Projeto. Em Tipos de projecto, clique na pasta de Projectos do Visual c# . Na lista de modelos , clique em Aplicação do Windowse, em seguida, clique em OK. Por predefinição, é criado o Form1.
  2. No menu Ver , clique em caixa de ferramentas para apresentar a caixa de ferramentas e, em seguida, adicione um botão ao Form1. Este botão chama Button1.
  3. Adicione outro botão ao Form1. Este botão é o nome Button2.
  4. Faça duplo clique Button1. Aparece a janela de código para o formulário.
  5. Substitua a subrotina Button1_Click com o seguinte código:
    private void button1_Click(object sender, System.EventArgs e){    // Allow the user to select a file.    OpenFileDialog ofd = new OpenFileDialog();    if( DialogResult.OK == ofd.ShowDialog(this) )    {        // Allow the user to select a printer.        PrintDialog pd  = new PrintDialog();        pd.PrinterSettings = new PrinterSettings();        if( DialogResult.OK == pd.ShowDialog(this) )        {            // Print the file to the printer.            RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);        }    }}					
  6. Substitua a subrotina Button2_Click com o seguinte código:
    private void button2_Click(object sender, System.EventArgs e){    string s = "Hello"; // device-dependent string, need a FormFeed?        // Allow the user to select a printer.    PrintDialog pd  = new PrintDialog();    pd.PrinterSettings = new PrinterSettings();    if( DialogResult.OK == pd.ShowDialog(this) )    {        // Send a printer-specific to the printer.        RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);    }}					
  7. Insira o seguinte código na parte superior do ficheiro:
    using System;using System.Drawing;using System.Drawing.Printing;using System.Windows.Forms;using System.Runtime.InteropServices;					
  8. Adicione o seguinte código dentro do espaço de nomes da aplicação principal mas fora quaisquer definições de classe:
    public class RawPrinterHelper{    // Structure and API declarions:    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]    public class DOCINFOA    {        [MarshalAs(UnmanagedType.LPStr)] public string pDocName;        [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;        [MarshalAs(UnmanagedType.LPStr)] public string pDataType;    }    [DllImport("winspool.Drv", EntryPoint="OpenPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);    [DllImport("winspool.Drv", EntryPoint="ClosePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool ClosePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="StartDocPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool StartDocPrinter( IntPtr hPrinter, Int32 level,  [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);    [DllImport("winspool.Drv", EntryPoint="EndDocPrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool EndDocPrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="StartPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool StartPagePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="EndPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool EndPagePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="WritePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten );    // SendBytesToPrinter()    // When the function is given a printer name and an unmanaged array    // of bytes, the function sends those bytes to the print queue.    // Returns true on success, false on failure.    public static bool SendBytesToPrinter( string szPrinterName, IntPtr pBytes, Int32 dwCount)    {        Int32    dwError = 0, dwWritten = 0;        IntPtr    hPrinter = new IntPtr(0);        DOCINFOA    di = new DOCINFOA();        bool    bSuccess = false; // Assume failure unless you specifically succeed.        di.pDocName = "My C#.NET RAW Document";        di.pDataType = "RAW";        // Open the printer.        if( OpenPrinter( szPrinterName.Normalize(), out hPrinter, IntPtr.Zero ) )        {            // Start a document.            if( StartDocPrinter(hPrinter, 1, di) )            {                // Start a page.                if( StartPagePrinter(hPrinter) )                {                    // Write your bytes.                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);                    EndPagePrinter(hPrinter);                }                EndDocPrinter(hPrinter);            }            ClosePrinter(hPrinter);        }        // If you did not succeed, GetLastError may give more information        // about why not.        if( bSuccess == false )        {                dwError = Marshal.GetLastWin32Error();        }        return bSuccess;    }    public static bool SendFileToPrinter( string szPrinterName, string szFileName )    {        // Open the file.        FileStream fs = new FileStream(szFileName, FileMode.Open);        // Create a BinaryReader on the file.        BinaryReader br = new BinaryReader(fs);        // Dim an array of bytes big enough to hold the file's contents.        Byte []bytes = new Byte[fs.Length];        bool bSuccess = false;        // Your unmanaged pointer.        IntPtr pUnmanagedBytes = new IntPtr(0);        int nLength;        nLength = Convert.ToInt32(fs.Length);        // Read the contents of the file into the array.        bytes = br.ReadBytes( nLength );        // Allocate some unmanaged memory for those bytes.        pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);        // Copy the managed byte array into the unmanaged array.        Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);        // Send the unmanaged bytes to the printer.        bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);        // Free the unmanaged memory that you allocated earlier.        Marshal.FreeCoTaskMem(pUnmanagedBytes);        return bSuccess;    }    public static bool SendStringToPrinter( string szPrinterName, string szString )    {        IntPtr pBytes;        Int32 dwCount;        // How many characters are in the string?        dwCount = szString.Length;        // Assume that the printer is expecting ANSI text, and then convert        // the string to ANSI text.        pBytes = Marshal.StringToCoTaskMemAnsi(szString);        // Send the converted ANSI string to the printer.        SendBytesToPrinter(szPrinterName, pBytes, dwCount);        Marshal.FreeCoTaskMem(pBytes);        return true;    }}					
  9. Prima F5 para compilar e executar o programa.
  10. Clique em Button1 para carregar e imprimir o conteúdo de um ficheiro.
  11. Clique em Button2 para imprimir uma cadeia. (Poderá ter de ejectar a página manualmente porque a cadeia é enviada sem o comando de avanço de papel .)
back to the top
Referências
Para mais informações, clique nos números de artigo seguinte para visualizar os artigos na Microsoft Knowledge Base:
138594 Como enviar dados não processados para uma impressora utilizando a API do Win32
back to the top
Dispositivo RAW porta transferir tipos de letra carregável

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 322091 - Última Revisão: 12/07/2015 10:54:24 - Revisão: 6.0

Microsoft Windows XP Professional Edition

  • kbnosurvey kbarchive kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtpt
Comentários