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");
}
}
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?