Vielen Dank.
Habe ich jetzt korrigiert.
Das Problem ist aber, dass er mir für ein C5 Couvert >pageFormat.getImageableY() = 5.2501679999999995< auf der Basis eines A4 Dokuments ausrechnet:
Druckbeginn: (abbildbarer Bereich)
(1107 [A4-abbildbaren Bereich Höhe] /2)-(850 [C5-abbildbaren Bereich Breite] /2)-5.2501679999999995 [pageFormat.getImageableY()]
Was, wo muss ich im folgenden Code etwas ändern, dass pageFormat.getImageableY() = 5 auch auf einem C5 Couvert effektiv an der gewünschten Position pageFormat.getImageableY() liegt und nicht von der Mitte eines A4 nach oben gerechnet wird?:
[CODE=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.HashMap;
import java.util.Map.Entry;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.Attribute;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.MediaTray;
import javax.print.attribute.standard.PrinterName;
import javax.swing.RepaintManager;
public class DoPrint {
private Component druckKomponente;
int ausgabe = 0;
private Printable prnt = new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
double gBreite, gHoehe;
double faktor = 0.0;
if ( pageIndex > 0 ) {
return(NO_SUCH_PAGE);
} else {
//Skalierung*******************************
gBreite = pageFormat.getImageableWidth();
gHoehe = pageFormat.getImageableHeight();
faktor = gBreite / druckKomponente.getWidth();
if(ausgabe == 0) { //sonst wird es 3x Ausgeworfen
ausgabe++;
System.out.println("druckKomponente.getWidth() = "+druckKomponente.getWidth()+"\tgBreite = "+gBreite);
System.out.println("druckKomponente.getHeight() = "+druckKomponente.getHeight()+"\tgHoehe = "+gHoehe);
System.out.println("faktorH = "+faktor);
System.out.println("pageFormat.getImageableX() = "+pageFormat.getImageableX());
System.out.println("pageFormat.getImageableY() = "+pageFormat.getImageableY());
System.out.println("------------------------------------------------------------------\n");
}
//*****************************************
Graphics2D g2d = (Graphics2D)graphics;
g2d.translate((pageFormat.getImageableX()), pageFormat.getImageableY() );
// Habs für ISO_C5 auch mit folgender Zeile versucht -> OHNE ERFOLG
// g2d.translate((pageFormat.getImageableY()), (pageFormat.getImageableX()) );
g2d.scale( faktor, faktor );
disableDoubleBuffering( druckKomponente );
druckKomponente.paint( g2d );
enableDoubleBuffering( druckKomponente );
return(PAGE_EXISTS);
}
}
};
/**
* Drucken einer Komponente
* @param c die Komponente (<i>JPanel, JTextField, usw.</i>) proportional zu <b>ISO_XX</b>
* @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 isoTyp -> A4, C5, usw.
* @param jobName Information für den Drucker.
*/
public void print(Component c, String printer, String tray, String isoTyp, String jobName) {
//aktClassDo 000-😈️ AUS- / EIN-Kommentieren
//Wirft alle verfügbaren Attributs des gewählten Druckers (printer) aus.
// System.out.println("\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
// PrintService[] MetaPrinter = PrintServiceLookup.lookupPrintServices(null, null);
// for (PrintService service : MetaPrinter) {
// if(service.getName().equals(printer)) {
// Class<?>[] allAtributs = service.getSupportedAttributeCategories();
// for(Class<?> c1: allAtributs) {
// System.out.println(c1.getTypeName());
// }
// break;
// }
// }
// System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");");
druckKomponente = c;
ausgabe = 0;
System.out.println("Drucke ein "+isoTyp);
//🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️ Attribute Methode-Interne KLASSE 🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭
HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet() {
private static final long serialVersionUID = 1L;
HashMap<Class<?>, Attribute> map = new HashMap<>();
@Override
public Attribute[] toArray() {
Attribute[] s = new Attribute[map.size()];
map.values().toArray(s);
return s;
}
@Override
public int size() {
return map.size();
}
@Override
public boolean remove(Attribute attribute) {
for (Entry<Class<?>, Attribute> e : map.entrySet()) {
if (e.getValue() == attribute) {
map.remove(e.getKey());
return true;
}
}
return false;
}
@Override
public boolean remove(Class<?> category) {
map.remove(category);
return true;
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public Attribute get(Class<?> category) {
return map.get(category);
}
@Override
public boolean containsValue(Attribute attribute) {
return map.containsValue(attribute);
}
@Override
public boolean containsKey(Class<?> category) {
return map.containsKey(category);
}
@Override
public void clear() {
map.clear();
}
@Override
public boolean addAll(AttributeSet attributes) {
return false;
}
@Override
public boolean add(Attribute attribute) {
if (attribute.getClass().toString().toLowerCase().contains("custom")) {
map.put(Media.class, attribute);
} else {
map.put(attribute.getClass(), attribute);
}
return true;
}
};
//🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️ FERTIG Attribute SETZEN 🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭️🇨🇭
//aktClass 01-✔️ Media-Name/-Size SETZEN
double mm2inch = 0.03937; // = 1 mm
double px2inch = 0.010417;
double paperHeight = 0.0;
double paperWidth = 0.0;
double dpFaktor = 72.0;
Paper paper = new Paper();
double neux = (druckKomponente.getX()*px2inch)*dpFaktor;
double neuy = (druckKomponente.getY()*px2inch)*dpFaktor;
double neuw = (druckKomponente.getWidth()*px2inch)*dpFaktor;
double neuh = (druckKomponente.getHeight()*px2inch)*dpFaktor;
paper.setImageableArea(neux, neuy, neuw, neuh);
PrinterJob printJob = PrinterJob.getPrinterJob();
PrintService drucker = null;
try {
drucker = getPrinter(printer);
printJob.setPrintService(getPrinter(printer));
} catch (PrinterException e) {
e.printStackTrace();
}
MediaSizeName msnISO = null;
//Alle Print-Medien werden Hochformatig im Drucker eingelegt! (PageFormat.PORTRAIT)
//d.H. sie werden alle an der schmalen Seite eingezogen.
int orientation = PageFormat.PORTRAIT;
switch (isoTyp) {
case "A0":
msnISO = MediaSizeName.ISO_A0;
break;
case "A1":
msnISO = MediaSizeName.ISO_A1;
break;
case "A2":
msnISO = MediaSizeName.ISO_A2;
break;
case "A3":
msnISO = MediaSizeName.ISO_A3;
break;
case "A4":
msnISO = MediaSizeName.ISO_A4;
paperWidth = 210 * mm2inch;
paperHeight = 297 * mm2inch;
break;
case "A5":
msnISO = MediaSizeName.ISO_A5;
break;
case "C5":
msnISO = MediaSizeName.ISO_C5;
paperWidth = (229 * mm2inch);
paperHeight = (162 * mm2inch);
// orientation = PageFormat.LANDSCAPE;
// paperWidth = (162 * mm2inch);
// paperHeight = (229 * mm2inch);
break;
case "A6":
msnISO = MediaSizeName.ISO_A6;
break;
case "A7":
msnISO = MediaSizeName.ISO_A7;
break;
}
set.add(msnISO);
paper.setSize((paperWidth * dpFaktor), (paperHeight * dpFaktor));
//aktClass 02-✔️ tray für Druckr SETZEN
if(tray != null && !tray.equals("")) {
set.add(getMediaTray(drucker, tray));
}
PageFormat pageFormat = new PageFormat();
//aktClass 03-✔️ Hoch/Quer-Format SETZEN
pageFormat.setOrientation( orientation ); //Hoch- (1) oder Querformat (0) (Standard: hoch)
//aktClass 04-✔️ Imageable-Area SETZEN
pageFormat.setPaper(paper);
printJob.getJobName().describeConstable();
printJob.setJobName(jobName);
printJob.setPrintable(prnt, pageFormat);
try {
printJob.print(set);
} catch (PrinterException e) {
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 static void disableDoubleBuffering( Component c ) {
RepaintManager currentManager = RepaintManager.currentManager( c );
currentManager.setDoubleBufferingEnabled( false );
}
public static void enableDoubleBuffering( Component c ) {
RepaintManager currentManager = RepaintManager.currentManager( c );
currentManager.setDoubleBufferingEnabled( true );
}
}[/CODE]
In den Drucker-Einstellungen sowohl Lokal (Treiber) wie auch auf der Geräte-Webseite hat das "Mehrzweck Papierfach" als default ein C5-Medium und trotzdem wird das Y anhand eines (A4-Höhe / 2) - (C5-Breite / 2) im obigen Code, berechnet!
Wie schon in der Bibel steht:
Wissende vergebt mir, denn ich weiss NICHT was ich tu! 😁
(oder so ähnlich)
Sorry wieder ein PS:
LibreOffice, MasterPdf-Editor können das nach einmaligem Einstellen und Speichern.
Bei erneutem öffnen eines solchen Dokuments kann ich einfach auf Schnelldruck klicken und es Passt.