C# - Nyomtatás alapjai, avagy a PrintDocument komponens

forráskód letöltése
Ha papíron kell megjelenítenünk tetszőleges adatokat, akkor ebben nagy segítséget nyújt a PrintDocument komponens. Mellékelt példában ezzel ismerkedhetünk meg.
Nyomtatáshoz tegyünk fel tehát egy PrintDocument komponenst. Feladatként azt valósítjuk meg, hogy kinyomtatjuk az autoexec.bat állomány tartalmát. Ha esetleg az ön rendszerében ez nincs jelen, akkor írja át a forráskódban ezt a hivatkozást egy másik, létező szöveges állományra.
Ahhoz, hogy nyomtatni tudjunk egy szöveges állományt, ahhoz ismernünk kell annak tartalmát. Ehhez egy StreamReader osztályt hívunk segítségül, mellyel beolvashatjuk az állományunk tartalmát. A nyomtatási munka elindításához a PrintDocument komponens Print függvényét kell meghívnunk.
      protected void button1_Click (object sender, System.EventArgs e)
      {
        try
        {
          st = new StreamReader("c:\\autoexec.bat");
          try
          {
            font = new Font("Courier New", 10);
            printDocument1.Print();
          }        
          finally
          {
            st.Close();
          }
        }
        catch (Exception ex)
        {
          MessageBox.Show(ex.Message);
        }
      }
Amikor e Print meghívásra kerül, akkor jön létre a komponens PrintPage eseménye. Ez lesz az a pont a programunkban, ahol megmondhatjuk, hogy mit is küldünk a nyomtató felé.
Az esemény paramétereként kapunk egy PrintPageEventArgs típusú változót. Ebben sok olyan adat áll a rendelkezésünkre, melyet felhasználhatunk a nyomtatási munka elvégzéséhez. Így például a MarginBounds property-ben megkapjuk papírlaphoz tartozó margót. A Graphics property-n keresztül pedig tetszőleges grafikai funkciót elérhetünk a dokumentumunk kirajzolásához.
A szöveges állomány nyomtatását úgy végezzük el, hogy egy while ciklussal végigmegyünk az állomány egyes sorain. Ez a ciklus addig fut, amíg van elegendő hely az adott lapon a következő sor kinyomtatásához, vagy amíg van mit kinyomtatni. A ciklusmagban számláljuk az aktuális sor pozícióját, ahová írnunk kell. A szöveg kirajzolását a Graphics osztály DrawString függvényével végezzük.
A ciklus végeztével szintén a PrintPageEventArgs típusú változón keresztül jelezhetjük a PrintDocument komponens felé, hogy van-e még nyomtatandó munka vagy már végeztünk. Ezt a HasMorePages logikai property-nek történő értékadással tehetjük meg. Amennyiben ennek igaz értéket adunk, úgy a PrintDocument komponens új lapot nyit és újra aktivizálja a PrintPage eseményét.
      protected void printDocument1_PrintPage (object sender, System.Drawing.Printing.PrintPageEventArgs e)
      {        
        ...
        float l = e.MarginBounds.Left;
        float t = e.MarginBounds.Top;        
        float h = font.GetHeight(e.Graphics);
        float max = e.MarginBounds.Height / h;
        while (count < max && ((line = st.ReadLine()) != null)) 
        {
          y = count * h + t;
          e.Graphics.DrawString(line, font, Brushes.Black, l, y, new StringFormat());
          count++;
        }
        e.HasMorePages = line != null;        
      }