2010-11-02 38 views
24

Czy są jakieś znane drukarki etykiet, które będą akceptować polecenia drukowania ze strony internetowej lub aplikacji internetowej?Drukowanie na drukarce etykiet ze strony internetowej/aplikacji internetowej?

Konkretnie, drukarki etykiet jednorazowych, takich jak Brother, Dymo, Zebra, itp

Czy ktoś miał sukcesy w druku tych drukarek (bez korzystania z przeglądarki Internet Explorer Tylko siekać lub kontrolki ActiveX)

Sądzę, że ostatecznie, w miarę wkraczania w świat bardziej zorientowany na przeglądarkę, konieczne będzie rozwiązanie.

+0

To wygląda obiecująco: [PrinterShare] (http://www.printeranywhere.com/) – drudge

Odpowiedz

3

Skrypt/strona internetowa kompatybilna z przeglądarką/platformą nie ma dostępu niskiego poziomu koniecznego do przesłania do drukarki polecenia języka drukarki (takiego jak język drukarki Zebra [ZPL]). W tym celu wymagana jest kontrolka ActiveX/plugin przeglądarki/aplet/podobny bit kodu wykonywalnego. To ograniczenie nie dotyczy drukarki, pochodzącej z przeglądarki, a nie producenta drukarki.

Jednak wiele drukarek etykiet pozwala drukować do nich tak, jakby były zwykłymi drukarkami - tylko tymi, które drukują na bardzo małe kawałki papieru. Możesz zaprojektować swoją etykietę za pomocą HTML/CSS. Podczas wyświetlania wyników, poinstruuj użytkownika, aby przejść do "Plik> Drukuj" i wybierz drukarkę etykiet przed kliknięciem przycisku drukowania.

Nadzieja to pomaga,
Ben

+2

+1 Dobry pomysł. Chociaż prawdopodobnie lepiej jest wysłać etykiety w formacie PDF, w ten sposób masz lepszą kontrolę nad formatowaniem wyjściowym niż przy użyciu HTML. – sleske

0

Można drukować z podpisanego apletu Java lub z Java Web Start aplikacji:

http://java.sun.com/javase/technologies/desktop/printing/

który powinien działać, jeśli formatowania wydruków tak pasuje do etykiet.

Pamiętaj, że większość nowoczesnych przeglądarek ogranicza obsługę apletów Java, więc możesz mieć problemy z apletem, w zależności od używanych przeglądarek. W szczególności Google Chrome będzie mieć numer stop supporting Java applets in September 2015. Ograniczenia te mają wartość , a nie. Dotyczy to aplikacji Java Web Start, która powinna nadal działać.

+0

Ta opcja wkrótce przestanie być użyteczna, ponieważ różni producenci przeglądarek ograniczają, a następnie usuwają możliwość wykonywania apletów Java: https://support.google.com/chrome/answer/1247383?hl=pl –

+0

Ponadto; https://support.google.com/chrome/answer/6213033 –

+0

@MarkCooper: Dziękujemy za informacje; Edytowałem swoją odpowiedź. – sleske

9

Drukarki Dymo mają wtyczkę do przeglądarki, która umożliwia drukowanie z poziomu javascript. Bardzo łatwy w użyciu.

Powtórzenie tego pytania kilka lat później.

Połączone w sieć drukarki Zebra można łatwo drukować. W jednym projekcie miałem aplikację internetową, która otworzyła gniazdo do drukarki i przekazała instrukcje w ZPL.

+0

Dzięki za dodanie linku do tego, miałbym trudności ze znalezieniem tego bez wiedzy o istnieniu. – Sam

23

Wow. Wiem, że zostało to zadane ponad 4 lata temu, ale po spaleniu przez większą część tygodnia w poszukiwaniu solidnej metody drukowania etykiet z aplikacji internetowej musiałem tu głosować.

Oto co znalazłem:

  • DYMO wydaje się najbardziej prawdopodobnym kandydatem do doskonałości. Ale nie, okazuje się, że drukuje tylko z (a) własnej aplikacji, lub (b) ze swojego SDK. Zestaw SDK DYMO wykorzystuje model rysowania XML, który jest zarówno zbyt skomplikowany, jak i ograniczony pod względem układu i stylu. Dokumentacja jest rozproszona i niezrozumiała (np. Jakie są wartości <Bounds> dla popularnych rozmiarów etykiet?) Nigdzie nie ma opisu parametrów znaczników!) Tak frustrujące, tak rozczarowujące.

  • Jest qz (was jzebra), który umożliwia drukowanie przeglądarki dla urządzeń, które mówią EPL, ZPL, FGL, ESC/POS, EPCL i CPCL ... który obejmuje szereg Zebra. Wymaga obciążenia integracyjnego (uruchomienie serwera sieciowego na urządzeniu, do którego podłączona jest drukarka etykiet), ale działa.

  • Jest dobrze zaprojektowany 3rd party app by Peninsula, który pracuje dla firmy DYMO (między innymi), ale wymaga średnim etap drukowania z przeglądarki PDF. Zakładają również, że nigdy nie skalisz tego, co chcesz wydrukować, mniej niż 70%, co jest nieprawidłowe.

OP mówi: "Sądzę, że ostatecznie, w miarę wkraczania w świat bardziej zorientowany na przeglądarkę, konieczne będzie rozwiązanie". Cztery lata później poszedłem o krok dalej i zasugerowałem, aby jakikolwiek drukarka etykiet, która nie może drukować poza przeglądarką (lub po prostu zachowywać się jak zwykła drukarka z małym papierem), traci potencjał. Układ w HTML + CSS jest bardzo prosty. Przeglądarki analizują to doskonale i renderują je w dowolnej rozdzielczości do dowolnego urządzenia wyjściowego. Wydaje się to takie oczywiste.

Jeśli ktoś wie o drukarce etykiet termicznych, która drukuje z przeglądarki, zamiast uwięzić cię w archaicznych metodach integracji, bardzo chciałbym wiedzieć!

+0

Mamy Dymo LabelWriter 450 Twin Turbo, który możemy wydrukować na przeglądarce. Mamy problemy z kontrolowaniem marginesu podczas drukowania html, ale drukuje. –

+0

@TimGautier - czy możesz uzyskać ten wydruk z przeglądarki po cichu? tj. bez wyświetlania okna dialogowego drukowania? –

+0

Nie. Myślę, że potrzebujesz czegoś w rodzaju wtyczki do przeglądarki, żeby zrobić coś takiego. Coś innego przejdzie przez okno dialogowe drukowania przeglądarki. –

4

Można również próbować szukać PrintNode, które zapewniają rozwiązanie drukowania w chmurze i oznacza, że ​​można drukować bezpośrednio na dowolnej drukarce przez Internet.

1

Zebra ma teraz narzędzie o nazwie "BrowserPrint", które działa podobnie do PrintNode dla drukarek Zebra. (w przeciwieństwie do Printnode, można go używać z drukarkami Zebra)

Niektóre drukarki mają również dostępne pliki ppd i/lub mogą być konfigurowane w kubkach na platformie Linux lub w inny sposób połączone i wypowiadane również za pośrednictwem linux. (co oznacza, że ​​nie jest niemożliwe użycie czegoś ze skryptów powłoki, php, perla lub innych metod drukowania do niego poprzez budowanie prostego demona serwera lub konfigurowanie czegoś takiego jak apache lub lighttpd na pudełku linuxowego lub nawet malinowego pi połączonego z drukarka)

+0

Oto link: https://www.zebra.com/us/en/products/software/barcode-printers/link-os/browser-print.html – David

0
using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Drawing; 
using System.Drawing.Printing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.IO; 
using System.ComponentModel; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Management; 
using System.Reflection; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

     GetAllPrinterList(); 
     this.textBox1.Attributes.Add(
    "onkeypress", "button_click(this,'" + this.Button1.ClientID + "')"); 
     this.lstPrinterList.Attributes.Add(
    "onkeypress", "button_click(this,'" + this.Button1.ClientID + "')"); 

    } 

    private void GetAllPrinterList() 
    { 
     //ManagementScope objScope = new ManagementScope(ManagementPath.DefaultPath); //For the local Access 
     //objScope.Connect(); 

     //SelectQuery selectQuery = new SelectQuery(); 
     //selectQuery.QueryString = "Select * from win32_Printer"; 
     //ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery); 
     //ManagementObjectCollection MOC = MOS.Get(); 
     //foreach (ManagementObject mo in MOC) 
     //{ 
     // lstPrinterList.Items.Add(mo["Name"].ToString()); 
     // //lstPrinterList.Items.Add(new ListItem(mo["Name"].ToString())); 

     //} 

     lstPrinterList.Items.Add("\\\\10.32.65.6\\Parcel-Zebra-FDX ZM400"); 
     lstPrinterList.Items.Add("\\\\10.32.65.4\\Singles_Station_Z_Printer"); 
     lstPrinterList.Items.Add("\\\\10.32.65.12\\ZebraZ4M-Packaging"); 
     if (lstPrinterList.Items.Count > 3) 
     { 
     lstPrinterList.Items.RemoveAt(5); 
     lstPrinterList.Items.RemoveAt(4); 
     lstPrinterList.Items.RemoveAt(3); 

     } 

     //LocalPrintServer printServer = new LocalPrintServer(); 
     //string printer; 
     //printer = LocalPrintServer.DefaultPrintQueue; 
     //System.Management.ObjectQuery oquery = 
     //  new System.Management.ObjectQuery("SELECT * FROM Win32_Printer"); 

     // System.Management.ManagementObjectSearcher mosearcher = 
     //  new System.Management.ManagementObjectSearcher(oquery); 

     // System.Management.ManagementObjectCollection moc = mosearcher.Get(); 

     // foreach (ManagementObject mo in moc) 
     // { 
     //  System.Management.PropertyDataCollection pdc = mo.Properties; 
     //  foreach (System.Management.PropertyData pd in pdc) 
     //  { 
     //   // if ((bool)mo["Network"]) 
     //   // { 
     //    lstPrinterList.Items.Add(mo["Name"].ToString()); 
     //   // } 
     //  } 
     // } 

     //} 
     //  using (var printServer = new PrintServer(string.Format(@"\\{0}", PrinterServerName))) 
     //{ 
     // foreach (var queue in printServer.GetPrintQueues()) 
     // { 
     //  if (!queue.IsShared) 
     //  { 
     //   continue; 
     //  } 
     //  Debug.WriteLine(queue.Name); 
     //  } 
     // } 
     //foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters) 
     //{ 
     //MessageBox.Show(printer); 
     //System.Web.UI.WebControls.ListBox lstPrinterList = new System.Web.UI.WebControls.ListBox(); 
     //System.Web.UI.WebControls.ListBox lstPrinterList = (System.Web.UI.WebControls.ListBox)Page.FindControl("lstPrinterList"); 
     //lstPrinterList.Text = "Zebra 110PAX4 (203 ;dpi)"; 

     //lstPrinterList.Items.Add(printer.ToString()); 
     //lstPrinterList.Items.Add(new ListItem(printer)); 
     //lstPrinterList.Items.Add(printer); 
     //System.Web.UI.WebControls.ListBox lstPrinterList = (System.Web.UI.WebControls.ListBox)Page.FindControl("ListBox1"); 
     //Zebra 110PAX4 (203 dpi) 
     //lstPrinterList.Items.Insert(printer); 
     //} 
    } 


    //private void lstPrinterList_OnClick(object sender, System.EventArgs e) 
    //{ 
    // // Get the currently selected item in the ListBox. 
    // string curItem = lstPrinterList.SelectedItem.ToString(); 

    // // Find the string in ListBox2. 
    // int index = lstPrinterList.DataTextField(curItem); 
    // //int index = lstPrinterList.FindString(curItem); 
    // //lstPrinterList.DataTextField(curItem); 
    // // If the item was not found in ListBox 2 display a message box, otherwise select it in ListBox2. 
    // if (index == -1) 
    //  MessageBox.Show("Item is not available in ListBox2"); 
    // else 
    //  lstPrinterList.SetSelected(index, true); 
    //} 

    //private void button1_Click(object sender, System.EventArgs e) 
    //{ 

    // string str = File.ReadAllText("lpn.prn"); 
    // str = str.Replace("BOX_TYPE", "boom"); 
    // str = str.Replace("11111111", textBox1.Text); 
    // File.WriteAllText("lpn.prn", str); 
    //   // Print the file to the printer. 
    // RawPrinterHelper.SendFileToPrinter("\\\\Zebra-FDX ZM400 200 dpi (ZPL)", "C:\\Users\\Administrator\\Documents\\Visual Studio 2015\\Projects\\WindowsFormsApplication4\\Prn Print\\bin\\Debug\\lpn.prn"); 
    //} 

    public void button1_Click(object sender, System.EventArgs e) 
    { 
     String prnFile = "lpn2.prn"; 
     string s = File.ReadAllText(prnFile); 
     string printer; 
     String Printer = lstPrinterList.SelectedItem.ToString(); 
     s = s.Replace("*description*", "snuffles"); 
     s = s.Replace("*barcode*", textBox1.Text); 
     //File.WriteAllText("PPlpn.prn", s); 
     //s = "^XA^LH30,30\n^FO20,10^ADN,90,50^AD^FDHello World^FS\n^XZ"; 
     printer = lstPrinterList.SelectedItem.Value; 
     PrintDialog pd = new PrintDialog(); 
     pd.PrinterSettings = new PrinterSettings(); 
     RawPrinterHelper.SendStringToPrinter(printer, s); 
     //RawPrinterHelper.SendStringToPrinter(Printer, s); 
     //Response.Redirect(Request.RawUrl.Replace(Request.Url.Query, "?__VIEWSTATE=%2%3D&ctl00%24MainContent%24textBox1=bp300&ctl00%24MainContent%24lstPrinterList=Shipping+Printer")); 




    } 
    protected void textBox1_TextChanged(object sender, EventArgs e) 
    { 

    } 
} 




public class RawPrinterHelper 
{ 
    // Structure and API declarions: 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public class DOCINFOA 
    { 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pDocName; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pOutputFile; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string pDataType; 
    } 
    [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd); 

    [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool ClosePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di); 

    [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool EndDocPrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool StartPagePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool EndPagePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten); 

    // SendBytesToPrinter() 
    // When the function is given a printer name and an unmanaged array 
    // of bytes, the function sends those bytes to the print queue. 
    // Returns true on success, false on failure. 
    public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount) 
    { 
     Int32 dwError = 0, dwWritten = 0; 
     IntPtr hPrinter = new IntPtr(0); 
     DOCINFOA di = new DOCINFOA(); 
     bool bSuccess = false; // Assume failure unless you specifically succeed. 
     di.pDocName = "My C#.NET RAW Document"; 
     di.pDataType = "RAW"; 

     // Open the printer. 
     if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 
     { 
      // Start a document. 
      if (StartDocPrinter(hPrinter, 1, di)) 
      { 
       // Start a page. 
       if (StartPagePrinter(hPrinter)) 
       { 
        // Write your bytes. 
        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); 
        EndPagePrinter(hPrinter); 
       } 
       EndDocPrinter(hPrinter); 
      } 
      ClosePrinter(hPrinter); 
     } 
     // If you did not succeed, GetLastError may give more information 
     // about why not. 
     if (bSuccess == false) 
     { 
      dwError = Marshal.GetLastWin32Error(); 
     } 
     return bSuccess; 
    } 

    public static bool SendFileToPrinter(string szPrinterName, string szFileName) 
    { 
     // Open the file. 
     FileStream fs = new FileStream(szFileName, FileMode.Open); 
     // Create a BinaryReader on the file. 
     BinaryReader br = new BinaryReader(fs); 
     // Dim an array of bytes big enough to hold the file's contents. 
     Byte[] bytes = new Byte[fs.Length]; 
     bool bSuccess = false; 
     // Your unmanaged pointer. 
     IntPtr pUnmanagedBytes = new IntPtr(0); 
     int nLength; 

     nLength = Convert.ToInt32(fs.Length); 
     // Read the contents of the file into the array. 
     bytes = br.ReadBytes(nLength); 
     // Allocate some unmanaged memory for those bytes. 
     pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength); 
     // Copy the managed byte array into the unmanaged array. 
     Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength); 
     // Send the unmanaged bytes to the printer. 
     bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength); 
     // Free the unmanaged memory that you allocated earlier. 
     Marshal.FreeCoTaskMem(pUnmanagedBytes); 
     return bSuccess; 
    } 

    public static bool SendStringToPrinter(string szPrinterName, string szString) 
    { 
     IntPtr pBytes; 
     Int32 dwCount; 
     // How many characters are in the string? 
     dwCount = szString.Length; 
     // Assume that the printer is expecting ANSI text, and then convert 
     // the string to ANSI text. 
     pBytes = Marshal.StringToCoTaskMemAnsi(szString); 
     // Send the converted ANSI string to the printer. 
     SendBytesToPrinter(szPrinterName, pBytes, dwCount); 
     Marshal.FreeCoTaskMem(pBytes); 
     return true; 
    } 
} 

To jest to, co stworzyłem w C# i wszystko działało świetnie. To jest aplikacja internetowa.

Powiązane problemy