Impressão Direta na Impressora

Olá, existe alguma maneira de jogar um conteudo qualquer direto para impressora?, atualmente tenho um arquivo PDF, ao invês de criar esse arquivo preciso imprimir diretamente, impedindo que o usuário salve esse arquivo.

Encontrei algo, mas preciso fazer uma formatação aceitável, o problema que era um documento pdf dividido em tabelas e colunas, existe algum componente ou alguma forma que jogue um determinado conteudo para uma impressora e possibilite uma formatação?

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;

// Essa classe é a responsavel pela impressao. Ela detecta a impressora  
// instalada, recebe o texto e o imprime.  
public class Impressao {

	// variavel estatica porque será utilizada por inumeras threads
	private static PrintService impressora;

	public Impressao() {
		detectaImpressoras();
	}

	// O metodo verifica se existe impressora conectada e a
	// define como padrao.
	public void detectaImpressoras() {
		try {
			DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
			PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);
			for (PrintService p : ps) {
				if(p.getName()!=null && p.getName().contains("hp")){
					System.out.println("Impressora Selecionada: " + p.getName());
					System.out.println("Impressora encontrada: " + p.getName());
					impressora = p;
				}	
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public synchronized boolean imprime(String texto) {

		// se nao existir impressora, entao avisa usuario
		// senao imprime texto
		if (impressora == null) {
			String msg = "Nennhuma impressora foi encontrada. Instale uma impressora padrão \r\n(Generic Text Only) e reinicie o programa.";
			System.out.println(msg);
		} else {
			try {
				DocPrintJob dpj = impressora.createPrintJob();
				InputStream stream = new ByteArrayInputStream(texto.getBytes());
				DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
				Doc doc = new SimpleDoc(stream, flavor, null);
				dpj.print(doc, null);
				return true;
			} catch (PrintException e) {
				e.printStackTrace();
			}
		}
		return false;
	}
	public static void main(String[] args) {
		new Impressao().imprime("teste pedrosa dfsdfsdfsdffsdfsfdffsf" + System.getProperty("line.separator") + "asdad");
	}
}
1 curtida

Um tempo atras estava precisando justamente disso, mas para web (JavaEE)

Consegui implementar mas so funciona pelo browser

Cara é para um sistema desktop, o pior problema é a formatação.

Olá

Deve haver meios porque volta e meia abro PDFs protegidos que não permitem salvar. O que o google, o site da Adobe ou o iText (ou similar) dizem sobre isto?

[]s
Luca

Realmente como já esta desenvolvido com o iText deve existir algum método que torne o arquivo seguro, alguém já implementou algo assim com o iText?

Na documentação tem a classe PdfEncryptor.

Achei um exemplo que coloca senha e habilita a impressão:

public static void main(String[] args) {
		System.out.println("Encryptor example");
		try {
			PdfReader reader = new PdfReader("/arquivo.pdf");
			PdfEncryptor.encrypt(reader,
					new FileOutputStream("/arquivoencrypted.pdf"),
					"us",
					"pwd"l,
					PdfWriter.AllowPrinting,
					false);
		}
		catch(Exception e) {
			e.printStackTrace();
		}
}

Eu preciso que desabilite o botão de Salvar, esse cara le o arquivo original e joga senha, também achei o jeito de jogar senha na hora da criação do arquivo.

writer.setEncryption(false, "user", "password", 0);

Mas está deprecated e também não desabilita o botão salvar.

Alguma luz?