c# समस सी#में छपाई संवाद के बिना विंडोज सर्विस से एचटीएमएल दस्तावेज़ मुद्रित करें




मुद्रण कलेचा इतिहास मराठी (3)

वादिम की सीमा में जोड़ने के लिए आप का उपयोग करके प्रिंट करने से पहले डिफ़ॉल्ट प्रिंटर सेट कर सकते हैं:

    static void SetAsDefaultPrinter(string printerDevice)
    {
        foreach (var printer in PrinterSettings.InstalledPrinters)
        {
            //verify that the printer exists here
        }
        var path = "win32_printer.DeviceId='" + printerDevice + "'";
        using (var printer = new ManagementObject(path))
        {
            printer.InvokeMethod("SetDefaultPrinter",
                                 null, null);
        }

        return;
    }

और साथ ही PrintHtml विधि को थोड़ा बदलना:

    public void PrintHtml(string htmlPath, string printerDevice)
    {
        if (!string.IsNullOrEmpty(printerDevice))
            SetAsDefaultPrinter(printerDevice);


        Task.Factory.StartNew(() => PrintOnStaThread(htmlPath), CancellationToken.None, TaskCreationOptions.None, _sta).Wait();
    }

अब मुझे नहीं पता है कि भारी प्रिंटिंग माहौल में यह कैसे उचित होगा कि एक छोटे प्रिंटर को बदलने के साथ संगतता समस्याएं हो सकती हैं। लेकिन अभी तक यह सबसे अच्छा है कि मैं इस सीमा को ठीक करने के लिए आया हूं।

मैं एक खिड़की सेवा का उपयोग कर रहा हूँ और जब मैं सेवा प्रारंभ करूँगा तो मैं .html पृष्ठ प्रिंट करना चाहता हूं। मैं इस कोड का उपयोग कर रहा हूं और यह अच्छी तरह प्रिंट कर रहा है। लेकिन प्रिंट डायलॉग बॉक्स आता है, मैं प्रिंट डायलॉग बॉक्स के बिना कैसे प्रिंट करूं?

public void printdoc(string document)
{
    Process printjob = new Process();
    printjob.StartInfo.FileName = document;
    printjob.StartInfo.UseShellExecute = true;
    printjob.StartInfo.Verb = "print";
    printjob.StartInfo.CreateNoWindow = true;
    printjob.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    printjob.Start();
}

प्रिंट डायलॉग बॉक्स को प्रदर्शित किए बिना प्रिंट करने का कोई अन्य तरीका क्या है?

अग्रिम धन्यवाद, अनुप पाल


यहाँ पवित्र कंघी बनानेवाले की रेती है

StaTaskScheduler का लाभ उठाते हुए (समानांतर एक्सटेंशन एक्स्ट्रा से लिया गया ( कोड गैलरी पर जारी ))।

विशेषताएं: मुद्रण पूरा होने की प्रतीक्षा करता है, प्रिंट सेटिंग्स नहीं दिखाता, उम्मीद है कि विश्वसनीय।

सीमाएं: सी # 4.0 की आवश्यकता है, डिफ़ॉल्ट प्रिंटर का उपयोग करता है, प्रिंट टेम्पलेट को बदलने की अनुमति नहीं देता है

    TaskScheduler Sta = new StaTaskScheduler(1);
    public void PrintHtml(string htmlPath)
    {
        Task.Factory.StartNew(() => PrintOnStaThread(htmlPath), CancellationToken.None, TaskCreationOptions.None, Sta).Wait();
    }

    void PrintOnStaThread(string htmlPath)
    {
        const short PRINT_WAITFORCOMPLETION = 2;
        const int OLECMDID_PRINT = 6;
        const int OLECMDEXECOPT_DONTPROMPTUSER = 2;
        using(var browser = new WebBrowser())
        {
            browser.Navigate(htmlPath);
            while(browser.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();

            dynamic ie = browser.ActiveXInstance;
            ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION);
        }
    }

//--------------------------------------------------------------------------
// 
//  Copyright (c) Microsoft Corporation.  All rights reserved. 
// 
//  File: StaTaskScheduler.cs
//
//--------------------------------------------------------------------------

using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;

namespace System.Threading.Tasks.Schedulers
{
    /// <summary>Provides a scheduler that uses STA threads.</summary>
    public sealed class StaTaskScheduler : TaskScheduler, IDisposable
    {
        /// <summary>Stores the queued tasks to be executed by our pool of STA threads.</summary>
        private BlockingCollection<Task> _tasks;
        /// <summary>The STA threads used by the scheduler.</summary>
        private readonly List<Thread> _threads;

        /// <summary>Initializes a new instance of the StaTaskScheduler class with the specified concurrency level.</summary>
        /// <param name="numberOfThreads">The number of threads that should be created and used by this scheduler.</param>
        public StaTaskScheduler(int numberOfThreads)
        {
            // Validate arguments
            if (numberOfThreads < 1) throw new ArgumentOutOfRangeException("concurrencyLevel");

            // Initialize the tasks collection
            _tasks = new BlockingCollection<Task>();

            // Create the threads to be used by this scheduler
            _threads = Enumerable.Range(0, numberOfThreads).Select(i =>
            {
                var thread = new Thread(() =>
                {
                    // Continually get the next task and try to execute it.
                    // This will continue until the scheduler is disposed and no more tasks remain.
                    foreach (var t in _tasks.GetConsumingEnumerable())
                    {
                        TryExecuteTask(t);
                    }
                });
                thread.IsBackground = true;
                thread.SetApartmentState(ApartmentState.STA);
                return thread;
            }).ToList();

            // Start all of the threads
            _threads.ForEach(t => t.Start());
        }

        /// <summary>Queues a Task to be executed by this scheduler.</summary>
        /// <param name="task">The task to be executed.</param>
        protected override void QueueTask(Task task)
        {
            // Push it into the blocking collection of tasks
            _tasks.Add(task);
        }

        /// <summary>Provides a list of the scheduled tasks for the debugger to consume.</summary>
        /// <returns>An enumerable of all tasks currently scheduled.</returns>
        protected override IEnumerable<Task> GetScheduledTasks()
        {
            // Serialize the contents of the blocking collection of tasks for the debugger
            return _tasks.ToArray();
        }

        /// <summary>Determines whether a Task may be inlined.</summary>
        /// <param name="task">The task to be executed.</param>
        /// <param name="taskWasPreviouslyQueued">Whether the task was previously queued.</param>
        /// <returns>true if the task was successfully inlined; otherwise, false.</returns>
        protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
        {
            // Try to inline if the current thread is STA
            return
                Thread.CurrentThread.GetApartmentState() == ApartmentState.STA &&
                TryExecuteTask(task);
        }

        /// <summary>Gets the maximum concurrency level supported by this scheduler.</summary>
        public override int MaximumConcurrencyLevel
        {
            get { return _threads.Count; }
        }

        /// <summary>
        /// Cleans up the scheduler by indicating that no more tasks will be queued.
        /// This method blocks until all threads successfully shutdown.
        /// </summary>
        public void Dispose()
        {
            if (_tasks != null)
            {
                // Indicate that no new tasks will be coming in
                _tasks.CompleteAdding();

                // Wait for all threads to finish processing tasks
                foreach (var thread in _threads) thread.Join();

                // Cleanup
                _tasks.Dispose();
                _tasks = null;
            }
        }
    }
}

खिड़कियों सेवा में माइक्रोसॉफ्ट वेब ब्राउज़र नियंत्रण काम नहीं कर रहा है मैंने उस कोड का इस्तेमाल किया था जो इसे विंडोज़ अनुप्रयोग में ठीक काम कर रहा है, लेकिन जब मैं एक खिड़की सेवा के भीतर उपयोग कर रहा हूं तो प्रोग्राम इस लाइन में फंस रहा हो

axWebBrowser1.Navigate (@ "सी: \ mydoc.html", रिक्त खाली, रिक्त खाली, रिक्त खाली, रिक्त खाली);

उत्तर के लिए धन्यवाद, अनुप पाल





printing