Impressão JAVA em pontos precisos

6 respostas
morgade

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 !

6 Respostas

eduveks

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.

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.

dstori

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.

sergiotaborda

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.

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.

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.

Aqui tem o método pra gerar o pdf, q depois uso pra imprimir... daí cabe vc alterar pra fazer ir pra impressora direto.
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();
}

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:

P

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.

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

Criado 13 de agosto de 2008
Ultima resposta 14 de ago. de 2008
Respostas 6
Participantes 6