Impressão JAVA em pontos precisos

Descobri o inferno que é a API de impressão do Java.
Preciso imprimir dados a partir de uma folha em pontos precisos.
Exemplo: Imprimir um texto a 20mm da borda do esquerda papel.
O problema é que por mais que eu faça cálculo de pixel X DPI, o texto não sai no lugar desejado (e ainda varia entre impressoras)
Se alguém tiver um exemplo de como imprimir algo num ponto fixo de uma folha (a Xmm da borda esquerda e Ymm da borda superior) eu agradeceria muito !

e vc consegue esta mesma precisão com algum programa gráfico!? Como Ilustrator, Corel, InDesign, FreeHand, etc…?

é q a precisão nas bordas varia de impressora para impressora, ou seja os limites de impressão não são iguais em todas as impressoras.

por isso acho que vc esta tentando imprimir em zonas que não são suportadas em todas as impressoras.

eu já fiz geração de etiquetas, imprimindo em papel próprio para etiquetas, ou seja q tem as áreas bem definidas, e consegui fazer bem isto, lembro que não tive muitas dificuldades, e já faz um bom tempo, no JDK 1.4.

O local especificado da impressão é afastado da borda.
A diferença do lugar definido no código para o que é gerado é de pelo menos uns 4 mm. Ficam bem desalinhado e diferente por impressora.
Se você tiver algum exemplo do que fez eu agradeceria muito.

Programas gráficos conseguem sim. Podem ficar desalinhadosem diferentes impressoras, mas não passa de 1mm.

Eu recomendo que você gere uma imagem do relatório (Graphics) e depois mande pra impressora.
Sendo uma imagem, tende a manter o mesmo padrão.

[quote=morgade]O local especificado da impressão é afastado da borda.
A diferença do lugar definido no código para o que é gerado é de pelo menos uns 4 mm. Ficam bem desalinhado e diferente por impressora.
Se você tiver algum exemplo do que fez eu agradeceria muito.

Programas gráficos conseguem sim. Podem ficar desalinhadosem diferentes impressoras, mas não passa de 1mm.[/quote]

Impresoara têm uma coisas chamada margem. Quando vc diz que quer imprimir a 3 mm do dado esquerdo isso significa na posição margem_esquerda+3mm As margens podem ser consultadas pelo API de impressão se não me falha a memoria.
Existe um limite fisico em algumas impressoras que não permite que a margem seja menor que um certo valor, mas ela é configurável em geral. Ou seja, quando imprimir, tem que ter em atenção as margens.

Tarde!
Vc já deu uma conferida no iText? Eu uso e é muito fácil de trabalhar. Tenho q preencher um formulário, gerar um pdf e retornar pro usuário.

Aqui tem o método pra gerar o pdf, q depois uso pra imprimir… daí cabe vc alterar pra fazer ir pra impressora direto.

[code]public byte[] gerarImpressao() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, baos);

// aqui tenho as medidas da pagina pra encaixar o formulario
float IMAGEM_FUNDO_WIDTH = document.getPageSize().getWidth();
float IMAGEM_FUNDO_HEIGHT = document.getPageSize().getHeight();

// abre o documento pra começar a montagem
document.open();

PdfContentByte contentByte = writer.getDirectContent();

// carregando o gif de fundo
Image fundo = Image.getInstance("formulario.gif");
fundo.scaleToFit(IMAGEM_FUNDO_WIDTH, IMAGEM_FUNDO_HEIGHT);]
fundo.setAbsolutePosition(0, 0);

// define as medidas pro template usar o gif
PdfTemplate template = contentByte.createTemplate(IMAGEM_FUNDO_WIDTH, IMAGEM_FUNDO_HEIGHT);
template.addImage(fundo);

// cria a página no documento
document.newPage();

// insire o template e posiciona
contentByte.addTemplate(template, document.left()-25, document.top()-760);

// define a fonte a ser usada
BaseFont bfTextoSimples = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);

// abre a insercao de texto e insire a fonte do documento
contentByte.beginText();
contentByte.setFontAndSize(bfTextoSimples, 6);

// define o posicionamento na tela por uma matriz de pixels e escreve o texto
contentByte.setTextMatrix(21,735);
contentByte.showText("ESCRITA");

// encerra o texto da página
contentByte.endText();
 
// fecha o documento
document.close();

// retorno o meu array de bytes pra gerar o pdf
return baos.toByteArray();

}[/code]

Eu uso isso combinado num try catch finally pra tratar as excessoes e depois fechar o baos. Bastante simples e prático, espero q ajude :thumbup:

[quote=Gobain]Tarde!
Vc já deu uma conferida no iText? Eu uso e é muito fácil de trabalhar. Tenho q preencher um formulário, gerar um pdf e retornar pro usuário.

[/quote]

Na mesma linha, mas usando XSL-FO como template, tem o FOP