Laden...

[gelöst] Einfache Druck-Klasse gesucht

Erstellt von Dominicano vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.857 Views
D
Dominicano Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren
[gelöst] Einfache Druck-Klasse gesucht

Hallo Community

Ich befasse mich erst seit kurzem mit C#, habe aber schon in anderen Sprachen programmiert.

Im Moment bin ich auf der Suche nach einer "einfachen" Klasse , mit der ich Bilder im Querformat mit einer bestimmten Größe (immer die selbe) drucken kann.
In Java hatte ich mir eine einfache Klasse (79 Zeilen) geschrieben, die perfekt funktioniert:

package xyz; // abzuändern für das jeweilige Projekt

import java.util.Arrays;
import java.awt.Image;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.PrintQuality;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.DocPrintJob;
import javax.print.Doc;
import javax.print.SimpleDoc;
import javax.print.PrintException;

public class PrintGraphics {
    PageFormat pageFormat;
    Paper paper;
    public static void main(String args []) {
//        new PrintGraphics();
    }
    public PrintGraphics(Image image) {
        final String sErrNoPrintService = "Es ist kein passender Print-Service installiert.";
        String s2ndParm = null;
        int idxPrintService = -1;
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(MediaSizeName.ISO_A4);
        aset.add(OrientationRequested.LANDSCAPE);
        aset.add(PrintQuality.HIGH);
        aset.add(new MediaPrintableArea(10, 10, 190, 277, MediaPrintableArea.MM));
        try {
            PrintService prservDflt = PrintServiceLookup.lookupDefaultPrintService();
            PrintService[] prservices = PrintServiceLookup.lookupPrintServices(flavor, aset);
            if (null == prservices || 0 >= prservices.length) {
                if (null != prservDflt) {
                    prservices = new PrintService[] { prservDflt };
                } else {
                    System.err.println(sErrNoPrintService);
                    System.exit(3);
                }
            }
            PrintService prserv = null;
            if (0 <= idxPrintService && idxPrintService < prservices.length) {
                prserv = prservices[idxPrintService];
            } else {
                if (!Arrays.asList(prservices).contains(prservDflt)) {
                    prservDflt = null;
                }
                prserv = ServiceUI.printDialog(null, 50, 50, prservices, prservDflt, null, aset);
            }
            if (null != prserv ) {
                pageFormat = new PageFormat();
                paper = new Paper();
                paper.setSize(594.936, 841.536);
                paper.setImageableArea(100, 100, 594.836, 841.436);
                pageFormat.setOrientation(PageFormat.LANDSCAPE);
                pageFormat.setPaper(paper);
                if (null == s2ndParm || !s2ndParm.equalsIgnoreCase("np")) {
                    DocPrintJob pj = prserv.createPrintJob();
                    Doc doc = new SimpleDoc(new MyPrintableObject(image), flavor, null);
                    pj.print(doc, aset);
                }
            }
        } catch (PrintException pe) {
            System.err.println(pe);
        }
    }
}

Hat "zufällig" jemand etwas Ähnliches schon in petto, bzw. gibt es die Möglichkeit, diese Klasse direkt in C# einzubinden?

MfG Dom.

Gelöschter Account
vor 16 Jahren

Drucken

MfG janismac

D
Dominicano Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

Dank der die vielen hilfreichen Antworten, habe ich mir eine eigene Print-Klasse zusammenbauen können. Nicht so schön wiederverwendbar wie in Java, aber für meine Zwecke ausreichend.

Dom.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Dominicano,

dann poste die doch bitte.

herbivore

D
Dominicano Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

Warum? Hat jemand daran interesse?

Zum einen ist das speziell zum Drucken von DVD-Hüllen , zum anderen genauso Chaotisch aufgebaut wie es die Anleitungen von Mircosoft sind. Mir hat die Seite von O´Reilly (hier) sehr geholfen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Dominicano,

es geht einfach nur um das hier: [Hinweis] Wie poste ich richtig? Punkt 9

Jemand der später das gleiche Problem hat, wie du jetzt, der hat dann gleich eine Lösung.

Vielen Dank!

herbivore

D
Dominicano Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

Aufgrund des vorangestellten Beitrags jetzt 'meine' Lösung:

  1. Print_Button
private void print_Button(object sender, EventArgs e)
        {
            printDoc.PrintPage += new PrintPageEventHandler(Print_Page);
            printDoc.DefaultPageSettings.Landscape = true;
            printDoc.DefaultPageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;
            printDoc.Print();
        }
  1. Print_Page Methode
private void Print_Page(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            new PrintGraphics((Bitmap.FromFile("Wag.jpg")), e, printDoc);
        }
  1. PrintGraphics Klasse
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;


namespace DVD_Database
{
	
	public class PrintGraphics
	{
		public PrintGraphics(Image image,PrintPageEventArgs e, PrintDocument pd)
		{
            picture = new Bitmap(image);
            printDoc_PrintPage(e);
		}
        // -------------- event handler ------------------------------------
        public void printDoc_PrintPage(PrintPageEventArgs e)
        {
            int leftMargin = e.MarginBounds.Left;
            int topMargin = e.MarginBounds.Top;
            Graphics g = e.Graphics;
            g.PageUnit = GraphicsUnit.Pixel;
            g.DrawImage(picture, 100, 100, 6435.000f, 4360.000f);
        }

        //-------------- end of event handlers -----------------------------
        private Bitmap picture;
	}
}

Erläuterung:

  1. Ein Button (kann auch ein Menüeintrag, oder Ähnliches sein) als Steuerelement für Benutzereingabe. Darin (für mich eigentlich unlogisch, gehört in Druck-Klasse) die Druckereinstellungen für "Breitbild" (Landscape) und Auflösung, und Weiterleitung an Print_Page(2.).
  2. (Für mich wiederrum eine unnötige Resourcenverschwendung) Weiterleitung an die PrintGraphics Klasse mit Bitmap(ausnahmsweise Hardcodiert ; Bild muß im selben Ordner sein wie die ausführbare .exe).
  3. PrintGraphics Klasse, welche die eingentlichen Arbeit macht: Das Bild mit entsprechender Bemaßung auf´s Papier bringen (exakt DVD-Cover Größe). Natürlich sind auch andere Formen(Rect, Cicle, Arc, String, usw.) und Farben möglich.

Ich hoffe, daß dies ausreicht.

MfG Dom.

PS: Closen