Impressão errada de PDF com Java Print Service

6 respostas
RichardVaugh

Bom dia pessoal,

estou pesquisando sobre como imprimir um arquivo pdf usando JPS (e vou recorrer a outra coisa
caso não tenha nenhum resultado positivo).
Fiz uns testes mas a impressão traz a codificação do pdf em várias folhas, ou seja, coisas como :
%PDF-1.4
%âãÏÓ
1 0 obj <>stream
x?ã

meu código é o seguinte:
PrinterJob pjob = PrinterJob.getPrinterJob();
				 
				DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
					  String filename = "C:\\relatorios.pdf";
					  FileInputStream fis = null;
					try {
						fis = new FileInputStream(filename);
					} catch (FileNotFoundException e1) {
						e1.printStackTrace();
					}
					  DocAttributeSet das = new HashDocAttributeSet();
					  Doc doc = new SimpleDoc(fis, flavor, das);
					
					  if (pjob.printDialog()){
						  PrintService ps = pjob.getPrintService();
						  DocPrintJob jb = ps.createPrintJob();
						  
						  try {
						    PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();

							jb. print(doc, attr );
						} catch (PrintException e1) {
							e1.printStackTrace();
						}					  
					  }

tentei usar no flavor INPUT_STREAM.PDF mas diz ser inválido...

Alguma sugestão ?

obrigado !

6 Respostas

RichardVaugh

Dei uma fuçada na internet e achei um exemplo que imprimi um txt, estou convertendo meu pdf para txt.
Encontrei outro problema,
é o seguinte:
estou me baseando nesse exemplo para impressão

import java.awt.*;
import java.awt.font.*;
import java.awt.print.*;
import java.io.*;
import java.text.AttributedString;
import java.util.ArrayList;
import java.util.Iterator;
public class AdvancedTextExample implements Printable {
// array de paragrafos do texto
ArrayList texto;
public AdvancedTextExample() throws IOException {
// Obtem um job de impressao
PrinterJob job = PrinterJob.getPrinterJob();
// carrega o texto a ser impresso
BufferedReader re = new BufferedReader(new FileReader("texto.txt"));
texto = new ArrayList();
String line = re.readLine();
while (line != null) {
texto.add(line);
line = re.readLine();
}
re.close();
// Define o objeto a ser impresso
job.setPrintable(this);
// exibe o dialogo de impressao.
if (job.printDialog()) {
try {
// imprime o objeto printable
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
public int print(Graphics g, PageFormat format, int page) throws PrinterException {
if (page != 0) {
return NO_SUCH_PAGE;
}
Graphics2D gr = (Graphics2D) g;
// determina o ponto de inicio do texto (inicio da area util + 10 pontos)
float posX = (float) format.getImageableX()+10;
float posY = (float) format.getImageableY()+10;
// determina a largura do texto como 350 pontos (dpi)
float larguraTexto = 350;
// para cada paragrafo, imprime o paragrafo formatado
Iterator it = texto.iterator();
while (it.hasNext()) {
String line = (String) it.next();
// caso haja uma linha em branco, substituir por um espaço
// para permitir formatação
if (line.length() == 0) {
line = " ";
}
// texto formatado a ser impresso
AttributedString str = new AttributedString(line);
// define a fonte do texto como arial 12 itálico
str.addAttribute(TextAttribute.FONT, new Font("Arial", Font.ITALIC, 12));
// instancia um line breaker para o texto formatado
LineBreakMeasurer quebrador = new LineBreakMeasurer(str.getIterator(),
gr.getFontRenderContext());
// cria um TextLayout para armazenar cada linha 'quebrada'
TextLayout linha = quebrador.nextLayout(larguraTexto);
while (linha != null) {
// posiciona o texto
posY += linha.getAscent();
linha.draw(gr, posX, posY);
// soma espaço para a próxima linha
posY += linha.getDescent() + linha.getLeading();
linha = quebrador.nextLayout(larguraTexto);
}
} // fim dos paragrafos
return PAGE_EXISTS;
}
public static void main(String[] args) {
try {
new AdvancedTextExample();
} catch (IOException e) {
System.out.println("Erro imprimindo: " + e.getMessage());
}
}
}

quanto ele imprimi ele coloca uma página somente, mesmo com quebra ele não interpreta…eu tentei
excluir o trecho

if (page != 0) {
return NO_SUCH_PAGE;
}

mas ele fica imprimindo sem fim.
Fui depurar e a variável texto é preenchida com todo conteúdo que veio do arquivo txt, então esse não é o problema…

Alguma sugestão pessoal ?

T

O Java Print Service não consegue imprimir diretamente arquivos PDF. Uma forma de fazer isso é usar alguma biblioteca, e outra é chamar o próprio Adobe Reader e solicitar que ele imprima o arquivo .pdf para você; procure por “pdf print java” no Google.

RichardVaugh

Valeu thingol ! Obrigado !
Ótima idéia !
Encontrei bastante coisa sobre essa forma de impressão.

Consegui resvolver o problema também com a classe JRPrintServiceExporter do iReport.

Depois vou analisar as duas formas e ver qual fica melhor.

abraço .

gilberto_oliveira

RichardVaugh :
Valeu thingol ! Obrigado !
Ótima idéia !
Encontrei bastante coisa sobre essa forma de impressão.

Consegui resvolver o problema também com a classe JRPrintServiceExporter do iReport.

Depois vou analisar as duas formas e ver qual fica melhor.

abraço .

Poderia postar um código ? estou com o mesmo problema.

Obrigado.

T

http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html#print(java.io.File)

gilberto_oliveira

Certo, obrigado… mas digamos que eu queira selecionar a impressora via JPS. Seria possível?
É que preciso deixar a impressora padrão do programa configurável (pra poder ser diferente da padrão do sistema) - está confuso?

Criado 18 de março de 2009
Ultima resposta 7 de abr. de 2009
Respostas 6
Participantes 3