none
Listagem de impressoras com asp.net RRS feed

  • Pergunta

  • Boa tarde!

    Pessoal, estou criando uma aplicação webforms em que preciso imprimir um relatório diretamente, sem preview.

    Preciso listar as impressoras instaladas no cliente para que ele possa escolher onde imprimir.

    Nessa Thread Capturar nome das impressora   mostra como fazer isso:

    O meu problema é que não aparecem todas as impressoras, só está aparecendo a Microsoft XPS Document Writer, sendo que tenho mais 4 impressoras instaladas.

    Alguém sabe o que pode estar acontencendo? Será que é alguma configuração do IIS ou é no código mesmo?



    segunda-feira, 20 de agosto de 2012 16:17

Respostas

Todas as Respostas

  • Amigo,

    As impressoras que serão exibidas devem estar instaladas no servidor não na sua maquina. Fiz um código rápido utilizando os exemplos que você passou e tive sucesso, no meu servidor ele listou 2 impressoras e na minha maquina apenas 1.

    Espero ter ajudado e boa sorte!


    Não esqueça de marcar como útil uma resposta que te ajude.
    "A diversão é a alma do negócio"

    segunda-feira, 20 de agosto de 2012 16:38
  • Lucas,

    Posta esse código para ajudar nosso amigo!


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    segunda-feira, 20 de agosto de 2012 16:51
  • Lucas, é isso mesmo cara, só mostra as impressoras que estão no servidor...

    Por acaso você conhece algum método para imprimir direto na impressora padrão do cliente?

    Abs,

    Samuel

    segunda-feira, 20 de agosto de 2012 16:54
  • Isso te ajuda em algo:

    http://stackoverflow.com/questions/2642257/winforms-prints-to-default-printer-even-if-its-not-available-connected


    É possível sim! Ponha isso na sua cabeça. É possível. "Steve Jobs"

    Eduardo Pires
    www.eduardopires.net.br

           

    segunda-feira, 20 de agosto de 2012 17:28
  • Samuel,

    Infelizmente você teria que montar um COM+ para intermediar essa solicitação, acredito que seja muita dor de cabeça. Você não poderia montar algo simples e via javascript "print();" você dispara a impressão?

    Espero ter ajudado e boa sorte!


    Não esqueça de marcar como útil uma resposta que te ajude.
    "A diversão é a alma do negócio"

    segunda-feira, 20 de agosto de 2012 18:45
  • Eduardo,

    Obrigado pela dica cara, vou dar uma estudada nisso ai e ver se consigo adaptar para webforms.

    Qualquer coisa eu posto o resultado aqui blz.

    Obrigado.
    segunda-feira, 20 de agosto de 2012 18:52
  • Então Lucas,

    Até pode ser, mas eu acho que teria que renderizar o relatório para html e depois fazer o print().

    A situação é a seguinte:

    Tenho um checkboxlist com nomes de clinicas e como valores, os ids das mesmas.

    O meu cliente quer selecionar várias clinicas dessa lista e simplesmente clicar em imprimir e sair todos os relatórios de exames das clinicas conforme as datas que ele selecionou entendeu?

    Essa funcionalidade nós conseguimos implementar em winforms, mas no webforms tá complicado...

    Tenho esses relatórios prontos em arquivos .rdlc.

    No winforms eu só fazia um loop pelos ids do checkedlistbox, carregava o relatório com os dados e mandava imprimir em cada iteração do loop, funcionava que é uma beleza.

    Já pensei em criar pdf direto e depois concatenar todos os pdfs... mas ainda não sei como fazer isso.

    segunda-feira, 20 de agosto de 2012 19:00
  • Ola Samuel,

         Para imprimir direto para o cliente vc precisa estar rodando alguma coisa na maquina do cliente. As formas mais faceis de fazer isso é via Java ou Silverlight.

         Se voce não tiver necessidade de imprimir em linux eu aconcelho a procurar o material em java sobre isso... eu fazia isso usando um Java Applet com esse codigo aqui:

    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.print.PageFormat;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    
    import javax.swing.JEditorPane;
    import javax.swing.RepaintManager;
    
    public class PrinterSpooler implements Printable {
    	private JEditorPane printPane;
    	
    	public static void Print(String text) {
    		PrinterSpooler target = new PrinterSpooler();
    		target.setSpool(text);
    		
    		PrinterJob printJob = PrinterJob.getPrinterJob();
    		printJob.setPrintable(target);
    		try{
    		    printJob.printDialog();
    		    printJob.print();
    		}catch(Exception e){
    		    e.printStackTrace();
    		}
    	}
    
        public PrinterSpooler() { 
        	printPane = new JEditorPane();
        }       
        
        public String getSpool() {
    		return printPane.getText();
    	}
    	public void setSpool(String spool) {
    		printPane.setText(spool);
    	}
    
    	@Override    
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {    	    	
            if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;
    
            Graphics2D g2d = (Graphics2D)graphics;
            g2d.setClip(0, 0, (int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight());
            g2d.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());
    
            RepaintManager rm = RepaintManager.currentManager(printPane);
            boolean doubleBuffer = rm.isDoubleBufferingEnabled();
            rm.setDoubleBufferingEnabled(false);
    
            printPane.setSize((int)pageFormat.getImageableWidth(), 1);
            printPane.print(g2d);
    
            rm.setDoubleBufferingEnabled(doubleBuffer);
    
            return Printable.PAGE_EXISTS;
        }
    }

    mas se voce não tiver essa limitação voce pode fazer um aplicativo em Silverlight que facilitaria para vc por ser em C#, no Caso do Silverlight 5 inclusive voce pode chamar as API do windows e imprimir direto via WinSpool


    Microsoft Community Contributor

    segunda-feira, 20 de agosto de 2012 19:07
    Moderador
  • Usando o silverlight para imprimir direto para a impressora:

    Enumerating Printers using PInvoke in Silverlight 5

    http://10rem.net/blog/2011/09/27/enumerating-printers-using-pinvoke-in-silverlight-5

    Printing “raw text” (ZPL) from Web

    http://stackoverflow.com/questions/7008575/printing-raw-text-zpl-from-web


    Microsoft Community Contributor

    segunda-feira, 20 de agosto de 2012 19:09
    Moderador
  • Rui,

    A idéia do silverlight é ótima, é bem por ai mesmo.

    Não achei uma maneira impressoras diretamente em asp.

    Muito obrigado pela dica.

    Samuel.

    quarta-feira, 22 de agosto de 2012 12:15