Bilddatei drucken.

JavaRentner

Aktives Mitglied
Guten Tag.
Habe den Thread "Probleme mit drucken aus Java" beendet, weil ich von Grund auf das mit dem drucken verstehen lernen muss.

Ich habe:
Java:
FileInputStream fls = new FileInputStream("/Pfad/bild.png");
bild.png - Abmessung: 13 x 8 cm (ca. 491 x 302 pixel)

Dieses versuche ich jetzt auf ein A4-Papier zu drucken.
X - Position = 5cm (ca. 189px) -> vom linken Rand
Y - Position = 12cm (ca. 454px) -> vom oberen Rand
Breite und Höhe Originalgrösse. (13 x 8 cm)


Habe etliche Links gefunden! (konnte es aber mit meinen Kenntinssen nicht umsetzen)
Egal wie ich es anstelle, es wird mir immer das Bild auf das ganze Blatt aufgezogen!
Nicht mal die 4mm nicht Druckbarerbereich (links, oben, rechts und unten) wird berücksichtigt!
Er druckt immer die X/Y-Kordinaten bei (17 / 11 mm)

Gibt es Jemand der mir hier ein kleines Skript geben könnte, welches ich dann testen und analysieren könnte?
Da ich kein Profi bin könnte ich so ev. herausfinden, welche Parameter für was Zuständig sind um das gewünschte Ergebnis zu erhalten.

Vielen Dank!
Es wäre so hilfreich, damit ich endlich ein stück weiter kommen könnte... ☺️
 

Robert Zenz

Top Contributor
bild.png - Abmessung: 13 x 8 cm (ca. 491 x 302 pixel)

Nein. Das Bild ist 491x302px grosz. Vielleicht sind noch Metadaten hinterlegt welche die DPI angeben, aber ob diese Hinweise von druckenden Programmen beachtet werden oder nicht, ist Sache des Programms (und des Druckers manchmal).

Nicht mal die 4mm nicht Druckbarerbereich (links, oben, rechts und unten) wird berücksichtigt!

Ich musste noch sehr wenig aus Java heraus drucken, kannst du mal deinen Code zeigen? Gibt da mehrere Wege und waere gut zu sehen was genau du machst.
 

JavaRentner

Aktives Mitglied
Vielen Dank...
Mit dem Link: https://stackoverflow.com/questions/10951394/java-printing-to-specific-page-size-using-label-printer
Habe ich folgende Klasse gebastelt:
Java:
package panelPrint;

import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;

import javax.imageio.ImageIO;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSize;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.MediaTray;
import javax.print.attribute.standard.PrintQuality;
import javax.print.attribute.standard.PrinterName;

public class PanelPrint {

    double px2mm = 0.2645833333333;    //    1px = 0.2645833333333 mm
    double dpFaktor = 72.0;
 
    /**
     * Sollte die &uuml;bergebene Komponente samt Objekten drucken (<i>hier ein JPanel</i>)
     * @param printObjekt Die zu druckende Komponente.
     * @param printerName Der Druckername (<i>hier <b>Canon_MF720Cdw</b></i>)
     * @param tray Das Papierfach (<i>"Einzug 1", "Einzug 2" oder "Mehrzweck Papierfach"</i>
     * @param isoTyp Das Papierformat. (<i>A4, C5, usw</i>)
     * @param myPfad Pfad zum Anwendungsorder in dem das erstellte BufferedImage als "print.png" gespeichert wird.
     */
    public PanelPrint(Component printObjekt, String printerName, String tray, String isoTyp, String myPfad) {
        System.out.println("Wirft die aktuelle Position und Gr&ouml;sse des printObjekt:");
        System.out.println("\tprintObjekt X = "+printObjekt.getX()+" px  \tmm = "+(printObjekt.getX()*px2mm));
        System.out.println("\tprintObjekt Y = "+printObjekt.getY()+" px  \tmm = "+(printObjekt.getY()*px2mm));
        System.out.println("\tprintObjekt W = "+printObjekt.getWidth()+" px\tmm = "+(printObjekt.getWidth()*px2mm));
        System.out.println("\tprintObjekt H = "+printObjekt.getHeight()+" px\tmm = "+(printObjekt.getHeight()*px2mm));
     
        AttributeSet aset = new HashAttributeSet();
        aset.add(new PrinterName(printerName, null));

        PrintService[] services = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PNG, aset);
        if (services.length >= 1) {
            DocPrintJob pj = services[0].createPrintJob();
         
         
            MediaSizeName msnISO = null;
            switch(isoTyp) {
            case "A4":
                msnISO =  MediaSizeName.ISO_A4;
                break;
            case "C5":
                msnISO =  MediaSizeName.ISO_C5;
                break;
            }

            MediaSize ms = MediaSize.getMediaSizeForName(msnISO);
         
            int msWidth = Math.round(ms.getX(MediaSize.MM));
            int msHeight = Math.round(ms.getY(MediaSize.MM));
         
            PrintService drucker = null;
            drucker = getPrinter(printerName);
         
            //Hier habe ich versucht den Druckbaren bereich fest zu legen!
            MediaPrintableArea mpa = new MediaPrintableArea(4, 4, msWidth, msHeight, MediaPrintableArea.MM);
         
            DocAttributeSet das = new HashDocAttributeSet();
            das.add(msnISO);
            das.add(mpa);
            das.add(PrintQuality.HIGH);
            das.add(getMediaTray(drucker, tray));
         
            FileInputStream fls = null;
            File tmpSave = new File(myPfad+"print.png");
         
            try {
                //Erstellt ein Buffered-Image und speichert es als "../print.png"
                ImageIO.write(getSnapShot(printObjekt), "png", tmpSave);
                //Liest das "../print.png" in FileInputStream (fls) ein.
                fls = new FileInputStream(tmpSave);
                if(fls != null && tmpSave.exists()) {
                    Doc doc = new SimpleDoc(fls, DocFlavor.INPUT_STREAM.PNG, das);
                    pj.print(doc, null);
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
         
            if(tmpSave.exists()) {
//                tmpSave.delete();
                System.exit(0);
            }
        }
    }

    /**
     * Erstellt aus einer Komponente ein <b><font color='blue'>BufferedImage</font></b>
     * @param view Die Komponente (<i>JFrame, JDialog, JPanel, JLabel, etc.</i>)
     * @return Das erstellte <b>BufferedImage</b>.
     */
    private BufferedImage getSnapShot(Component view)
    {
        int w = (int) (view.getWidth());
        int h = (int) (view.getHeight());
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        synchronized (view.getTreeLock())
        {
            view.paint(image.createGraphics());
        }
        return image;
    }
    //-----------------------------------------------------------------------------------------------

    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;
    }

}
Die Ausgabe Zeilen 41 - 45 ergibt:
Wirft die aktuelle Position und Gr&ouml;sse des printObjekt:
printObjekt X = 15 px mm = 3.9687499999994995
printObjekt Y = 15 px mm = 3.9687499999994995
printObjekt W = 850 px mm = 224.89583333330498
printObjekt H = 596 px mm = 157.6916666666468
In Zeile 74 wollte ich das MediaPrintableArea setzen!
Das DocAttributeSet (das) füttere ich mit den Zeilen 77 - 80

In Zeile 92:
pj.print(doc, null);
verstehe ich nicht was da bei null ev. noch gesetzt werden kann / muss...

Den Tray auswählen funktioniert!
Folgende Ausdrucke werden gemacht:

Tray 2 (A4-Ausdruck.png):
Tray Manual (C5-Ausdruck.png):

Nachtrag:
Egal ob A4 oder C5!
z.B. ist beim übereinanderlegen der Ausdrucke sind die gedruckten Texte exakt gleich gross! Nur beim C5 wird ringsum alles abgeschnitten.

Fazit iwo fehlen im Obigen Code ANGABEN oder es wurden falsche Angaben gesetzt! ??? Verstehs nicht.
 

Anhänge

  • A4-Ausdruck.png
    A4-Ausdruck.png
    967,1 KB · Aufrufe: 0
  • C5-Ausdruck.png
    C5-Ausdruck.png
    559,3 KB · Aufrufe: 0
Zuletzt bearbeitet:

JavaRentner

Aktives Mitglied
grosz = groß -> der Buchstabe ß wird ja auch sz genannt und das ist eine mögliche Schreibweise, wenn z.B. kein ß zur Verfügung ist weil man z.B. eine US Tastatur hat oder so - da ist das ß dann ein ALT + 225 (Zehnertastatur).
Vielen Dank! Schon wieder was dazu gelernt.

Auf der CH-Tastatur (auf einem Linux) kann das ß auch mit [Alt Gr] + s geschrieben werden. Wenn ich gewusst hätte dass ich das NACH meiner Pensionierung noch gebrauchen könnte, hätte ich vor mehr als 48 Jahren, in der Schule besser aufgepasst, wo und wie das eingesetzt werden soll/muss!
😄😄😄😄😄
 

JavaRentner

Aktives Mitglied
Die Frage #1 in diesem Post habe ich hier in Anfänger-Tehmen gestellt weil ich schon mehr als einem Monat versuche
das Script aus:
mit dem Script aus diesem Post #3 zu kombinieren.

Aber egal was ich da zusammenbaue, es kommt nur Müll raus.

Gibt es denn kein einfaches funktionierendes Script welches mir ein PNG (sagen wir 150x150 pixel) zentriert auf einem A4 Papier ohne Druckerdialog ausdrucken kann?
Das PNG lade ich mit: FileInputStream fls = new FileInputStream("/Pfad/bild.png");

Anhand eines funktionierenden Script könnte ich lernen was, wie, wo gesetzt werden muss um das zu erreichen.

Mit Faulheit hat das nichts zu tun.
Wenn sowas mit JAVA gar nicht geht, welche Script-Sprachen könnten mir dann empfohlen werden?

Vielen Dank.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
TLDR; Du musst das Bild skaliert ausgeben.

bild.png - Abmessung: 13 x 8 cm (ca. 491 x 302 pixel)
Ein PNG-Bild ist ein Rasterbild, das aus einzelnen Bildpunkten (Pixel) besteht. Da diese rechteckig angeordnet werden, hat ein solches Bild eine "Breite" und "Höhe" in Pixel.

Die Größe eines Pixels ist nicht definiert, sondern ist abhängig von der in dpi (dots per inch) angegebenen Auflösung des Aufnahme- bzw. Ausgabegeräts.

Egal wie ich es anstelle, es wird mir immer das Bild auf das ganze Blatt aufgezogen!
Dazu muss man verstehen, dass AWT mit verschiedenen Koordinatensystemen arbeitet, die im Gegensatz zu Rasterbildern auf individuellen Pixeln basieren. Anwendungen arbeiten im sog. "User Space", ein Koordinatensystem, das unabhängig vom Ausgabegerät eine Auflösung von etwa 72 dpi hat. Die Auflösung bezieht sich dabei auf ganzzahlige Koordinaten. Zeichnest Du also in einem Graphics-Objekt eine Linie von (100, 100) bis (172, 100), dann sollte diese Linie auf jedem Gerät etwa 1 Zoll lang sein. Die Linie kann aber aus mehr als 72 Bildpunkten bestehen.

Nebenbei: die 72 dpi stimmen nicht immer. Bei Geräten, die den 72 dpi relativ nahe kommen, wird einfach die Auflösung des Geräts verwenden. Bei einem 90 dpi Monitor könnte es z. B. standardmäßig zu 90 dpi im User Space kommen. Das soll hier aber einfach mal vernachlässigt werden, schließlich reden wir hier vom Drucker.

Der PrintService kennt die Auflösung des Druckers und stellt für den Druck ein Graphics-Objekt zur Verfügung, auf das eine affine Transformation angewendet wird, so dass die 72 dpi im User Space auf die Auflösung des Druckers umgerechnet wird. Wenn man das selbst nachvollziehen will, muss man berücksichtigen, dass sich die Auflösung des Druckers in der Regel auf die einzelnen Farbpunkte bezieht. Ein Bildpunkt wird im Vierfarbdruck mit vier Punkten gedruckt (CMYK), macht sich halt besser, wenn man 1200 dpi statt 300 dpi anpreisen kann... (und technisch betrachtet ist es ja auch nicht falsch). Bezogen auf die 72 dpi im User Space erhält man bei einem 1200 dpi Vierfarbdruck also einen Faktor von 300 / 72. Ein Zoll entspricht 72 Punkten bei 72 dpi und 300 Punkten bei 300 dpi, also das 4,16666....-fache.

In den meisten Fällen muss diese Umrechnerei den Entwickler nicht weiter interessieren: er zeichnet eine Linie zwischen zwei Punkten und den Rest erledigt das System. Bei Bildern ist das aber etwas anders, da dieses wie oben erwähnt aus diskreten Bildpunkten bestehten d. h. jeder einzelne Bildpunkt muss auf den User Space abgebildet werden.

Wenn man ein Bild nun einfach 1:1 auf den User Space überträgt, d. h. jede Koordinate im Bild unverändert in den User Space übernimmt (und das ist standardmäßig der Fall), dann wird das Bild in 72 dpi aufgelöst. D. h. ein Bild mit einer Größe von 491 x 302 Pixel würde 6,82 Zoll (17,32 cm) breit und 4,19 Zoll (10,65 cm) hoch ausgegeben werden.

Um das zu verhindern, muss das Bild skaliert ausgegeben werden (nicht das Bild selbst skalieren, denn dann würde die Qualität leiden!).

Hier mal ein Beispiel:

Java:
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
import java.io.Console;
import java.io.FileInputStream;
import java.nio.file.Path;

import javax.imageio.ImageIO;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;

public class PrintImage {

    public static void main(String[] args) throws Exception {
        String filename = args[0];

        PrintService service = selectPrintService();
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPrintService(service);

        Path pathToImage = Path.of(filename);
        BufferedImage img = ImageIO.read(new FileInputStream(pathToImage.toFile()));
        Printable printable = createPrintable(img, 40, 40, 40);
        job.setPrintable(printable);

        job.print();
    }

    static Printable createPrintable(BufferedImage img, 
            float xPosMillis, float yPosMillis, float targetWidthMillis) {
        return (g, p, i) -> {
            if (i > 0) {
                return Printable.NO_SUCH_PAGE;
            }

            Graphics2D g2 = (Graphics2D) g.create();
            double targetDpi = img.getWidth() * 25.f / targetWidthMillis;
            double factor = 72 / targetDpi;
            AffineTransform translate = AffineTransform.getTranslateInstance(toPoints(xPosMillis)/factor, toPoints(yPosMillis)/factor);
            AffineTransform scale = AffineTransform.getScaleInstance(factor, factor);
            scale.concatenate(translate);
            g2.drawImage(img, scale, null);
            g2.dispose();

            return Printable.PAGE_EXISTS;
        };
    }

    static PrintService selectPrintService() {
        Console con = System.console();
        PrintService[] services = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PNG, null);
        for (int i = 0; i < services.length; i++) {
            con.format("%d. %s%n", i + 1, services[i].getName());
        }
        con.format("Welcher Drucker? ");
        String input = con.readLine();
        int serviceIndex = Integer.parseInt(input) - 1;

        return services[serviceIndex];
    }

    static float toPoints(float millimeter) {
        return millimeter * 72f / 25.4f;
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
J NullPointerException bei Laden von Bilddatei Java Basics - Anfänger-Themen 16
N Bilddatei laden Java Basics - Anfänger-Themen 42
G Bild in Buffer statt temporäre Bilddatei Java Basics - Anfänger-Themen 6
T Bilddatei aus Internet abspeichern Java Basics - Anfänger-Themen 3
J Probleme mit drucken aus Java Java Basics - Anfänger-Themen 3
M html-seite drucken (gerendert) Java Basics - Anfänger-Themen 3
T DamagedFontException beim drucken Java Basics - Anfänger-Themen 3
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
U Drucken.. Birt vs Jasper Java Basics - Anfänger-Themen 1
H Drucken auf Drucker Java Basics - Anfänger-Themen 8
B Drucken mit einem Terminal / Bon Printer Java Basics - Anfänger-Themen 4
B HTML Code drucken Java Basics - Anfänger-Themen 4
B Drucken: Default Paper von Drucker? Mein Drucker druckt falsch Java Basics - Anfänger-Themen 3
B Drucken in JAVA -> nicht "Java printing" Java Basics - Anfänger-Themen 3
D Erste Schritte HTML aus JEditorPane drucken Java Basics - Anfänger-Themen 5
I Drucken in Java / verschiedene Papierformate Java Basics - Anfänger-Themen 0
I Drucken (Print) monitoren Java Basics - Anfänger-Themen 0
I Erste Schritte Drucken in JAVA / Druckaufträge etc. Java Basics - Anfänger-Themen 15
T Drucken mit Java Java Basics - Anfänger-Themen 16
E Input/Output Drucken am Mac immer gleiche Schriftgröße?!? Java Basics - Anfänger-Themen 2
E Input/Output png Auf Dymo 450 drucken Java Basics - Anfänger-Themen 2
S JPanel drucken -> PrinterException Java Basics - Anfänger-Themen 2
C Drucken/Druckdesign mit Java Java Basics - Anfänger-Themen 8
J checkbox status abfragen und drucken Java Basics - Anfänger-Themen 13
K doppeltes paint beim Drucken Java Basics - Anfänger-Themen 8
B Source Code "in einem Rutsch" drucken in Eclipse Java Basics - Anfänger-Themen 5
K Drucken Java Basics - Anfänger-Themen 8
G Mit Java Drucken Java Basics - Anfänger-Themen 11
O OOP prindata Methode aufrufen!? Methode drucken + Konstruktor Java Basics - Anfänger-Themen 9
G DRUCKEN von z.B. eines JFrame über print(Graphics g) Java Basics - Anfänger-Themen 9
K einfaches Drucken von Text (und ggf Bildern,gemischt) Java Basics - Anfänger-Themen 11
N barbecue Barcodes drucken Java Basics - Anfänger-Themen 5
H Bericht drucken Java Basics - Anfänger-Themen 4
T [Minimalprogramm] mit Java Drucken Java Basics - Anfänger-Themen 6
L drucken mit DocPrintJob Java Basics - Anfänger-Themen 3
R Drucken mithilfe eines Externen ActionListeners Java Basics - Anfänger-Themen 17
S Inhalt von GUI-Eingabe drucken Java Basics - Anfänger-Themen 7
I PDF aus JSF - Seite drucken mit iText Java Basics - Anfänger-Themen 5
J JTable Drucken Java Basics - Anfänger-Themen 3
J mit COM-Port drucken Java Basics - Anfänger-Themen 8
R mehrseitiges Drucken Java Basics - Anfänger-Themen 3
J Listen - Anzahl positiver Werte drucken Java Basics - Anfänger-Themen 8
H Papierschacht beim Drucken ansprechen Java Basics - Anfänger-Themen 4
T Drucken von Listen bestehend aus Grafik und Text (unter swing) Java Basics - Anfänger-Themen 7
A JTree drucken Java Basics - Anfänger-Themen 2
M html datei drucken Java Basics - Anfänger-Themen 18
E BufferedImage drucken Java Basics - Anfänger-Themen 3
K Drucken mit PrinterJob Java Basics - Anfänger-Themen 3
andresendo Drucken Java Basics - Anfänger-Themen 2
D Drucken - Seite leer Java Basics - Anfänger-Themen 2
S Drucken mit iText? Java Basics - Anfänger-Themen 7
T Formular drucken! Java Basics - Anfänger-Themen 2
S Drucken in farbe Java Basics - Anfänger-Themen 4
G Problem mit Drucken Java Basics - Anfänger-Themen 2
G Strings drucken Java Basics - Anfänger-Themen 2
N Im Querformat drucken mit PrintJob Java Basics - Anfänger-Themen 4
Z Drucken eines JTables mit Text drüber Java Basics - Anfänger-Themen 6
S ich komm mit dem drucken nich klar Java Basics - Anfänger-Themen 17
S Drucken! Java Basics - Anfänger-Themen 16
B Formatierung beim Drucken Java Basics - Anfänger-Themen 4
D Drucken Java Basics - Anfänger-Themen 3
M Drucken Java Basics - Anfänger-Themen 2
B RTF erstellen und drucken Java Basics - Anfänger-Themen 3
G Drucken mit PrintJob oder PrinterJob? Java Basics - Anfänger-Themen 4
F Drucken einer Text Datei Java Basics - Anfänger-Themen 2
M Probleme beim Drucken Java Basics - Anfänger-Themen 4
R String drucken Java Basics - Anfänger-Themen 3
G Drucken von pdf Dokumenten mit Lücken Java Basics - Anfänger-Themen 2
J Drucken von files Java Basics - Anfänger-Themen 4
D Drucken ohne Dialogfeld Java Basics - Anfänger-Themen 2
E HTML Datei drucken Java Basics - Anfänger-Themen 4
G drucken: genaues positionieren Java Basics - Anfänger-Themen 2
R rechtsbündiges Drucken Java Basics - Anfänger-Themen 2
G Drucken Java Basics - Anfänger-Themen 2
D PDF Dokument drucken Java Basics - Anfänger-Themen 10
S verständnisproblem drucken Java Basics - Anfänger-Themen 11
J Serienbrief drucken Java Basics - Anfänger-Themen 2
A Drucken mit Java über FOP Java Basics - Anfänger-Themen 9
B Bilder drucken Java Basics - Anfänger-Themen 4
M Formatiert Drucken in Java Java Basics - Anfänger-Themen 3
A Drucken und Vorschau Java Basics - Anfänger-Themen 4
F Java-Logo drucken Java Basics - Anfänger-Themen 2
S Noch ungelöst ! Klasse JTable und Klasse Drucken verknüpfen. Java Basics - Anfänger-Themen 8
M DATEI DRUCKEN ????? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben