Hallo Wissende
Mit folgendem Code drucke ich an einen Physischen Drucker:
In Linux und Mac (UNIX-Systeme) wird die übergebene Komponente korrek ausgedruckt!
Wo liegt der Fehler, dass in WINDOWS der Ausdruck völlig falsch gedruckt wird?
Ich finde den Fehler nicht!
Wie gesagt: ich bin und werde es bleiben, ein Anfänger.
Obigen code habe ich in openJDK13 gefunden und dank Eurer Hilfe anpassen können.
Was / Wie muss ich da was ändern, dass es auch für Windows passt? (getestet auf win7 und win10)
Soweit reichen meine banalen Kenntnisse nicht.
Vielen Dank!
PS:
Obiger Code druckt sogar auf dem ausgewählten Tray! 😀
Nur die Darstellung des Druckes pass in Windows NICHT!
Mit folgendem Code drucke ich an einen Physischen Drucker:
Java:
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
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 java.util.ArrayList;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaTray;
import javax.print.attribute.standard.PrinterName;
public class DoPrint {
private Component druckKomponente;
int ausgabe = 0;
private Printable prnt = new Printable() {
@Override
public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException {
double gBreite, gHoehe;
double skalierung = 0.0;
if ( pageIndex > 0 ) {
return( NO_SUCH_PAGE );
} else {
//Skalierung*******************************
gBreite = pageFormat.getImageableWidth();
gHoehe = pageFormat.getImageableHeight();
skalierung = gBreite / gHoehe;
//*****************************************
Graphics2D g2d = (Graphics2D)g;
g2d.translate( pageFormat.getImageableX(), pageFormat.getImageableY() );
g2d.scale( skalierung, skalierung );
druckKomponente.paint( g2d );
return( PAGE_EXISTS );
}
}
};
/**
* Drucken einer Komponente
* @param c die Komponente (<i>JPanel, JTextField, usw.</i>)
* @param printer Name des Printers (<i>z.B. Canon_MF720C_Series</i>)
* @param tray Name des Tray aus dem das Papier geladen werden soll.
* @param jobName Information für den Drucker.
* @param l (<i>left</i>) linker Randabstand
* @param t (<i>top</i>) oberer Randabstand
* @param w (<i>width</i>) Breite
* @param h (<i>height</i>) Höhe
*/
public void print(Component c, String printer, String tray, String jobName, double l, double t, double w, double h) {
druckKomponente = c;
PrinterJob printJob = PrinterJob.getPrinterJob();
PrintService drucker = null;
try {
drucker = getPrinter(printer);
printJob.setPrintService(getPrinter(printer));
} catch (PrinterException e) {
e.printStackTrace();
}
PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
if(tray != null) {
if(!tray.equals("")) {
attr.add(getMediaTray(drucker, tray));
}
}
PageFormat pageFormat = new PageFormat();
pageFormat.setOrientation( PageFormat.PORTRAIT ); //Hoch- oder Querformat (Standard: hoch)
double dpFaktor = 72.0;
Paper a4PortraitPaper = new Paper();
final double cm2inch = 0.03937; // = 1 mm
double paperHeight = 297 * cm2inch;
double paperWidth = 210 * cm2inch;
a4PortraitPaper.setSize((paperWidth * dpFaktor), (paperHeight * dpFaktor));
a4PortraitPaper.setImageableArea(l, t, w, h);
pageFormat.setPaper( a4PortraitPaper );
printJob.getJobName().describeConstable();
printJob.setJobName(jobName);
printJob.setPrintable(prnt, pageFormat);
try {
printJob.print(attr);
} catch (PrinterException e) {
// STEP Automatisch generierter Erfassungsblock
e.printStackTrace();
}
// Ruft den printDialog auf !!!!!!!!!! will ich aber nicht!
/*
if ( printJob.printDialog() ) {
try {
printJob.print();
} catch( PrinterException pe ) {
System.out.println( "Error printing: " + pe );
System.out.println( "Error printing (Message): " + pe.getMessage() );
System.out.println( "Error printing (Localized Message): " + pe.getLocalizedMessage() );
System.out.println( "Error printing (Cause): " + pe.getCause() );
}
}
*/
}
private PrintService getPrinter(String printerName) {
AttributeSet aset = new HashAttributeSet();
aset.add(new PrinterName(printerName, null));
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, aset);
for (PrintService service : services) {
if (service.getName().equals(printerName)) {
return service;
}
}
return null;
}
private MediaTray getMediaTray(PrintService printer, String trayName) {
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PAGEABLE;
Object o = printer.getSupportedAttributeValues(Media.class, flavor, null);
if (o != null && o.getClass().isArray()) {
for (Media media : (Media[]) o) {
if (media instanceof MediaTray) {
if(media.toString().equals(trayName)) {
return (MediaTray) media;
}
}
}
}
return null;
}
public ArrayList<String> printerTrays(String printerName) {
ArrayList<String> temp = new ArrayList<>();
AttributeSet aset = new HashAttributeSet();
aset.add(new PrinterName(printerName, null));
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, aset);
for (int i = 0; i < services.length; i++) {
PrintService service = services[i];
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PAGEABLE;
Object o = service.getSupportedAttributeValues(Media.class, flavor, null);
if (o != null && o.getClass().isArray()) {
for (Media media : (Media[]) o) {
if (media instanceof MediaTray) {
temp.add(media.toString());
}
}
}
if(temp.size() <= 0) {
temp.add("Auto");
}
}
return temp;
}
}
In Linux und Mac (UNIX-Systeme) wird die übergebene Komponente korrek ausgedruckt!
Wo liegt der Fehler, dass in WINDOWS der Ausdruck völlig falsch gedruckt wird?
Ich finde den Fehler nicht!
Wie gesagt: ich bin und werde es bleiben, ein Anfänger.
Obigen code habe ich in openJDK13 gefunden und dank Eurer Hilfe anpassen können.
Was / Wie muss ich da was ändern, dass es auch für Windows passt? (getestet auf win7 und win10)
Soweit reichen meine banalen Kenntnisse nicht.
Vielen Dank!
PS:
Obiger Code druckt sogar auf dem ausgewählten Tray! 😀
Nur die Darstellung des Druckes pass in Windows NICHT!