0

I am trying to write a program to deliver some labels, the program reads the queue and job to determine if the process was ok or an error has occurred,

the printer I am using is a TSC brand label maker.

if a label is absent, the printer will stop printing midway and an error will be shown, however in Windows queue everything will freeze and no error will be shown. see the picture below:

enter image description here

how ever if something like this happens in the bartender app which is TSC official app the below picture will happen :

enter image description here

how ever if i print less than 20 labels or 10 pages (2 labels for each page) everything works one other thing : bartender pages will be like : 15/16 then start printing but my program will count one by one very slowly : 1/2 then 2/3 then 3/4 until it gets to like 13/15 , it does not get 15/16 immediately on pages in the pictures

here is the code : my print event :

private void Doc_PrintPage(object sender, PrintPageEventArgs e)
{
 int numberofpagesprinted = LabelPrintRows2.Print(ref sender, ref e, selectedCar, print.Document.PrinterSettings.PrinterName,
    ref lastSerialPrinted_int, ref printRowQuantites, ref localprintQuantitieslocal, label_selectedDate.Text);
    var server = new LocalPrintServer();
    PrintQueue queue = server.GetPrintQueue(print.Document.PrinterSettings.PrinterName);
    queue.Refresh();
    if (queue.NumberOfJobs != 0)
    {

        printerIsprinting = true;
        if (queue != null)
        {
            queue.Refresh();
            PrintJobInfoCollection jobs = queue.GetPrintJobInfoCollection();
            foreach (PrintSystemJobInfo job in jobs)
            {
                if (job.IsPrinting)
                {
                    //return true;
                }
                else
                {
                    // return false;
                }
            }
        }
    }
    else
    {
        if (printerIsprinting)
        {
            printerIsprinting = false;
        }
    }

    if (printRowQuantites > 0)
    {
        e.HasMorePages = true;
    }
    else
    {
        e.HasMorePages = false;
    }
}

in the print function :

   var server = new LocalPrintServer();
    PrintQueue queue = server.GetPrintQueue(PrinterName);
    int numberofpagesprinted = 0;

    int LABEL_X_L = SelectedCar.PrintStartX;
    int LABEL_Y_L = SelectedCar.PrintStartY;
    int LABEL_X_R = SelectedCar.PrintStartX + SelectedCar.PrintGap;
    int LABEL_Y_R = SelectedCar.PrintStartY;
    // float offset = 86.3f;
    int lastSerialPrinted_int_Temp = lastPrintedNumber;

    /* FORMATING SERIAL NUMBER */
    lastSerialPrinted_int_Temp++;
    String serialNumberTextStart;
    serialNumberTextStart = selectedDate.Insert(0, "S/N:");
    serialNumberTextStart += ("-");
    serialNumberTextStart = serialNumberTextStart.Insert(serialNumberTextStart.Length, lastSerialPrinted_int_Temp.ToString("0000000000"));

    if (printQuantities > 1)
    {
        lastSerialPrinted_int_Temp++;
    }
    String serialNumberTextStop;
        serialNumberTextStop = selectedDate.Insert(0, "S/N:");
        serialNumberTextStop += ("-");
        serialNumberTextStop = serialNumberTextStop.Insert(serialNumberTextStop.Length, lastSerialPrinted_int_Temp.ToString("0000000000"));

    /* CREATING PNG FROM SERIAL NUMBERS*/
    Bitmap SerialNumberLeftSide = ConvertTextToImage(serialNumberTextStart, Color.White, Color.Black, SelectedCar);

    Bitmap SerialNumberRightSide = ConvertTextToImage(serialNumberTextStop, Color.White, Color.Black, SelectedCar);

    /* CREATE NEW BITMAP TO COPY SERIAL NUMBER */
    Bitmap templateBitMap = new Bitmap(SelectedCar.ImageAddress);
    Bitmap leftSideLabel = new Bitmap(templateBitMap);
    Bitmap rightSideLabel = new Bitmap(templateBitMap);


    using (Graphics g = Graphics.FromImage(leftSideLabel))
    {
        g.CompositingMode = CompositingMode.SourceCopy;
        g.DrawImage(SerialNumberLeftSide, new Point(SelectedCar.SerialNumberX, SelectedCar.SerialNumberY));
        g.Dispose();
    }

    using (Graphics g = Graphics.FromImage(rightSideLabel))
    {
        g.CompositingMode = CompositingMode.SourceCopy;
        g.DrawImage(SerialNumberRightSide, new Point(SelectedCar.SerialNumberX, SelectedCar.SerialNumberY));
        g.Dispose();
    }

    /* GETTING READY FOR PRINT */
    float tgtWidthMM = SelectedCar.PrintWidthmm;
    float tgtHeightMM = SelectedCar.PrintHeightmm;
    float tgtWidthInches = tgtWidthMM / 25.4f;
    float tgtHeightInches = tgtHeightMM / 25.4f;
    float srcWidthPx = templateBitMap.Width;
    float srcHeightPx = templateBitMap.Height;
    float dpiX = srcWidthPx / tgtWidthInches;
    float dpiY = srcHeightPx / tgtHeightInches;
    leftSideLabel.SetResolution(dpiX, dpiY);
    rightSideLabel.SetResolution(dpiX, dpiY);

    e.Graphics.DrawImage((Image)leftSideLabel, LABEL_X_L, (float)LABEL_Y_L);
    printQuantities--;
    /* COPY SERIAL NUMBER TO BITMAP */

    if (printQuantities > 0)
    {
        e.Graphics.DrawImage((Image)rightSideLabel, LABEL_X_R, (float)LABEL_Y_R);
        printQuantities--;
    }

    /* GARBAGE COLLECTION */
   //  leftSideLabel.Dispose();
   //  rightSideLabel.Dispose();
   //  templateBitMap.Dispose();
   //  SerialNumberRightSide.Dispose();
   //  SerialNumberLeftSide.Dispose();

    lastPrintedNumber = lastSerialPrinted_int_Temp;

    printRowQuantites--;

   //  if (printRowQuantites <= 0)
   //  {
         if (queue != null)
         {
       
            queue.Refresh();
            PrintJobInfoCollection jobs = queue.GetPrintJobInfoCollection();
            foreach (PrintSystemJobInfo job in jobs)
            {
                job.Resume();
                numberofpagesprinted = job.NumberOfPages;
            }
        }
 }

and this is the code for a button which will trig the print :

private void button_printLable_Click(object sender, EventArgs e)
{

        print.PrinterSettings.Copies = 1;
        /* 2 Label in 1 ROW */
        printRowQuantites = printQuantities / 2;

        if (printQuantities % 2 == 1)
        {
            printRowQuantites++;
        }

        localprintQuantitieslocal = printQuantities;
        PaperSize paperSize = new PaperSize("Double_PagezSize", 333 + (int)numericUpDown_Label_X.Value, 87);
        paperSize.RawKind = 256;
        doc.PrinterSettings.MaximumPage = printRowQuantites;
        doc.DefaultPageSettings.PaperSize = paperSize;

        doc.Print();
        //doc.Dispose();
        sampleLableRedraw();

}

why my program dosnt work the same ? am i printing wrong ?

Rand Random
  • 7,300
  • 10
  • 40
  • 88
S2G
  • 121
  • 7
  • These articles may be of some help. [PRINTER_INFO_6 structure](https://learn.microsoft.com/en-us/windows/win32/printdocs/printer-info-6), [PRINTER_INFO_6 not available using WIn32 api](https://stackoverflow.com/q/59778175/9014308) – kunif Aug 07 '23 at 08:19

0 Answers0