Jackery IFA Fireplace

C# Eine Zeile drucken ohne "Blattvorschub"

frajen

Lieutenant
Registriert
Mai 2008
Beiträge
576
Hallo,
Ich habe ein Problem mit dem Drucken von einzelnen Zeilen unter C#.
Ich muss ein Programm schreiben welches aus einer Datei Text ausliest und diesen dann auf einem Entlospapier-Drucker drucken, und dabei natürlich ohne den Rest des Blattes hinterher zuschieben.

Das Drucken geht auch aber eben nicht das er nur eine Zeile druckt.

Hier mal meine PrintPage methode:
Code:
//Aufruf
printDocument1.Print();


private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {            
                float yPos = 0f;
                int count = 0;
                float leftMargin = e.MarginBounds.Left;
                float topMargin = e.MarginBounds.Top;
                string line = null;
                fileToPrint = new StreamReader(file);
                float linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);

                while (count < linesPerPage)
                {
                    line = fileToPrint.ReadLine();
                    if (line == null)
                    {
                        
                        break;
                    }
                    yPos = topMargin + count * printFont.GetHeight(e.Graphics);
                    e.Graphics.DrawString(line, printFont, Brushes.Black, yPos, leftMargin, new StringFormat());
                   
                    count++;
                }
                if (line != null)
                {
                    e.HasMorePages = true;
                }


                fileToPrint.Close();
                File.Delete(file);
            
        }

ich hoffe einer kann mir helfen.:)
 
Deine While Schleife liest ja auch mehr als eine Zeile aus und übergibt sie an den Druck.

Wenn du nur eine Zeile willst, musst du alle nichtgewünschten Zeilen verwerfen.
 
du hast x- und y-Parameter vertauscht in Zeile 24 (yPos und leftMargin)...

@0rsox: Ich denke er meint als Symptom, dass der Fehler darin liegt, dass nur eine Zeile gedruckt wird...


Edit:
Ich würde auch ein wenig Refactoring machen
Code:
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{    
  e.HasMorePages = true;
  fileToPrint = new StreamReader(file);
  
  StringFormat stringFormat = new StringFormat();
  float heightPerLine = printFont.GetHeight(e.Graphics);
  int linesPerPage = (int)(e.MarginBounds.Height / heightPerLine);
  float xPos = e.MarginBounds.Left;
  float yPos = e.MarginBounds.Top;

  int count = 0;
  while (count < linesPerPage)
  {
    String line = fileToPrint.ReadLine();
    if (line == null)
    {
      e.HasMorePages = false;
      break;
    }
    yPos = yPos + heightPerLine;
    e.Graphics.DrawString(line, printFont, Brushes.Black, xPos, yPos, stringFormat);
     
    count++;
  }

  fileToPrint.Close();
  
  // Das Löschen sollte in der Verantwortung des Aufrufers stehen bzw dem, der die Datei erstellt hat...
  File.Delete(file);
}
 
Zuletzt bearbeitet:
@1668mib:
Das mit x und y vertauscht muss vorhin erst passiert sein, an der stelle habe ich vorhin rumgespielt. Also ich glaube das ist nicht der Grund. Geht das denn bei deinem code das drucken ? Habe den drucker jetzt nicht hier nur PDFCreator sieht man das dort auch ?

@Orsox
Es muss nicht immet eine Zeile sein es können theoretisch auch 5 sein. Aber halt nur der Text der in der Datei steht, kein "Blattnachschub"

Das mit dem Löschen habe ich da weil an der stelle schneller ausgeführt wird, es geht um geschwindigkeit :D. Das passt an der Stelle schon ^^ denn es wird nicht durch ein user gedruckt.



(im pdf creator ist immer noch ein ganzes Blatt, aber die frage ist er da überhaupt einzelne Zeilen drucken kann)
 
Zuletzt bearbeitet:
Ach jetzt versteh ich es...
Naja der PDF-Creator ist ja vermutlich kein Endlosdrucker... du solltest das schon mit dem echten Drucker testen...
 
Und der Code den du gepostet hast sollte auf Endlospapier funktionieren ?
 
Keine Ahnung ich hab ihn nicht getestet... im Grunde macht er nichts anderes als deiner...
 
Nur bei meinem ist ja das Problem das er nicht so auf Endlospapier druckt wie er soll. (Nadeldrucker mit Endlospapier). Das ist ja das Problem ....
 
Naja vielleicht ist das Problem, dass das Druck-Verfahren Seiten-basiert ist. Du rechnest ja sogar aus dem zur Verfügung stehenden Platz die Anzahl der Zeilen pro Seite raus... bei Endlospapier macht sowas an sich gar keinen Sinn.
 
Du meinst also es sollte (/grob) etwa so aussehen

Code:
while (true)
  {
    String line = fileToPrint.ReadLine();
    if (line == null)
    {
      e.HasMorePages = false;
      break;
    }
    e.Graphics.DrawString(line);
     
  }
 
Das Problem besteht immer noch, habe meine Print methode überarbeitet aber er schiebt das Blatt nach dem er die Zeile(n) gedruckt hat immer noch hinterher.

Code:
//Drucken
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            fileToPrint = new StreamReader(file);
            StringFormat stringFormat = new StringFormat();
            float xPos = e.MarginBounds.Left;
            float yPos = e.MarginBounds.Top;
                        
            while (true)
            {
                String line = fileToPrint.ReadLine();
                if (line == null)
                {
                    e.HasMorePages = false;
                    break;
                }
                e.Graphics.DrawString(line,printFont, Brushes.Black, new Point(Convert.ToInt32(xPos),Convert.ToInt32(yPos)));
            }
            fileToPrint.Close();
            File.Delete(file);
            
        }

Sitze grade vor dem Drucker kann also gleich testen.
Bräuchte dringend hilfe.

mfg
frajen
 
In deiner while (true)-Schleife legst du nie eine neue y-Postition fest. Alle Zeilen werden daher übereinander gedruckt. Selbst wenn du 100 Zeilen hast, kommt immer nur eine.
Kurz: Der Zeilenvorschub fehlt.

Das ein Blattvorschub kommt ist durch das seitenbasierte Druckersystem von Windows bedingt.
Ich wüßte spontan nicht wie man das ändern kann.

Zeilenbasiertes Drucken könnte man über eine direkte Kommunikation mit dem Endlosdrucker realisieren, also direktes Senden der Druckdaten auf den Druckeranschluss.

EDIT:
Ich glaube mir ist doch grad ne Idee gekommen wegen dem Blattvorschub.

Du könntest dir ein Papierformat für den Drucker definieren, welches die Breite des Blatts hat, aber die Höhe von nur einer Textzeile. Wenn du das im Printer-Objekt (Oder PrinterSettings?!) verwendest, wirkt der Blattvorschub wie ein Zeilenvorschub.
Dann müsste man das Programm zwar ziemlich ändern, aber der gewünschte Effekt wäre da.

Ich mach mal ein Beispiel

Code:
        string line;
        float x = 10;
        float y = 10;

        private void Form1_Load(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("eingabedatei.txt", FileMode.Open, FileAccess.Read);
            StreamReader sr = new StreamReader(fs);
            line= sr.ReadLine();
            printDocument1.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("endlos", 210, 20);

            while (!sr.EndOfStream)
            {
                printDocument1.Print();
                line = sr.ReadLine();
            }

            sr.Close();
            fs.Close();
            sr.Dispose();
            fs.Dispose();
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawString(line,new Font(FontFamily.GenericMonospace,10F,FontStyle.Regular),Brushes.Black,new PointF(x,y));
        }

Die Idee ist wie gesagt, dass man eine Seite in der Höhe so klein definiert, dass es in Wirklichkeit nur eine Zeile ist. Dann druckt man über Print() zwar nur die Zeile, aber für das Programm ist es eine Seite.
Es kann sein, dass man PaperSize nicht direkt im Programm definieren kann. Das weiß ich nicht genau.
Falls nicht, kann man das Format aber im Druckertreiber einstellen und dann in einer ForEach-Schleife auswählen.
 
Zuletzt bearbeitet:
Danke werde es mal so probnieren... melde mich dann wieder :)
 

Anhänge

Zuletzt bearbeitet:
Naja, die Breite des Dokuments stimmt halt nicht.
Ich hab den Code jetzt mal so angepasst, dass die Standard Breite benutzt wird (DIN A4).
(siehe Z.10 und 11)

Da hättest du auch selber drauf kommen können ;)

Code:
string line;
float x = 10;
float y = 10;
     
private void Form1_Load(object sender, EventArgs e)
{
    FileStream fs = new FileStream("eingabedatei.txt", FileMode.Open, FileAccess.Read);
    StreamReader sr = new StreamReader(fs);
    line= sr.ReadLine();
    int width = printDocument1.DefaultPageSettings.PaperSize.Width;
    printDocument1.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("endlos", width, 20);
     
    while (!sr.EndOfStream)
    {
        printDocument1.Print();
        line = sr.ReadLine();
    }
     
    sr.Close();
    fs.Close();
    sr.Dispose();
    fs.Dispose();
}
     
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    e.Graphics.DrawString(line,new Font(FontFamily.GenericMonospace,10F,FontStyle.Regular),Brushes.Black,new PointF(x,y));
}
 
Zurück
Oben