2016-04-24 5 views
0

Ich versuche, von meiner Java-Anwendung auf einen Belegdrucker zu drucken, die Breite des Belegs ist 58mm, scheint es, dass der Rand falsch ist und mit einem Rand von 1 Zoll auf jeder Seite. Dies führt dazu, dass nur 3 Buchstaben/Zahlen gedruckt werden und nicht die vollständige Zeile. Ich kann vom Notizblock erfolgreich drucken, da ich den Rand zu 1.97mm auf jeder Seite manuell justiert habe, der den Trick zu tun scheint.Java: Einstellung druckbare Breite (Pageformat)

Mein Code ist wie folgt;

public int print(Graphics g, PageFormat pf, int pageIndex) 
     throws PrinterException { 

    Font font = new Font("MONOSPACED", Font.PLAIN, 10); 
    FontMetrics metrics = g.getFontMetrics(font); 
    int lineHeight = metrics.getHeight(); 
    if (pageBreaks == null) { 
     initTextLines(); 
     int linesPerPage = (int)(pf.getImageableHeight()/lineHeight); 
     int numBreaks = (textLines.length-1)/linesPerPage; 
     pageBreaks = new int[numBreaks]; 
     for (int b=0; b<numBreaks; b++) { 
      pageBreaks[b] = (b+1)*linesPerPage; 
     } 
    } 

    if (pageIndex > pageBreaks.length) { 
     return NO_SUCH_PAGE; 
    } 

    /* User (0,0) is typically outside the imageable area, so we must 
    * translate by the X and Y values in the PageFormat to avoid clipping 
    * Since we are drawing text we 
    */ 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.setFont(new Font("MONOSPACED", Font.PLAIN, 10)); 
    g2d.translate(pf.getImageableX(), pf.getImageableY()); 

    /* Draw each line that is on this page. 
    * Increment 'y' position by lineHeight for each line. 
    */ 
    int y = 0; 
    int start = (pageIndex == 0) ? 0 : pageBreaks[pageIndex-1]; 
    int end = (pageIndex == pageBreaks.length) 
      ? textLines.length : pageBreaks[pageIndex]; 
    for (int line=start; line<end; line++) { 
     y += lineHeight; 
     g.drawString(textLines[line], 0, y); 
    } 

    /* tell the caller that this page is part of the printed document */ 
    return PAGE_EXISTS; 
} 

ich auch dankbar wäre, wenn Sie mich richten Sie den Text auf der rechten Seite des Eingangs mit aus anderen Systemen in Uniform halten helfen könnte, aber mein Hauptproblem ist die Marge, wenn das ich sortiert werden sei über den mond :)

Danke!

p.s. Ich bin neu zum Drucken von Java und habe gekämpft, möglicherweise redundanten Code aus dem Kopieren von Online-Quellen. Ich habe die Schriftart so angepasst, dass sie kleiner ist, das hat nicht viel geholfen.

Antwort

0

Ich habe einen Workaround gefunden, um die gewünschten Ergebnisse zu erzielen, nur Leerzeichen hinzufügen, bevor der Text gut funktioniert, habe ich auch den Code wie folgt angepasst;

public void print() throws PrintException, IOException { 
    String defaultPrinter = 
      PrintServiceLookup.lookupDefaultPrintService().getName(); 
    System.out.println("Default printer: " + defaultPrinter); 
    PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 

    InputStream is = new ByteArrayInputStream(printableAmounts.getBytes("UTF8")); 

    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
    pras.add(new Copies(1)); 

    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
    Doc doc = new SimpleDoc(is, flavor, null); 
    DocPrintJob job = service.createPrintJob(); 

    PrintJobWatcher pjw = new PrintJobWatcher(job); 
    job.print(doc, pras); 
    pjw.waitForDone(); 
    is.close(); 
} 

Scheint eine temporäre Lösung zu sein, aber wenn nichts anderes auftaucht, wird es dauerhaft.