Avatar billede dennism Nybegynder
27. marts 2007 - 16:03 Der er 20 kommentarer og
1 løsning

Java: Udskrift til bonprinter

Jeg er igang med at skrive et program, som skal kunne udskrive kvitteringer på en Epson-termoprinter - altså en bon-printer som man kender fra supermarkedet.

Jeg har denne mappe, hvor jeg har uploade lidt forskelligt:
http://demaweb.dk/print/

Jeg har fået Windows til at udskrive en test-side af printeren, det gav følgende resultat:
http://demaweb.dk/print/001.jpg

Dernæste har jeg skrev et lille simpelt Java-program:
http://demaweb.dk/print/Main.java
http://demaweb.dk/print/ToPrinter.java

Ved kørsel af Main får jeg denne udskrift:
http://demaweb.dk/print/002.jpg

Jeg er desværre ikke helt tilfreds med denne.
For det første vil jeg gerne have, at "grafikken" starter helt oppe i toppen af siden. Desuden ser det ud til, at der er en meget stor margen, da min rektangel plus tekst stopper langt fra den højre side.

Håber der er nogen, som kan hjælpe mig med disse små problemer?
Avatar billede dennism Nybegynder
28. marts 2007 - 14:40 #1
Ingen der kan hjælpe her?
Avatar billede _carsten Nybegynder
29. marts 2007 - 22:40 #2
Sådan kommer du videre

    public static void main(String[] args) {
        PrinterJob job = PrinterJob.getPrinterJob();

        // Hent default pageformat fra windows standardprinter
        PageFormat pf = job.defaultPage();
        Paper pa = new Paper();
       
        // Gør hele papiret skrivbart - IKKE sikkert printeren kan skrive i fuld bredde
        pa.setImageableArea(0, 0, p.getWidth(), p.getHeight());
        pf.setPaper( pa );
       
        ToPrinter tp = new ToPrinter();
       
        // Brug papirformat til printjob
        job.setPrintable(tp, pf);
       
        try{
            job.print();
        }
        catch (PrinterException p){
            p.printStackTrace();
        }
    }
Avatar billede _carsten Nybegynder
29. marts 2007 - 22:43 #3
Hov en lille bøf - brug denne

    public static void main(String[] args) {
        PrinterJob job = PrinterJob.getPrinterJob();

        // Hent default pageformat fra windows standardprinter
        PageFormat pf = job.defaultPage();
        Paper pa = new Paper();
       
        // Gør hele papiret skrivbart - IKKE sikkert printeren kan skrive i fuld bredde
        pa.setImageableArea(0, 0, pf.getWidth(), pf.getHeight());
        pf.setPaper( pa );
       
        ToPrinter tp = new ToPrinter();
       
        // Brug papirformat til printjob
        job.setPrintable(tp, pf);
       
        try{
            job.print();
        }
        catch (PrinterException p){
            p.printStackTrace();
        }
    }
Avatar billede dennism Nybegynder
05. april 2007 - 17:40 #4
Tak for svaret!

Ved at bruge den kode, får jeg nu følgende udskrift:
http://demaweb.dk/print/003.JPG

Som du kan se, så mangler den venstre del af kassen. Hvordan kan det være? Har prøvet at ændre de to første variabler i setImageableArea, det hjælper ingen ting.
Avatar billede _carsten Nybegynder
05. april 2007 - 22:26 #5
De færreste printere kan skrive helt ud til kanten af papiret, de skal bruge en del af papirbredden til at trække papiret igennem printeren, og for mig at se mangler der 3-4 mm

Du kan enten flytte 'x' på din drawRect eller gøre dit imageableArea det mindre

eks:
int mm = (int)(72/25.4); // Omsæt dots til millimeter

g2.drawRect(mm*4,0,150,50); // flyt 'x' 4 millimeter ind

eller:
pa.setImageableArea(mm*4, 0, pf.getWidth() - (mm*8), pf.getHeight());
Avatar billede dennism Nybegynder
05. april 2007 - 23:04 #6
Jeg har nu denne del:

        int mm = (int)(72/25.4); // Omsæt dots til millimeter
        pa.setImageableArea(mm*4, 0, pf.getWidth() - (mm*8), pf.getHeight());
        pf.setPaper(pa);

Jeg får stadig samme resultat som på billede 3:
http://demaweb.dk/print/003.JPG

Det er som om, at setImageableArea ikke ændrer på noget?
Avatar billede _carsten Nybegynder
06. april 2007 - 11:02 #7
Hvad for du ud af det her ???

package print;

import java.awt.print.PrinterException;
import javax.print.PrintService;

public class Main {

    public static void main(String[] args) {
        PrinterJob job = PrinterJob.getPrinterJob();

        // Hent default pageformat fra windows standardprinter
        PageFormat pf = job.defaultPage();
        Paper pa = new Paper();
       
        // Gør hele papiret skrivbart - IKKE sikkert printeren kan skrive i fuld bredde
        pa.setImageableArea(0, 0, pf.getWidth(), pf.getHeight());
        pf.setPaper( pa );
       
        PrintService p = job.getPrintService();
       
        ToPrinter tp = new ToPrinter(p.getName());
       
        // Brug papirformat til printjob
        job.setPrintable(tp, pf);
       
        try{
            job.print();
        }
        catch (PrinterException p){
            p.printStackTrace();
        }
    }
}





package print;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.Font;

class ToPrinter() implements  Printable{

    public ToPrinter(String dfPrinter){
        this.df = dfPrinter;
    }
   
    public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
        if(pageIndex == 1) return NO_SUCH_PAGE;
       
        Graphics2D g2 = (Graphics2D)g;
        g2.setFont(new Font("Serif", Font.BOLD, 7));
       
        g2.translate((int)pf.getImageableX(), (int)pf.getImageableY());
        g2.drawRect(0,0,150,50);
        g2.drawString( df, 10, 10);
        g2.drawString( "Papirbredde i mm: " + (int)( (pf.getWidth() / 72) * 25.4), 10, 25 );

        return PAGE_EXISTS;
    }
   
    private String df
}
Avatar billede dennism Nybegynder
06. april 2007 - 12:19 #8
Jeg har opdateret de to java-filer, så du kan se det præcise program:
http://demaweb.dk/print/Main.java
http://demaweb.dk/print/ToPrinter.java

Jeg får denne udskrift:
http://demaweb.dk/print/004.jpg

Som du kan se, er den stadig ikke helt god :(
Avatar billede _carsten Nybegynder
06. april 2007 - 12:27 #9
Nej - det er den ikke, den må åbenbart skrive venstre del af dit rect lige på kanten af imageableArea og det forstår jeg ikke lige hvorfor.

Prøv lige en af følgende

g2.drawRect(1,0,150,50);

eller
g2.drawRect(2,0,150,50);

eller
g2.drawRect(3,0,150,50);
Avatar billede _carsten Nybegynder
06. april 2007 - 12:30 #10
Har målt papirbredden ???

Er den 79 mm, det er ikke sådan at den rent fysisk er 80 mm ????

Hvilken dpi kører printeren med ??
Avatar billede _carsten Nybegynder
06. april 2007 - 14:06 #11
Det jeg kan finde ud af om den printer er følgende

1. Printer med 180 dpi
2. Papirbredde 79,5 mm +/- 0,5
3. Skrivebredden er 72 mm (d.v.s margin = 4,0 mm i begge sider)



Jeg er ikke helt sikker, men prøv lige den her:

måske skal du ændre denne: int mm = (int)Math.ceil(180/25.4);
                      til: int mm = (int)Math.ceil(72/25.4);

Et af 2 bør virke!


public class Main {

    public static void main(String[] args) {
        PrinterJob job = PrinterJob.getPrinterJob();

        // Hent default pageformat fra windows standardprinter
        PageFormat pf = job.defaultPage();
        Paper pa = new Paper();
       
        int mm = (int)Math.ceil(180/25.4);
       
        pa.setImageableArea(mm * 4,mm * 4, mm * 72, pf.getHeight());
        pf.setPaper( pa );
       
        PrintService p = job.getPrintService();
       
        ToPrinter tp = new ToPrinter(p.getName());
       
        // Brug papirformat til printjob
        job.setPrintable(tp, pf);
       
        try{
            job.print();
        }
        catch (PrinterException p){
            p.printStackTrace();
        }
    }
}
Avatar billede dennism Nybegynder
06. april 2007 - 15:47 #12
Min lineal siger, at papiret er 79,5mm. Overstående main giver stadig samme som tidligere. Hvis jeg måler marginen ser det ud til, at den er 3mm.

Printeren jeg arbejder med, er helt præcist en Epson TM-T88IIP.

Ved at ændre til g2.drawRect(1,0,150,50) ser det straks bedre ud. Jeg kan nu se hele rektanglen. Er det måden at gøre det på?
Avatar billede _carsten Nybegynder
06. april 2007 - 16:08 #13
Tja, hvis læser doc til drawRect (Draws the outline of the specified rectangle) så tegnes omridset af et rect.

Det læser jeg som om at stregen faktisk tegnes i x/y -1,-1

Du kan jo prøve at ændre stregtykkelse, dit rect har garanteret samme indvendige mål, så man skal altså lave plads til stregen

Prøv selv:

        Graphics2D g2 = (Graphics2D)g;
        g2.setFont(new Font("Serif", Font.BOLD, 7));
        g2.setStroke(new new BasicStroke(3f));
Avatar billede _carsten Nybegynder
06. april 2007 - 16:09 #14
g2.setStroke(new BasicStroke(3f));
Avatar billede _carsten Nybegynder
06. april 2007 - 19:30 #15
Jeg vil tillade mig at lægge et svar.
Avatar billede dennism Nybegynder
17. april 2007 - 09:52 #16
Jeg forsøger nu at sidde og udskrive med dette program på en PDF-printer på mit Linux-system. Der bliver gemt en PDF-fil når jeg udskriver med programmet, men filen har ikke noget indhold. Ved du umiddelbart, hvad det kan skyldes?
Avatar billede _carsten Nybegynder
17. april 2007 - 19:00 #17
Nej det ved jeg ikke, jeg bruger selv CutePDF Writer til den slags, hvad bruger du
Avatar billede dennism Nybegynder
30. april 2007 - 15:16 #18
Undskyld jeg forstyrrer igen, men har du en smart måde hvorpå man kan højrecentrere en string man laver med g2.drawString?
Avatar billede _carsten Nybegynder
30. april 2007 - 21:09 #19
Ja - mål længden af din tekst og træk den fra dit startpunkt


String text = "XXXXXX";
int x = 100;
int y = 100;

TextLayout layout = new TextLayout(text, g2.getFont(), g2.getFontRenderContext());

g2.drawString( text, x - layout.getAdvance(), y );
Avatar billede dennism Nybegynder
30. april 2007 - 21:32 #20
Problemet er, at denne tekst er variabel pga. at den indeholder en dynamisk tekst. Kan man ikke udfra hvor mange tegn der er i en string beregne hvor meget den fylder og trække det fra?
Avatar billede _carsten Nybegynder
30. april 2007 - 22:13 #21
Nej det kan du ikke, et 'i' fylder mindre i længden end et 'm'.

Alternativt kan du smide din tekst i et char array og beregne hvert enkelt bogstav
og enten konvertere dit array til en ny String eller benytte drawChars() til at
skrive teksten med.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester