Avatar billede cybershah Nybegynder
09. juni 2005 - 16:59 Der er 22 kommentarer og
1 løsning

udskrivning på en matrixprinter!

Jeg har tidligere fået hjælp til at udskrive fra et JTextArea til fysisk printer: http://eksperten.dk/spm/622472
Løsningen har været god nok indtil jeg fik en matrix printer (bonprinter), som skal udskrive ordre fra den samme JTextArea.
For at se hvad der skulle indstilles for at få et pæn udskrift, har jeg først prøvet at udskrive til bonprinteren fra WordPad og det er der ingen problemer i.
Følgende skal tilpasses:
Margenen skal fra venstre være 4 mm og fra højre 0 mm.
Skrifttypen skal også skiftes til 12 cpi (dette kom ind i skrifttyperne, efter jeg installerede printeren)
Papiret skal også sættes til Receipt under papirtype.

Spørgsmålet er så hvordan jeg skal implementere disse i java? Jeg har prøvet følgende.
GUI klassen hvor JTextArea bliver initaliseret:

Font generelFont = new Font("12 cpi", Font.PLAIN, 12);
       
orderArea = new JTextArea();
orderArea.setBounds(0,70,300,300);
orderArea.setFont(generelFont);
orderArea.setMargin(new Insets( 0, 0, 0, 0 ) );

Der må så siges at selvom jeg skriver fontets navn, kommer der ingen ændringer! Hvis jeg skifter til fx Arial eller Verdana, skifter skrifttypen, men ikke når jeg har 12 cpi stående der!

I min printklasse har jeg følgende kode:


package View;

import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.text.BadLocationException;

public class PrintClass implements Printable{

    private PrinterJob job;
    private int numberOfPages = 1;
    GUI myGUI;
   
    public PrintClass(GUI myGUI)
    {
        this.myGUI = myGUI;
    }
   
    public void doPrintJob(java.awt.event.ActionEvent evt)
    {
        job = PrinterJob.getPrinterJob();
        job.setPrintable(this);

        try
        {
            System.out.println("Forsøger print");
            job.print();
        }
        catch(PrinterException p){p.printStackTrace();}
    }
       
   
    public int print(Graphics arg0, PageFormat arg1, int arg2) throws PrinterException
    {
        Paper myPaper = new Paper();
        myPaper.setSize(0.5, 1.7);
        arg1.setPaper(myPaper);
       
        if(arg2 >= 0 && arg2 < numberOfPages)
        {
            arg0.translate( (int)arg1.getImageableX(), (int) arg1.getImageableY());
            try{                                       
                    int lineHeight = myGUI.getOrderArea().modelToView(0).height;
                    int h = 10;
                   
                   
                    for(int i = 0; i < myGUI.getOrderArea().getLineCount(); i++)
                    {
                        int x = myGUI.getOrderArea().getLineStartOffset(i);
                        int y = myGUI.getOrderArea().getLineEndOffset(i);
                        arg0.drawString( myGUI.getOrderArea().getText(x, y-x ) , 10, (h += lineHeight));
                    }
                }
                catch (BadLocationException i){i.printStackTrace();}
           
                return Printable.PAGE_EXISTS;
        }

        return Printable.NO_SUCH_PAGE;
    }
}
   

Det styk af koden, hvor jeg prøver på at angive papirtype, virker heller ik! Hver gang jeg udskriver fra mit java program, bliver teksten udskrevet med noget mere eller mindre skæv og uklar skrifttype og teksten kommer i midten af papiret, hvilket er ik mere end 3-4cm lang! Altså jeg får ik en gang halvdelen af linierne med! Dvs. margin ændringen i min GUI klasse, har ingen indflydelse!

Jeg mener selv at jeg på en eller måde skal justere papirets (tekstens) margin fra printklassen! Og ang skriften, kunne jeg også godt tænke mig at vide, hvordan jeg kan fortælle den, at jeg vil bruge "12 cpi"!
Eller gemme det valgte tekst i en rtf format og så udskrive det derfra?!? (det ved jeg ik helt hvordan man gør!)

Evt. et helt nyt forslag til den måde jeg udskriver, vil også være dejligt!
Da det her kan være lidt af en udfordring, giver jeg 110 til det rigtige svar! :-)
Avatar billede _carsten Nybegynder
12. juni 2005 - 14:15 #1
Når du skriver bonprinter, betyder det så at papiret ikke har samme længe hver gang ?

Hvad er papirbredden i millimeter ?
Hvad er papirlængden (hvis samme hver gang) ?
Avatar billede cybershah Nybegynder
12. juni 2005 - 23:31 #2
bredden er 76,2 mm og længden vil jo være afhængig af teksten..

Da det her handler om at udskrive karakter, så har jeg faktisk fundet følgende på nettet: http://www.java4less.com/textprinter/index.html
Men problemet er, at det kun er til matrix printer med parallel tilslutning og min printer kører med USB!
Avatar billede _carsten Nybegynder
13. juni 2005 - 08:28 #3
Sådan definerer du papiret

        // DU ER NØDT TIL AT GENNEMLØBE DEN TEKST SOM SKAL UDSKRIVES
        // FOR AT FINDE UD AF HVOR LANG SIDEN SKAL VÆRE
        // HER HAR JEG VALGT AT SÆTTE DEN TIL 100 MM
    // HUSK LIGE AT SÆTTE TOP OG BUND MARGIN


    public void doPrintJob(java.awt.event.ActionEvent evt)
    {

        double mm = (72/25.4);
               
    double margin = 4 * mm;
    double width = 76.2 * mm;
    double height = 100 * mm;
       
    Paper paper = new Paper();
    PageFormat pageFormat = new PageFormat();
       
    paper.setSize( width, height);
    paper.setImageableArea(0 + margin, height, width - margin ,height);
    pageFormat.setPaper(paper);
               
        job = PrinterJob.getPrinterJob();
        job.setPrintable(this, pageFormat);
       
        try
        {
            System.out.println("Forsøger print");
            job.print();
        }
        catch(PrinterException p){p.printStackTrace();}
    }
     

Og så skal du selvfølgelig rydde op i din print() m.h.t. Paper

M.h.t. matrix/parallel/USB kan jeg ikke lige se det skulle være et problem !?
Avatar billede cybershah Nybegynder
13. juni 2005 - 23:52 #4
Mange tak for indlægget.. Nu bliver udskriften placeret meget bedre på papiret. Jeg kan stadig ikke få det rigtige font skrevet ud! Selvom jeg har
Font generelFont = new Font("12 cpi", Font.PLAIN, 12); i min GUI, kan den ikke rigtig finde ud af det! Er det fordi at jeg skal finde et systemnavn på 12 cpi?! Når jeg vælger 12 cpi i fx word eller wordpad, bliver teksten udskrevet med det bedste kvalitet! Men 12 cpi og de andre lignende fonts er ikke i min font mappe og i fx word's font menu, er der et printer ikon ved 12 cpi, hvorimod der er almindelige fonts ikoner ved de andre skrifttyper.. jeg har forgæves googlet i timevis!!
Avatar billede _carsten Nybegynder
14. juni 2005 - 10:45 #5
Så vidt jeg husker m.h.t matrixprinter, så er de 12 cpi noget du indstiller på printeren

Hvilken matrixprinter er det ??
Avatar billede _carsten Nybegynder
14. juni 2005 - 10:46 #6
Så kunne jeg måske være heldig at finde en driver til den og teste det.
Avatar billede cybershah Nybegynder
14. juni 2005 - 17:22 #7
det er en CBM CD-S500. Du kan finde driveren her:
http://www.jcbm.co.jp/eng/printer/driver/index.html

problemet er bare at du skal registrere dig.. hvis du kunne gi mig en mail adresse, så kan jeg sende den til dig! Men det der registrering er ret formelt, så du kan bare skrive nogle fiktive oplysninger..
Avatar billede cybershah Nybegynder
14. juni 2005 - 17:39 #8
I WordPad kan jeg sagtens vælge skrifttypen 12 cpi og så udskriver printeren med det bedste kvalitet, men jeg skal også på en eller anden måde kunne bruge skrifttypen i java?
Avatar billede cybershah Nybegynder
14. juni 2005 - 18:19 #9
med denne metode kan jeg se alle mine fonts, men printer fonts (såsom 12 pci osv) er ikke med her! så jeg tror man ska få adgang til dem på en anden måde:

GraphicsEnvironment graphic = GraphicsEnvironment.getLocalGraphicsEnvironment()
            String[] fonts = graphic.getAvailableFontFamilyNames() ;
            for (int i=0;i<l.length;i++) System.out.println(fonts[i]);
Avatar billede cybershah Nybegynder
14. juni 2005 - 18:21 #10
rettelse:

med denne metode kan jeg se alle mine fonts, men printer fonts (såsom 12 cpi osv) er ikke med her! så jeg tror man ska få adgang til dem på en anden måde:

public static void main(String args[])
    {
GraphicsEnvironment graphic = GraphicsEnvironment.getLocalGraphicsEnvironment();
          String[] fonts = graphic.getAvailableFontFamilyNames() ;
    for (int i=0;i<fonts.length;i++) System.out.println(fonts[i]);
    }
Avatar billede _carsten Nybegynder
14. juni 2005 - 21:34 #11
Du får kun system fonte med den metode.

Jeg henter driveren og ser hvad jeg kan finde ud af (er ikke meget for at slippe min mail adr. løs herinde)

Vender nok ikke tilbage før i morgen.
Avatar billede cybershah Nybegynder
20. juni 2005 - 18:49 #12
Hej igen Carsten. Jeg ved ik om du har hentet driver'en, men jeg kan evt. lægge den på en server, så du kan hente den derfra. Jeg mener man på en eller anden måde skal finde frem til printerfontets navn, som åbenbart ikke er "12 pci".
Tak for hjælpen indtil videre...
Avatar billede _carsten Nybegynder
20. juni 2005 - 22:06 #13
Jeg har hentet driveren og jeg har også kigget lidt på det, selvom det ikke er meget.

Spørgsmålet er om jeg har hentet den rigtige driver, jeg får nemlig ikke mulighed for at vælge 12 cpi i Wordpad.

Har hentet følgende zip fil:  Release050214E.zip

Og installeret driveren til:  CBM CD-S500

Hvis det ikke er identisk med din, må du gerne lægge den til download.


12 cpi = 12 Characters Per Inch
(Printeren skriver med den valgte font 12 karakterer pr. tomme)
Avatar billede cybershah Nybegynder
20. juni 2005 - 23:38 #14
ja den er nemlig lidt tricky i word! Det er fordi at der er et lille bug, tror jeg! Du skal nemlig først lige markere din tekst, udskrive én gang, og derefter vil fontene komme frem..
ellers er det den rigtige pakke du har fået hentet!
Avatar billede cybershah Nybegynder
20. juni 2005 - 23:39 #15
ps. jeg mente wordpad!
Avatar billede cybershah Nybegynder
23. juni 2005 - 13:57 #16
Hej igen Carsten! Kan du se CPI fontene i wordpad nu!?
Avatar billede cybershah Nybegynder
24. juni 2005 - 14:45 #17
Endnu en gang, hej Carsten! ;-)
Jeg har nu findet et kode eksempel på dette problem, men koden er skrevet i VisualBasic, så jeg kan ik helt se hvordan det her kan lade sig gøre i JAVA. Tænkte at du måske kan gennemskue det:

12. Example of program by Visual Basic

Following program list is for “CBM1000 Partial Cut”.
‘Set “CBM1000 Partial Cut“ as default printer driver
Dim X As Printer
For Each X In Printers
If X.DeviceName = “CBM1000 Partial Cut” Then
Set Printer = X
Exit For
End If
Next
‘Printing Windows font”
Printer.FontSize=10
Printer.FontName=”Ariel”
Printer.Print “Font Ariel / Size 10”
‘Printing Printer font
Pritner.FontSize=12
Printer.FontName=”15 cpi”
Printer.Print “15 cpi / Size 12”
‘Printing Barcode
Printer.FontSize=12
Printer.FontName=”Control”
Printer.Print “t” ‘ HRI character under barcode with Font B
Printer.FontSize=42
Printer.FontName=”Code39”
Pritner.Print “ABC123456”
‘Opening cash drawer
Printer.FontSize=12
Pritner.FontName=”Control”
Printer.Print “A” ‘Drawer 1 at 50ms
‘Cutting paper”
Printer.FontSize=12
Pritner.FontName=”Control”
Printer.print “P” ‘Partial cut
‘Printing graphic data from NV memory
Printer.FontSize=12
Pritner.FontName=”Control”
Printer.print “G” ‘Print #1 graphic data in NV memory
Printer.EndDoc

Also you can send commands through driver but it is necessary to choose printer font first.
Pritner.FontSize=12
Printer.FontName=”15 cpi”
Printer.Print CHR$(&H1B) + “V” + CHR$(1) ‘90 degrees right turned.
Printer.Print “15 cpi / Size 12”
Printer.EndDoc
Avatar billede _carsten Nybegynder
24. juni 2005 - 16:23 #18
Jeg har lige kigget på det, og jeg har ingen muligheder for at vælge fonte der hedder noget med 12 cpi eller andet xx cpi for den sags skyld

Jeg tror ikke du fra java kan vælge noget a la cpi, hvis det skal gøres skal det nok være ved hjælp af JNI, men det siger mig ikke ret meget.

Jeg skal nok kigge videre på det, men pt roder jeg dag og nat med SAP, så der er ikke meget tid til java.

Jeg hader Visual Basic - så der kan jeg ikke hjælpe.
Avatar billede cybershah Nybegynder
28. juni 2005 - 13:41 #19
Hej Carsten. Du skal nok huske at vælge CBM printeren som standard printer, for at kunne se fontene i WordPad.
Jeg har kigget MEGET rundt omkring og er nået til følgende:

Printerklassen skal fortælle printeren at den skal bruge printer fontene, som er installeret på computeren. Altså ligesom papirtypen (længde, bredde osv.) som bliver defineret hver gang, skal JAVA sende oplysninger om skrifttyperne. Dette kan bl.a. gøres i printmetoden, hvor man kan skrive arg0.setFont("det rigtige font").
Men jeg kan stadig ikke få adgang til skrifttyperne fra JAVA. Jeg har kontaktet forhandleren og de sagde at det skulle gerne kunne lade sig gøre og de har sendt mig en driver guide link. Her står der meget om skrifttyperne, måske kan det sige dig noget!? Du er velkommen til at kigge:
http://cbma.custhelp.com/cgi-bin/cbma.cfg/php/enduser/fattach_get.php?p_sid=S_QrQ5Jh&p_tbl=10&p_id=567&p_created=1065031138&p_olh=0
Avatar billede cybershah Nybegynder
28. juni 2005 - 15:24 #20
Nu er jeg gået en helt anden vej! Jeg har helt droppet udskrivning fra JAVA og lavet noget helt andet. Jeg gemmer min ønskede tekst i et RTF dokument og her bliver teksten gemt med det ønskede skrifttype (12 cpi).
Spørgsmålet er så om du ved hvordan man kan udskrive derfra via JAVA? Altså jeg klikker på en knap i min GUI, teksten bliver gemt som RTF dokument, og denne skal så bare udskrives??
Avatar billede cybershah Nybegynder
30. juni 2005 - 20:17 #21
hej carsten. jeg har løst problemet på en helt anden måde.. du kan se det her:
http://www.eksperten.dk/spm/629181

send et svar så får du pointene..
Avatar billede _carsten Nybegynder
30. juni 2005 - 20:23 #22
Okay - men max. halvdelen af point, jeg løste ikke hele problemet !
Avatar billede cybershah Nybegynder
02. juli 2005 - 15:21 #23
du får bare det hele.. der var ingen andre herind der kunne hjælpe alligevel!
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