c# - PrintDocument का उपयोग करके थर्मल प्रिंटर पर टेक्स्ट फ़ाइल कैसे प्रिंट करें?




winforms report (2)

क्या आपका थर्मल प्रिंटर ओपीओएस का समर्थन करता है?

यदि ऐसा होता है, तो मेरा सुझाव है कि आप Microsoft पॉइंट ऑफ़ सर्विस का उपयोग करने का प्रयास करें

मैं Winforms के साथ C # का उपयोग करके एक एप्लिकेशन बना रहा हूं और अब मुझे एक थर्मल प्रिंटर पर बिक्री की रसीद प्रिंट करने की आवश्यकता है। ऐसा करने के लिए, मैं एक टेक्स्ट फ़ाइल बना रहा हूं और इसे PrintDocument का उपयोग करके प्रिंट करने के लिए पढ़ रहा हूं, लेकिन मैं ऐसा नहीं कर सकता क्योंकि मुझे पता नहीं है कि पेपर का आकार कैसे कॉन्फ़िगर करें, पेपर पर टेक्स्ट सेंटर को संरेखित करें, और अन्य कॉन्फ़िगरेशन। जब मैं प्रिंट करता हूं तो टेक्स्ट फाइल प्रिंट होती है, लेकिन सभी गड़बड़ होती है, और एंड प्रिंट के बाद पेपर नहीं रुकता है।

मैं ये कैसे करूं ?

कोशिश कर रहे हैं।

private PrintDocument printDocument = new PrintDocument();
private static String RECEIPT = Environment.CurrentDirectory + @"\comprovantes\comprovante.txt";
private String stringToPrint = "";

private void button1_Click(object sender, EventArgs e)
{
    generateReceipt();
    printReceipt();
}

private void generateReceipt()
{
    FileStream fs = new FileStream(COMPROVANTE, FileMode.Create);
    StreamWriter writer = new StreamWriter(fs);
    writer.WriteLine("==========================================");
    writer.WriteLine("          NOME DA EMPRESA AQUI            ");
    writer.WriteLine("==========================================");
    writer.Close();
    fs.Close();
}

private void printReceipt()
{
    FileStream fs = new FileStream(COMPROVANTE, FileMode.Open);
    StreamReader sr = new StreamReader(fs);
    stringToPrint = sr.ReadToEnd();
    printDocument.PrinterSettings.PrinterName = DefaultPrinter.GetDefaultPrinterName();
    printDocument.PrintPage += new PrintPageEventHandler(printPage);
    printDocument.Print();
    sr.Close();
    fs.Close();
}

private void printPage(object sender, PrintPageEventArgs e)
{
    int charactersOnPage = 0;
    int linesPerPage = 0;
    Graphics graphics = e.Graphics;

    // Sets the value of charactersOnPage to the number of characters 
    // of stringToPrint that will fit within the bounds of the page.
    graphics.MeasureString(stringToPrint, this.Font,
        e.MarginBounds.Size, StringFormat.GenericTypographic,
        out charactersOnPage, out linesPerPage);

    // Draws the string within the bounds of the page
    graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
        e.MarginBounds, StringFormat.GenericTypographic);

    // Remove the portion of the string that has been printed.
    stringToPrint = stringToPrint.Substring(charactersOnPage);

    // Check to see if more pages are to be printed.
    e.HasMorePages = (stringToPrint.Length > 0);
}

मैं प्राप्ति का यह मॉडल बनाने की कोशिश कर रहा हूं।

आरडीएलसी का उपयोग करना, लेकिन प्रिंट शुरू करना बहुत धीमा है । मैं इस example का अनुसरण कर रहा हूं

//works but slow
private void Run() {
    LocalReport report = new LocalReport();
    report.ReportPath = @"..\..\reports\ReciboDeVenda.rdlc";
    Export(report);
    Print();
}

private void Export(LocalReport report) {
    string deviceInfo =
      @"<DeviceInfo>
        <OutputFormat>EMF</OutputFormat>
        <PageWidth>8.5in</PageWidth>
        <PageHeight>11in</PageHeight>
        <MarginTop>0.25in</MarginTop>
        <MarginLeft>0.25in</MarginLeft>
        <MarginRight>0.25in</MarginRight>
        <MarginBottom>0.25in</MarginBottom>
    </DeviceInfo>";
    Warning[] warnings;
    m_streams = new List<Stream>();
    report.Render("Image", deviceInfo, CreateStream,
       out warnings);
    foreach (Stream stream in m_streams)
        stream.Position = 0;
}

private Stream CreateStream(string name, string fileNameExtension, 
                            Encoding encoding, string mimeType, bool willSeek) {
        Stream stream = new MemoryStream();
        m_streams.Add(stream);
        return stream;
}

private void Print() {
    if (m_streams == null || m_streams.Count == 0)
        throw new Exception("Error: no stream to print.");
    PrintDocument printDoc = new PrintDocument();
    printDoc.PrinterSettings.PrinterName = DefaultPrinter.GetDefaultPrinterName();
    if (!printDoc.PrinterSettings.IsValid) {
        throw new Exception("Error: cannot find the default printer.");
    }else {
        printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
        m_currentPageIndex = 0;
        printDoc.Print();
    }
}

private void PrintPage(object sender, PrintPageEventArgs ev) {
    Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);

    // Adjust rectangular area with printer margins.
    Rectangle adjustedRect = new Rectangle(
        ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
        ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
        ev.PageBounds.Width,
        ev.PageBounds.Height);

    // Draw a white background for the report
    ev.Graphics.FillRectangle(Brushes.White, adjustedRect);

    // Draw the report content
    ev.Graphics.DrawImage(pageImage, adjustedRect);

    // Prepare for the next page. Make sure we haven't hit the end.
    m_currentPageIndex++;
    ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}

यदि आप अपने printPage(object sender, PrintEventArgs e) विधि को एक सादा स्ट्रिंग भेजते हैं, तो यह सभी समान फ़ॉन्ट में सादे पाठ को प्रिंट करेगा, जो 'गन्दा' दिखता है (जैसा कि आपने इसे नाम दिया है) यदि आप चाहते हैं कि इसे अच्छी तरह से मुद्रित किया जाए। विभिन्न फोंट (बोल्ड, नियमित), आपको यह सब मैन्युअल रूप से करना होगा:

List<string> itemList = new List<string>()
{
    "201", //fill from somewhere in your code
    "202"
};

private void printPage( object sender, PrintPageEventArgs e )
{
    Graphics graphics = e.Graphics;

    Font regular = new Font( FontFamily.GenericSansSerif, 10.0f, FontStyle.Regular );
    Font bold = new Font( FontFamily.GenericSansSerif, 10.0f, FontStyle.Bold );

    //print header
    graphics.DrawString( "FERREIRA MATERIALS PARA CONSTRUCAO LTDA", bold, Brushes.Black, 20, 10 );
    graphics.DrawString( "EST ENGENHEIRO MARCILAC, 116, SAO PAOLO - SP", regular, Brushes.Black, 30, 30 );
    graphics.DrawString( "Telefone: (11)5921-3826", regular, Brushes.Black, 110, 50 );
    graphics.DrawLine( Pens.Black, 80, 70, 320, 70 );
    graphics.DrawString( "CUPOM NAO FISCAL", bold, Brushes.Black, 110, 80 );
    graphics.DrawLine( Pens.Black, 80, 100, 320, 100 );

    //print items
    graphics.DrawString( "COD | DESCRICAO                      | QTY | X | Vir Unit | Vir Total |", bold, Brushes.Black, 10, 120 );
    graphics.DrawLine( Pens.Black, 10, 140, 430, 140 );

    for( int i = 0; i < itemList.Count; i++ )
    {
        graphics.DrawString( itemList[i].ToString(), regular, Brushes.Black, 20, 150 + i * 20 );
    }

    //print footer
    //...

    regular.Dispose();
    bold.Dispose();

    // Check to see if more pages are to be printed.
    e.HasMorePages = ( itemList.Count > 20 );
}

मेरे उदाहरण पर संभावित सुधार:

  • हेडर स्ट्रिंग्स को केंद्रित करना graphics.MeasureString() का उपयोग करके बेहतर किया जा सकता है। graphics.MeasureString()
  • वस्तुओं की सूची बेहतर होनी चाहिए जो एक सादे तार से बने व्यवसाय वर्ग की सूची हो

क्योंकि यह सब बहुत काम है, आपको अपने दस्तावेज़ों को डिज़ाइन करने के लिए वास्तव में RDLC या किसी तीसरे पक्ष के सॉफ़्टवेयर का उपयोग करने पर विचार करना चाहिए।





printdocument