Impressão direta - Web Browser

5,274 views
Skip to first unread message

Rhavy Maia

unread,
Jun 28, 2016, 1:13:56 PM6/28/16
to pb...@googlegroups.com
Boa tarde pessoal,

alguém já desenvolveu algo que permita impressão direta de um web browser para uma impressora em JavaScript com Angular? Geralmente quando precisamos imprimir algo do browser precisamos configurar e confirmar a impressão em uma tela secundária.

--
Rhavy Maia Guedes

Marcelo Emanoel B. Diniz

unread,
Jun 28, 2016, 1:28:18 PM6/28/16
to pb...@googlegroups.com
Pra formatar o que vai ser impresso, um css resolve. Pra chamar a impressão: window.print();


--
You received this message because you are subscribed to the Google Groups "PBJug" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pbjug+un...@googlegroups.com.
To post to this group, send email to pb...@googlegroups.com.
Visit this group at https://groups.google.com/group/pbjug.
For more options, visit https://groups.google.com/d/optout.



--
[]'s
Marcelo Emanoel

Rhavy Maia

unread,
Jun 28, 2016, 2:56:49 PM6/28/16
to pb...@googlegroups.com
Marcelo,

mas o window.print() chamará o gerenciador de impressão do navegador ou do SO. Gostaria de imprimir direto sem interrupções.
Rhavy Maia Guedes

Marcelo Emanoel B. Diniz

unread,
Jun 28, 2016, 3:19:05 PM6/28/16
to pb...@googlegroups.com
Até onde eu sei não é possível fazer isso só com Javascript. Qual o problema de usar o gerenciador de impressão?

Alisson Sena

unread,
Jun 28, 2016, 3:30:26 PM6/28/16
to pb...@googlegroups.com
Também desconheço uma forma de fazer só via JS.
Lembro de termos ajustado uma vez umas máquinas rodando Windows com Firefox para parecerem "totens" e a impressão "silenciosa" foi feita de forma semelhante a esse link: https://websitesupport.zendesk.com/hc/en-us/articles/205075144-Bypass-the-Print-Dialog-Box-in-Firefox

Deve ter algo semelhante para outros browsers, porém infelizmente fica amarrado a ajuste manual na máquina cliente.

Berg Oliveira

unread,
Jun 28, 2016, 4:13:46 PM6/28/16
to Pbjug

To enferrujado,  mas me lembro se vc fizer C jasperReport,  vc pode configurar para fazer a impressão direto. Mas tem que usar jasperReportz que eh bem mais lento.

Fernando Felix do Nascimento Junior

unread,
Jun 29, 2016, 5:50:22 PM6/29/16
to PBJug
Você pode criar um microservice pra fazer isso:

1. Cria uma função JavaScript para converter uma página HTML em PDF
2. Envia o PDF para o microservice via ajax.post
3. O microservice recebe e imprime o PDF

O bom dessa abordagem é que você pode usar o mesmo microservice para outras aplicações.



Erick Moreno

unread,
Jun 29, 2016, 10:38:46 PM6/29/16
to pb...@googlegroups.com
Mas como esse microservice chama o a função de impressão diretamente?

Adicionar uma camada não resolve o problema prático dele. Rhavy não tem, nem parece ter, meios para rodar código na máquina do usuário, ele precisa executar via browser. 

Como microservices resolvem esse problema?

[]'s
Moreno

--
You received this message because you are subscribed to the Google Groups "PBJug" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pbjug+un...@googlegroups.com.
To post to this group, send email to pb...@googlegroups.com.
Visit this group at https://groups.google.com/group/pbjug.
For more options, visit https://groups.google.com/d/optout.



--

Fernando Felix do Nascimento Junior

unread,
Jun 30, 2016, 4:30:35 AM6/30/16
to PBJug
O microservice seria basicamente uma API REST apenas para imprimir. Considerando que Rhavy esteja criando uma webapp para uma intranet de uma empresa qualquer, o microservice não precisa e nem deve ficar hospedado na máquina do usuário.

A aplicação do usuário apenas vai consumir esse microservice, que pode ser tanto no backend como no frontend. No frontend:
1. Converter uma página HTML para PDF usando JavaScript
2. Fazer uma requisição AJAX/POST com o PDF anexado para o microservice

O microservice então vai:
1. Receber a requisição do usuário com o PDF
2. Imprimir esse PDF em alguma impressora da intranet.
3. Enviar uma resposta 200 para o usuário

Perceba que o microservice pode acessar alguma base de dados (que pode ser outro microservice) para saber qual impressora deve ser utilizada para cada usuário ou grupo de usuários.

Ou seja, seria um breezy ou google cloud print em menor escala.

Erick Moreno

unread,
Jun 30, 2016, 7:13:14 AM6/30/16
to pb...@googlegroups.com
Acho que eu ou você não estamos entendendo alguma coisa, a pergunta refere-se exatamente ao ponto 2 da sua explicação:

"2. Imprimir esse PDF em alguma impressora da intranet."

Como fazer isso diretamente sem abrir a tela de confirmação do SO?

Um microservice não resolve esse problema, só muda ele de lugar, ou to perdendo alguma coisa?

[]'s
Moreno

Eder Ferreira

unread,
Jun 30, 2016, 7:22:28 AM6/30/16
to pb...@googlegroups.com
Fernando,

Nessa abordagem a impressora necessariamente precisa ser instalada no servidor (microservice), correto? E como seria a impressão nas impressoras que apenas o requisitante (cliente) tem instalada na máquina dele, como o caso de uma app web acessa via Internet?
Éder Ferreira Mendes
fme...@gmail.com

Rosivaldo Ramalho

unread,
Jun 30, 2016, 7:29:08 AM6/30/16
to pb...@googlegroups.com
Rhavy,

Se a sua aplicação for para o público em geral, ou seja, aberta via internet, você não terá como fazer isso. Por definição não tem como executar códigos na máquina do usuário via HTML/JS.

Uma solução, é que você faça com que uma requisição retorne diretamente um pdf (com o header application/pdf mesmo), e o abra em uma nova janela com um target="_blank", e a partir daí deixa o browser imprimir o pdf mesmo, formatado do jeito que você queira.

Se a sua aplicação for para rodar em uma intranet por exemplo, você poderia criar um servidor linux com o CUPS, mapear impressoras via rede, e salvar o conteúdo da página em um diretório compartilhado para que algum crawler (provavelmente em bash) pegue os arquivos e envie ao CUPS.

Espero ter ajudado em algo.

Atenciosamente
--
Rosivaldo Ramalho <rosi...@gmail.com>
Diretor na RLXE - http://www.rlxe.com.br

OCP DB 10g | OCP DB 11g | OCE RAC 11g | OCE PT 11g
OCP OAS 10g | OCE WLS 10g

Eder Ferreira

unread,
Jun 30, 2016, 7:55:43 AM6/30/16
to pb...@googlegroups.com
Rhavy,

Uma forma de não exibir a janela de confirmação da impressora no navegador seria você solicitar ao usuário configurar o seu navegador para se comportar dessa forma, por exemplo no Firefox adicionar a propriedade print.always_print_silent=true através do about:config.

Fernando Felix do Nascimento Junior

unread,
Jun 30, 2016, 9:32:23 AM6/30/16
to PBJug
Então, estou sem ferramenta de diagrama aqui, então vai de código mesmo. Considere o contexto de uma intranet.

Usuário acessando uma página de uma aplicação em algum lugar dentro da empresa. Frontend/JavaScript:
// nenhuma janela de confirmação vai aparecer
$
('button.imprimir').on('click', () => {
  let PDF = converterParaPDF(window)
 $.post('https://microservice.de.impressao/', PDF, (response) => {
   console.assert(response === "Vai pegar a impressão!")
   alert(response)
 })
})

Microservice de impressão da empresa conectado em alguma impressora da empresa. Python:
import subprocess
from flask import request

def imprimir(f):
   """ Imiprimir arquivo f sem abrir janela de confirmacao """
     subprocess.Popen("/usr/bin/lpr", stdin=subprocess.PIPE).stdin.write(f)

@app.route('/', methods=['POST'])
def imprimir():
   imprimir(request.get("PDF"))
   return "Vai pegar a impressão!"


Fernando Felix do Nascimento Junior

unread,
Jun 30, 2016, 9:35:04 AM6/30/16
to PBJug
Errata:

Microservice de impressão da empresa conectado em alguma impressora da empresa. Python:
import subprocess
from flask import request

def imprimir(f):
   """ Imiprimir arquivo f sem abrir janela de confirmacao """
     subprocess.Popen("/usr/bin/lpr", stdin=subprocess.PIPE).stdin.write(f)

@app.route('/', methods=['POST'])
def post_imprimir():
   imprimir(request.get("PDF"))
   return "Vai pegar a impressão!"

Rhavy Maia

unread,
Jun 30, 2016, 9:34:31 PM6/30/16
to pb...@googlegroups.com
Pessoal,

encontrei uma solução que permite a impressão direta com Js. Preciso configurar os browsers para aceitar uma impressão silenciosa  que é um pouco trabalhosa. Tenho um ambiente tipo toten que deve imprimir um ticket numa impressora não fiscal. Vou analisar a solução proposta do microservice me parece bem simples de implementar.
Rhavy Maia Guedes
Reply all
Reply to author
Forward
0 new messages