2008-10-20 3 views
7

के साथ प्रिंटर पर दस्तावेज़ भेजें मुझे आंतरिक वेब एप्लिकेशन के लिए प्रिंटर को पारदर्शी रूप से दस्तावेज़ भेजने की आवश्यकता दी गई है। विचार यह होगा कि उपयोगकर्ता अपने निकटतम प्रिंटर का चयन कर सकते हैं, और वेब एप्लिकेशन उनके प्रिंट जॉब्स को उनके द्वारा चुने गए प्रिंटर पर भेज देगा।सी #

कैनन्स के खिलाफ हमें रोल करने वाला पहला प्रिंटर है, इसलिए मेरे प्रश्न हैं: मैं एक विशिष्ट कैनन के लिए नेटवर्क को प्रिंट करने के लिए दस्तावेज़ भेजने के बारे में कैसे जाउंगा? कैनन का प्रकार एक आईआर 5570 है और दस्तावेज जो कहा जाएगा मुख्य रूप से शब्द और पीडीएफ

मैं वर्तमान में भयानक, आईई केवल कैनन डेवलपर साइट के माध्यम से अपना रास्ता काम कर रहा हूं, लेकिन मैं किसी को उम्मीद कर रहा हूं मुझे सही दिशा में इंगित कर सकता है या मुझे किसी तृतीय पक्ष असेंबली पर इंगित कर सकता है :)

उत्तर

6

है कि प्रश्न में कुंजी वाक्यांश 'वेब अनुप्रयोग' है।

HTTP पर केवल HTML + जावास्क्रिप्ट का उपयोग करते हुए एक सामान्य वेब ऐप में, आप नहीं कर सकते हैं बस एक प्रिंटर पर एक दस्तावेज़ भेजें। वेब ब्राउजर मौजूद होने के कारणों में से एक कारण है, और उस कार्यक्षमता के बिना हर कोई प्रिंटर उसी तरह का जंक इकट्ठा करेगा जो एक सार्वजनिक फैक्स मशीन करता है।

तो आपको किसी प्रकार के काम की ज़रूरत है। एक विकल्प एक सामान्य प्लग-इन, जैसे फ्लैश, सिल्वरलाइट, जावा एप्लेट, या यहां तक ​​कि greasemonkey की तरह कुछ बनाना है। दूसरा एक कस्टम प्लग-इन है, जैसे होस्टेड विनफॉर्म नियंत्रण या कस्टम ब्राउज़र एक्सटेंशन।

आप बहुत भाग्यशाली हैं, ऐसा लगता है कि आपके पास तैनाती पर्यावरण का पूर्ण नियंत्रण (या ज्ञान) है, और यह वातावरण काफी समरूप है। इसका मतलब है कि आपके पास एक अतिरिक्त विकल्प है जिसे अन्य ने एक्सप्लोर करना शुरू कर दिया है। यदि आप वेब सर्वर पर अपने पर्यावरण के सभी प्रिंटर इंस्टॉल कर सकते हैं, तो उन प्रिंटर को सूचीबद्ध करने के लिए अंतर्निहित .NET प्रिंटर क्लासेस (System.Drawing.Printing नेमस्पेस में) का उपयोग करके यह काफी आसान है, या तो उन्हें उपयोगकर्ता को दिखाएं ताकि वे प्रिंटर मैपिंग टेबल पर किसी प्रकार का आईपी चुनें या फिर अपने वेब ऐप से सीधे उस प्रिंटर पर प्रिंट करें। ध्यान दें कि इस योजना के लिए अन्यथा आवश्यक होने की तुलना में आपके ऐप को उच्च स्तर के ट्रस्ट पर चलाने की आवश्यकता हो सकती है।

अब वास्तव में आपके पीडीएफ और शब्द दस्तावेज़ों को प्रिंट करने की बात आती है। एक्रोबैट के लिए, इस लिंक को जांचें:
http://support.adobe.com/devsup/devsup.nsf/docs/52080.htm (वेबैक मशीन)
ध्यान दें कि यह थोड़ा दिनांकित है, लेकिन मेरा मानना ​​है कि अवधारणा अभी भी मान्य है। आपको यह सुनिश्चित करने के लिए कुछ प्रयोग करना होगा कि यह अपेक्षा के अनुसार काम करता है।

शब्द के लिए, मैं आमतौर पर एक वेब ऐप में ऑफिस इंटरऑप/ऑटोमेशन का प्रशंसक नहीं हूं। लेकिन इस मामले में आप किसी भी दस्तावेज को संपादित नहीं कर रहे हैं: प्रिंट करने के लिए इसे लंबे समय तक लोड करना। और तथ्य यह है कि आप किसी अन्य दुर्लभ संसाधन (प्रिंटर) पर भरोसा कर रहे हैं, इसे अपने वेब सर्वर के साथ सामना करने से परे स्केलिंग से रखना चाहिए। तो आपके पास एक दुर्लभ मामला हो सकता है जहां एक वेब प्रोजेक्ट में कार्यालय स्वचालन समझ में आता है।

+0

मेरे पास तैनाती पर्यावरण का पूर्ण नियंत्रण है, यह एक आंतरिक इंट्रानेट एप्लिकेशन है। कार्यालय इंटरऑप/ऑटोमेशन भयानक है, और जब दस्तावेज़ सी # द्वारा उत्पन्न होते हैं, तो हम Aspose.Words का उपयोग करते हैं। मैं मुद्रण के लिए interop.automation का उपयोग कर स्वीकार कर सकते हैं, इसे एक कोशिश देने जा रहा है। –

+1

यदि आपके पास पहले से ही है, तो आप जांच सकते हैं कि यह प्रिंटिंग का समर्थन करता है या नहीं। –

+0

लेकिन निश्चित रूप से सहमत हैं कि 99% मामलों में कार्यालय इंटरऑप भयानक है। –

0

यदि प्रश्न में दस्तावेज़ प्रकार विंडोज़ (जिसे डीओसी और पीडीएफ होना चाहिए) के रूप में जाना जाता है, तो क्या आप इसे करने के लिए विंडोज क्रियाओं का उपयोग कर सकते हैं?

Codeproject PDF example : Automated PDF Conversion using the PDF995 and FreePDF_XP Freeware Printers MSDN : Verbs and File Associations

1

PrintDocument प्रलेखन सी # से छपाई की एक विस्तृत उदाहरण में शामिल है। प्रिंटर नाम को स्थानीय प्रिंटर या प्रिंटर शेयर को इंगित करना चाहिए। पीडीएफ दस्तावेज़ों को प्रिंट करने के लिए printing-to-a-pdf-printer-programatically देखें।

+0

क्या यह केवल txt फ़ाइल के साथ काम करता है? –

+0

पहला उदाहरण टेक्स्ट (लाइन) दस्तावेज़ प्रदर्शित करता है, लेकिन प्रिंट डॉक्यूमेंट क्लास ड्राइंग के लिए ग्राफिक्स ऑब्जेक्ट का उपयोग करता है। इसका मतलब है कि आप सिस्टम की शक्ति का उपयोग कर सकते हैं। ड्रॉइंग (जीडीआई +) नेमस्पेस। – gimel

+0

आह मैं देखता हूं .. लेकिन मुझे लगता है कि इस वर्ग का उपयोग कर मालिकाना प्रारूप (एमएस वर्ड की तरह) समर्थित नहीं है? –

1

प्रिंटर को समझने वाले किसी चीज़ में आपके वर्ड और पीडीएफ दस्तावेजों का कुछ अनुवाद करना है। आम तौर पर यह पूर्व के लिए शब्द होगा, और बाद के लिए किसी प्रकार का पीडीएफ व्यूअर होगा। तब उन कार्यक्रमों को निर्देश दिया जाना चाहिए कि किस प्रिंटर को आउटपुट भेजना है।

दस्तावेजों को पोस्टस्क्रिप्ट फ़ाइलों के रूप में सहेजने का एक संभावित तरीका होगा। फिर उन्हें एक सी # आवेदन से सीधे एक पोस्टस्क्रिप्ट सक्षम प्रिंटर पर भेजा जा सकता है। यह शायद ऐसा करने का सबसे आसान तरीका होगा।

1

एसक्यूएल रिपोर्टिंग सेवा की क्षमताओं को जांचने के लिए 5 मिनट के लायक हो सकते हैं। मैंने इसे अतीत में पीडीएफ को सीधे प्रिंट करने के लिए प्रस्तुत किया है।

http://blogs.msdn.com/bryanke/articles/71491.aspx

6

कई प्रिंटर और मल्टीफंक्शन डिवाइस आज पीडीएफ के प्रिंटिंग का समर्थन करते हैं, इससे आपकी समस्याओं में से एक हल हो सकता है। बस प्रिंटर को पीडीएफ भेजा गया है। वास्तव में, कुछ यूआरएल भेजने के लिए भी समर्थन करते हैं और प्रिंटर दस्तावेज प्राप्त करेंगे और इसे प्रिंट करेंगे। निश्चित रूप से लेक्समार्क यह करता है और मुझे लगता है कि कुछ अन्य विक्रेता भी करते हैं। इसका अभी भी मतलब है कि आपको Word दस्तावेज़ से निपटना होगा। वर्ड 2007 पीडीएफ का समर्थन करता है (add-in installed from Microsoft के साथ) और मैंने सी # में बड़ी सफलता के साथ इस समारोह का प्रोग्रामेटिक रूप से उपयोग किया है।

Microsoft.Office.Interop.Word.ApplicationClass msWord = new Microsoft.Office.Interop.Word.ApplicationClass(); 

object paramUnknown = Type.Missing; 
object missing = Type.Missing; 
object paramSaveChangesNo = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges; 
//object paramFonts = Microsoft.Office.Interop.Word.wde 
object paramFormatPDF = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF; 
object paramTrue = true; 
object paramReadOnly = true; 
object sourceDoc = @"c:\input.doc"        
object target = @"c:\output.pdf"; 

msWord.Visible = false; 

//open .doc 
msWord.Documents.Open(ref sourceDoc, ref paramUnknown, ref paramReadOnly, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown); 

//so it won't show on the taskbar 
msWord.Application.Visible = false; 
msWord.WindowState = Microsoft.Office.Interop.Word.WdWindowState.wdWindowStateMinimize; 

//save .doc to new target name and format 
msWord.ActiveDocument.SaveAs(ref targetDoc, ref paramFormatPDF, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramTrue, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown, ref paramUnknown); 

msWord.ActiveDocument.Close(ref missing, ref missing, ref missing); 

msWord.Quit(ref paramSaveChangesNo, ref paramUnknown, ref paramUnknown); 

अन्त में, अपने डिवाइस पीडीएफ मुद्रण का समर्थन नहीं करता तो आप Ghostscript या अन्य उपकरणों का उपयोग कर सकता है पुनश्च या यहाँ तक कि पीसीएल के लिए अपने पीडीएफ कन्वर्ट करने के लिए:

यहाँ उस के लिए कोड है। सबसे बड़ा नहीं है क्योंकि इसका मतलब है कि थोड़ा अप्रबंधित कोड या सबसे खराब मामला, जीएस कमांड लाइन को खोलना और निष्पादित करना, कहा जा रहा है कि हम वर्तमान में इसे अपने वेब ऐप्स में से एक में करते हैं और यह अच्छी तरह से काम करता है। एक तरफ के रूप में, हम प्रिंट के लिए ऐसा नहीं करते हैं बल्कि कई पीडीएफ टॉगल में शामिल होने के बजाय नहीं करते हैं, लेकिन अंत में यह वही काम करेगा।

-1

इस कोड को पूरी तरह से काम करता है यह एडोब रीडर ही उपयोग करता

संकेत मुद्रित करने के लिए 1- उपयोग करने के लिए मत भूलना प्रिंटर के गुण से 2- जाओ प्रिंटर नाम एडोब रीडर के लिए अपने स्वयं के स्थापित पथ प्रदान करने के लिए आप के साथ

उपयोग इस तरह वर्ग प्रिंट करना चाहते हैं:

PdfFilePrinter p = new PdfFilePrinter(); 

p.PdfFileName = @"c:\1.pdf"; 
p.Print(); 
p.PdfFileName = @"c:\2.pdf"; 
p.Print(); 

और वर्ग है:

public class PdfFilePrinter 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="PdfFilePrinter"/> class. 
    /// </summary> 
    public PdfFilePrinter() 
    { 
     adobeReaderPath = @"C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"; 
     printerName = "HP LaserJet P2055 Series PCL6"; 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="PdfFilePrinter"/> class. 
    /// </summary> 
    /// <param name="pdfFileName">Name of the PDF file.</param> 
    public PdfFilePrinter(string pdfFileName) 
    { 
     this.PdfFileName = pdfFileName; 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="PdfFilePrinter"/> class. 
    /// </summary> 
    /// <param name="pdfFileName">Name of the PDF file.</param> 
    /// <param name="printerName">Name of the printer.</param> 
    public PdfFilePrinter(string pdfFileName, string printerName) 
    { 
     this.pdfFileName = pdfFileName; 
     this.printerName = printerName; 
    } 

    /// <summary> 
    /// Gets or sets the name of the PDF file to print. 
    /// </summary> 
    public string PdfFileName 
    { 
     get { return this.pdfFileName; } 
     set { this.pdfFileName = value; } 
    } 
    string pdfFileName; 

    /// <summary> 
    /// Gets or sets the name of the printer. A typical name looks like '\\myserver\HP LaserJet PCL5'. 
    /// </summary> 
    /// <value>The name of the printer.</value> 
    public string PrinterName 
    { 
     get { return this.printerName; } 
     set { this.printerName = value; } 
    } 
    string printerName; 

    /// <summary> 
    /// Gets or sets the working directory. 
    /// </summary> 
    public string WorkingDirectory 
    { 
     get { return this.workingDirectory; } 
     set { this.workingDirectory = value; } 
    } 
    string workingDirectory; 

    /// <summary> 
    /// Prints the PDF file. 
    /// </summary> 
    public void Print() 
    { 
     Print(-1); 
    } 

    /// <summary> 
    /// Prints the PDF file. 
    /// </summary> 
    /// <param name="milliseconds">The number of milliseconds to wait for completing the print job.</param> 
    public void Print(int milliseconds) 
    { 
     if (this.printerName == null || this.printerName.Length == 0) 
      this.printerName = PdfFilePrinter.defaultPrinterName; 

     if (PdfFilePrinter.adobeReaderPath == null || PdfFilePrinter.adobeReaderPath.Length == 0) 
      throw new InvalidOperationException("No full qualified path to AcroRd32.exe or Acrobat.exe is set."); 

     if (this.printerName == null || this.printerName.Length == 0) 
      throw new InvalidOperationException("No printer name set."); 

     // Check whether file exists. 
     string fqName = String.Empty; 
     if (this.workingDirectory != null && this.workingDirectory.Length != 0) 
      fqName = Path.Combine(this.workingDirectory, this.pdfFileName); 
     else 
      fqName = Path.Combine(Directory.GetCurrentDirectory(), this.pdfFileName); 
     if (!File.Exists(fqName)) 
      throw new InvalidOperationException(String.Format("The file {0} does not exist.", fqName)); 

     // TODO: Check whether printer exists. 

     try 
     { 
      DoSomeVeryDirtyHacksToMakeItWork(); 

      //acrord32.exe /t   <- seems to work best 
      //acrord32.exe /h /p  <- some swear by this version 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.FileName = PdfFilePrinter.adobeReaderPath; 
      string args = String.Format("/t \"{0}\" \"{1}\"", this.pdfFileName, this.printerName); 
      //Debug.WriteLine(args); 
      startInfo.Arguments = args; 
      startInfo.CreateNoWindow = true; 
      startInfo.ErrorDialog = false; 
      startInfo.UseShellExecute = false; 
      if (this.workingDirectory != null && this.workingDirectory.Length != 0) 
       startInfo.WorkingDirectory = this.workingDirectory; 

      Process process = Process.Start(startInfo); 
      if (!process.WaitForExit(milliseconds)) 
      { 
       // Kill Adobe Reader/Acrobat 
       process.Kill(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    /// <summary> 
    /// For reasons only Adobe knows the Reader seams to open and shows the document instead of printing it 
    /// when it was not already running. 
    /// If you use PDFsharp and have any suggestions to circumvent this function, please let us know. 
    /// </summary> 
    void DoSomeVeryDirtyHacksToMakeItWork() 
    { 
     if (PdfFilePrinter.runningAcro != null) 
     { 
      if (!PdfFilePrinter.runningAcro.HasExited) 
       return; 
      PdfFilePrinter.runningAcro.Dispose(); 
      PdfFilePrinter.runningAcro = null; 
     } 
     // Is any Adobe Reader/Acrobat running? 
     Process[] processes = Process.GetProcesses(); 
     int count = processes.Length; 
     for (int idx = 0; idx < count; idx++) 
     { 
      try 
      { 
       Process process = processes[idx]; 
       ProcessModule module = process.MainModule; 

       if (String.Compare(Path.GetFileName(module.FileName), Path.GetFileName(PdfFilePrinter.adobeReaderPath), true) == 0) 
       { 
        // Yes: Fine, we can print. 
        PdfFilePrinter.runningAcro = process; 
        break; 
       } 
      } 
      catch { } 
     } 
     if (PdfFilePrinter.runningAcro == null) 
     { 
      // No: Start an Adobe Reader/Acrobat. 
      // If you are within ASP.NET, good luck... 
      PdfFilePrinter.runningAcro = Process.Start(PdfFilePrinter.adobeReaderPath); 
      PdfFilePrinter.runningAcro.WaitForInputIdle(); 
     } 
    } 
    static Process runningAcro; 

    /// <summary> 
    /// Gets or sets the Adobe Reader or Adobe Acrobat path. 
    /// A typical name looks like 'C:\Program Files\Adobe\Adobe Reader 7.0\AcroRd32.exe'. 
    /// </summary> 
    static public string AdobeReaderPath 
    { 
     get { return PdfFilePrinter.adobeReaderPath; } 
     set { PdfFilePrinter.adobeReaderPath = value; } 
    } 
    static string adobeReaderPath; 

    /// <summary> 
    /// Gets or sets the name of the default printer. A typical name looks like '\\myserver\HP LaserJet PCL5'. 
    /// </summary> 
    static public string DefaultPrinterName 
    { 
     get { return PdfFilePrinter.defaultPrinterName; } 
     set { PdfFilePrinter.defaultPrinterName = value; } 
    } 
    static string defaultPrinterName; 
} 
+0

'यह कोड पूरी तरह से काम करता है' - थोड़ा overoptimistic – jwg

+0

मुझे यकीन है कि यह काम कर रहा है आप इसके बजाय मामले की मदद करने के लिए संपर्क कर सकते हैं -1 –