2012-01-11 24 views
10

पर प्रिंटिंग पीएनजी छवियां मैं ज़ेबरा में छवियों को प्रिंट करने का एक तरीका ढूंढने और बहुत परेशानी होने का प्रयास करने की कोशिश कर रहा हूं।एक जेबरा नेटवर्क प्रिंटर

डॉक्स के अनुसार:

पहले एन्कोडिंग, B64 के रूप में जाना जाता है, माइम Base64 योजना का उपयोग कर डेटा encodes। बेस 64 का उपयोग ई-मेल एटैचमेंट्स को एन्कोड करने के लिए किया जाता है ...
बेस 64 अनगिनत डेटा पर 33 प्रतिशत के विस्तार के लिए बाइट को छह बिट्स एन्कोड करता है।
दूसरा एन्कोडिंग, जिसे Z64, के नाम से जाना जाता है, पहले आकार को कम करने के लिए LZ77 एल्गोरिदम का उपयोग कर डेटा को संपीड़ित करता है। (यह एल्गोरिदम पीकेजेआईपी द्वारा उपयोग किया जाता है और पीएनजी ग्राफिक्स प्रारूप में अंतरगणित है।)
संपीड़ित डेटा को ऊपर वर्णित अनुसार एमआईएमई बेस 64 योजना का उपयोग करके एन्कोड किया जाता है।
बेस 64-एन्कोडेड डेटा के पार एक सीआरसी की गणना की जाएगी।

लेकिन इसमें बहुत अधिक जानकारी नहीं है।

var initialArray = GetItemFromPath("C:\\RED.png"); 
string converted = Convert.ToBase64String(b); 

PrintThis(string.Format(@"~DYRED.PNG,P,P,{1},0,:B64: 
{0} 
^XA 
^F0200,200^XGRED.PNG,1,1^FS 
^XZ", converted .ToString(), initialArray.Length)); 

इसके बारे में लगता है, या तो B64 या Z64 दोनों स्वीकार कर रहे हैं से:

मूल रूप से मैं

private byte[] GetItemFromPath(string filepath) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     using (Image img = Image.FromFile(filepath)) 
     { 
      img.Save(ms, ImageFormat.Png); 
      return ms.ToArray(); 
     } 
    } 
} 

तब की तरह कुछ के साथ प्रिंट करने का प्रयास के साथ एन्कोडिंग कोशिश कर रहा था।

मैंने सीआरसी उत्पन्न करने और 'आकार' की गणना करने के लिए कुछ बदलावों और कुछ तरीकों की कोशिश की है। लेकिन कोई भी काम नहीं कर रहा है और प्रिंटर को ग्राफिक्स का डाउनलोड हमेशा निरस्त हो रहा है।

क्या कोई इस तरह कुछ पूरा करने में कामयाब रहा है? या जानता है कि मैं कहां गलत हो रहा हूं?

+1

मुझे मानक विंडोज प्रिंटिंग का उपयोग करके सबसे अधिक सफलता मिली है। यानी एक छवि मुद्रित करें जैसा कि आप एक मानक प्रिंटर के लिए करेंगे। प्रिंटर सेटिंग्स/स्टॉक प्रदान करना सही ढंग से सेट किया गया है, यह ठीक प्रिंट करेगा। –

+1

यह एक मार्ग है जिसे मैंने देखा है, लेकिन मुझे नहीं लगता कि मैं प्रत्येक पीसी पर ड्राइवर स्थापित करने में सक्षम हूं (वे सभी एक साइट्रिक्स फार्म पर हैं) और प्रत्येक मशीन को स्थानीय रूप से प्रिंटर संलग्न नहीं कर सकते हैं यह। –

+1

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

उत्तर

1

जेपीएल मैनुअल को देखने के बाद आपको छवि के लिए साइक्लिक रिडंडेंसी चेक (सीआरसी) की गणना करने की आवश्यकता है। यहाँ कुछ सी कोड है कि सीआरसी (source) की गणना करता है:

// Update the CRC for transmitted and received data using 
// the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1). 

unsigned char ser_data; 
static unsigned int crc; 

crc = (unsigned char)(crc >> 8) | (crc << 8); 
crc ^= ser_data; 
crc ^= (unsigned char)(crc & 0xff) >> 4; 
crc ^= (crc << 8) << 4; 
crc ^= ((crc & 0xff) << 4) << 1; 

तुम भी, सीआरसी पर विकिपीडिया के पेज का उल्लेख कर सकते के रूप में यह अन्य कोड उदाहरण के रूप में अच्छी तरह से शामिल हैं।

https://en.wikipedia.org/wiki/Cyclic_redundancy_check

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

+4

की तरह कुछ चाहिए और यही कारण है कि केवल लिंक ही खराब हैं - यह लिंक मर चुका है :( –

12

इस उत्तर में आने के लिए मेरे लिए सभी क्रेडिट LabView Forum उपयोगकर्ता Raydur से था। वह एक लैब व्यू समाधान पोस्ट करता है जिसे छवियों को नीचे भेजने के लिए लैबव्यू में खोला जा सकता है। मैंने व्यक्तिगत रूप से इसे अपने प्रिंटर से नहीं चलाया, मैंने अभी सही छवि कोड को समझने के लिए इसका इस्तेमाल किया ताकि मैं इसे अपने कोड में दोहरा सकूं। बड़ी चीज जो मैं लापता था वह मेरे हेक्साडेसिमल कोड को पैडिंग कर रहा था। उदाहरण के लिए: 1 ए ठीक है, लेकिन यदि आपके पास केवल ए है, तो आपको 0 ए भेजने के लिए इसके सामने 0 को पैड करना होगा। आपके द्वारा भेजे जा रहे जेपीएल में फ़ाइल का आकार बाइट सरणी का मूल आकार भी है, न कि डेटा की अंतिम स्ट्रिंग प्रस्तुति।

मैंने कई, कई, कई फ़ोरम और स्टैक ओवरफ्लो पोस्ट को इसे समझने की कोशिश की है क्योंकि ऐसा करने के लिए ऐसा आसान काम लगता है। मैंने कहीं और पोस्ट किए गए हर एक समाधान की कोशिश की है, लेकिन मैं वास्तव में सिर्फ एक पीएनजी मुद्रित करना चाहता था क्योंकि मेरे प्रिंटर (मोबाइल क्यूएलएन 320) के मैनुअल में इसके लिए समर्थन है। यह या तो इसे बेस 64 या हेक्साडेसिमल में भेजता है, और मैंने कोशिश की दोनों का कोई फायदा नहीं हुआ। बेस 64 को करने वाले किसी भी व्यक्ति के लिए, मुझे एक पुराने मैनुअल में मिला है कि आपको भेजने वाले प्रत्येक पैकेट के लिए मैन्युअल रूप से सीआरसी कोड की गणना करने की आवश्यकता है, इसलिए मैंने आसान हेक्साडेसिमल मार्ग के साथ जाना चुना। तो यहां कोड है जो मुझे काम करने के लिए मिला है!

 string ipAddress = "192.168.1.30"; 
     int port = 6101; 

     string zplImageData = string.Empty; 
     //Make sure no transparency exists. I had some trouble with this. This PNG has a white background 
     string filePath = @"C:\Users\Path\To\Logo.png"; 
     byte[] binaryData = System.IO.File.ReadAllBytes(filePath); 
     foreach (Byte b in binaryData) 
     { 
      string hexRep = String.Format("{0:X}", b); 
      if (hexRep.Length == 1) 
       hexRep = "0" + hexRep; 
      zplImageData += hexRep; 
      } 
      string zplToSend = "^XA" + "^MNN" + "^LL500" + "~DYE:LOGO,P,P," + binaryData.Length + ",," + zplImageData+"^XZ"; 
      string printImage = "^XA^FO115,50^IME:LOGO.PNG^FS^XZ"; 

     try 
     { 
      // Open connection 
      System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient(); 
      client.Connect(ipAddress, port); 

      // Write ZPL String to connection 
      System.IO.StreamWriter writer = new System.IO.StreamWriter(client.GetStream(),Encoding.UTF8); 
      writer.Write(zplToSend); 
      writer.Flush(); 
      writer.Write(printImage); 
      writer.Flush(); 
      // Close Connection 
      writer.Close(); 
      client.Close(); 
     } 
     catch (Exception ex) 
     { 
      // Catch Exception 
     } 
+0

हमम, यह मेरे लिए काम नहीं कर रहा है .... पता है कि यह एक GK420t के लिए काम करेगा? – Calvin

+0

Im टीसीपी स्ट्रीम लेकिन डिफ़ॉल्ट रूप से प्रिंटर ने इसे बंद कर दिया है। क्या आपने सुनिश्चित किया है कि टीसीपी सक्षम है? और आपका प्रिंटर इसे/वायरलेस का समर्थन करता है? आपको क्या त्रुटि मिल रही है? – Warren

+0

मैंने बेस 64 के साथ ऐसा करने का प्रयास किया, गणना की गई मैनुअल के अनुसार सीआरसी मूल्य, लेकिन इसे काम करने में सक्षम नहीं था। मैं हेक्स के साथ भी जा रहा था। –

6

ZPL II Programming Guide छवियों डाउनलोड करने के लिए ~DG कमान और GRF प्रारूप (पेज 124) दर्ज होते हैं। Volume Two वैकल्पिक संपीड़न प्रारूप (पृष्ठ 52) पर विवरण जोड़ता है।

सबसे पहले, आपको छवि को 1 बीपीपी द्वि-स्तरीय छवि में परिवर्तित करना होगा, फिर इसे हेक्स-एन्कोडेड स्ट्रिंग में परिवर्तित करना होगा। ट्रांसमिशन समय को कम करने के लिए आप छवि को और अधिक संपीड़ित कर सकते हैं। फिर आप ^ID कमांड के साथ छवि प्रिंट कर सकते हैं।

~DY कमांड में पीएनजी छवियों के लिए अंतर्निहित समर्थन होने पर, यह खराब दस्तावेज है और प्रिंटर के कुछ मॉडलों पर काम नहीं कर रहा है। जेडबी 64 प्रारूप मूल रूप से दस्तावेज नहीं है, और ज़ेबरा समर्थन से अधिक जानकारी प्राप्त करने का प्रयास निष्फल रहा है। यदि आपका दिल ZB64 पर सेट है, तो आप Java based Zebralink SDK (ImagePrintDemo.java और com.zebra.sdk.printer.internal.GraphicsConversionUtilZpl.sendImageToStream देखें) का उपयोग कर सकते हैं।

एक बार आपके पास कमांड डेटा हो जाने पर, प्रिंटर के पास प्रिंट-सर्वर होने पर इसे टीसीपी/आईपी के माध्यम से भेजा जा सकता है, या इसे प्रिंटर में RAW प्रारूप में लिखकर भेजा जा सकता है।

नीचे कोड संकुचित GRF (60 KB असम्पीडित) एक 13 kB के रूप में एक 5 kB पीएनजी प्रिंट:

class Program 
{ 
    static unsafe void Main(string[] args) 
    { 
     var baseStream = new MemoryStream(); 
     var tw = new StreamWriter(baseStream, Encoding.UTF8); 

     using (var bmpSrc = new Bitmap(Image.FromFile(@"label.png"))) 
     { 
      tw.WriteLine(ZplImage.GetGrfStoreCommand("R:LBLRA2.GRF", bmpSrc)); 
     } 
     tw.WriteLine(ZplImage.GetGrfPrintCommand("R:LBLRA2.GRF")); 
     tw.WriteLine(ZplImage.GetGrfDeleteCommand("R:LBLRA2.GRF")); 

     tw.Flush(); 
     baseStream.Position = 0; 

     var gdipj = new GdiPrintJob("ZEBRA S4M-200dpi ZPL", GdiPrintJobDataType.Raw, "Raw print", null); 
     gdipj.WritePage(baseStream); 
     gdipj.CompleteJob(); 
    } 
} 

class ZplImage 
{ 
    public static string GetGrfStoreCommand(string filename, Bitmap bmpSource) 
    { 
     if (bmpSource == null) 
     { 
      throw new ArgumentNullException("bmpSource"); 
     } 
     validateFilename(filename); 

     var dim = new Rectangle(Point.Empty, bmpSource.Size); 
     var stride = ((dim.Width + 7)/8); 
     var bytes = stride * dim.Height; 

     using (var bmpCompressed = bmpSource.Clone(dim, PixelFormat.Format1bppIndexed)) 
     { 
      var result = new StringBuilder(); 

      result.AppendFormat("^XA~DG{2},{0},{1},", stride * dim.Height, stride, filename); 
      byte[][] imageData = GetImageData(dim, stride, bmpCompressed); 

      byte[] previousRow = null; 
      foreach (var row in imageData) 
      { 
       appendLine(row, previousRow, result); 
       previousRow = row; 
      } 
      result.Append(@"^FS^XZ"); 

      return result.ToString(); 
     } 
    } 

    public static string GetGrfDeleteCommand(string filename) 
    { 
     validateFilename(filename); 

     return string.Format("^XA^ID{0}^FS^XZ", filename); 
    } 

    public static string GetGrfPrintCommand(string filename) 
    { 
     validateFilename(filename); 

     return string.Format("^XA^FO0,0^XG{0},1,1^FS^XZ", filename); 
    } 

    static Regex regexFilename = new Regex("^[REBA]:[A-Z0-9]{1,8}\\.GRF$"); 

    private static void validateFilename(string filename) 
    { 
     if (!regexFilename.IsMatch(filename)) 
     { 
      throw new ArgumentException("Filename must be in the format " 
       + "R:XXXXXXXX.GRF. Drives are R, E, B, A. Filename can " 
       + "be alphanumeric between 1 and 8 characters.", "filename"); 
     } 
    } 

    unsafe private static byte[][] GetImageData(Rectangle dim, int stride, Bitmap bmpCompressed) 
    { 
     byte[][] imageData; 
     var data = bmpCompressed.LockBits(dim, ImageLockMode.ReadOnly, PixelFormat.Format1bppIndexed); 
     try 
     { 
      byte* pixelData = (byte*)data.Scan0.ToPointer(); 
      byte rightMask = (byte)(0xff << (data.Stride * 8 - dim.Width)); 
      imageData = new byte[dim.Height][]; 

      for (int row = 0; row < dim.Height; row++) 
      { 
       byte* rowStart = pixelData + row * data.Stride; 
       imageData[row] = new byte[stride]; 

       for (int col = 0; col < stride; col++) 
       { 
        byte f = (byte)(0xff^rowStart[col]); 
        f = (col == stride - 1) ? (byte)(f & rightMask) : f; 
        imageData[row][col] = f; 
       } 
      } 
     } 
     finally 
     { 
      bmpCompressed.UnlockBits(data); 
     } 
     return imageData; 
    } 

    private static void appendLine(byte[] row, byte[] previousRow, StringBuilder baseStream) 
    { 
     if (row.All(r => r == 0)) 
     { 
      baseStream.Append(","); 
      return; 
     } 

     if (row.All(r => r == 0xff)) 
     { 
      baseStream.Append("!"); 
      return; 
     } 

     if (previousRow != null && MatchByteArray(row, previousRow)) 
     { 
      baseStream.Append(":"); 
      return; 
     } 

     byte[] nibbles = new byte[row.Length * 2]; 
     for (int i = 0; i < row.Length; i++) 
     { 
      nibbles[i * 2] = (byte)(row[i] >> 4); 
      nibbles[i * 2 + 1] = (byte)(row[i] & 0x0f); 
     } 

     for (int i = 0; i < nibbles.Length; i++) 
     { 
      byte cPixel = nibbles[i]; 

      int repeatCount = 0; 
      for (int j = i; j < nibbles.Length && repeatCount <= 400; j++) 
      { 
       if (cPixel == nibbles[j]) 
       { 
        repeatCount++; 
       } 
       else 
       { 
        break; 
       } 
      } 

      if (repeatCount > 2) 
      { 
       if (repeatCount == nibbles.Length - i 
        && (cPixel == 0 || cPixel == 0xf)) 
       { 
        if (cPixel == 0) 
        { 
         if (i % 2 == 1) 
         { 
          baseStream.Append("0"); 
         } 
         baseStream.Append(","); 
         return; 
        } 
        else if (cPixel == 0xf) 
        { 
         if (i % 2 == 1) 
         { 
          baseStream.Append("F"); 
         } 
         baseStream.Append("!"); 
         return; 
        } 
       } 
       else 
       { 
        baseStream.Append(getRepeatCode(repeatCount)); 
        i += repeatCount - 1; 
       } 
      } 
      baseStream.Append(cPixel.ToString("X")); 
     } 
    } 

    private static string getRepeatCode(int repeatCount) 
    { 
     if (repeatCount > 419) 
      throw new ArgumentOutOfRangeException(); 

     int high = repeatCount/20; 
     int low = repeatCount % 20; 

     const string lowString = " GHIJKLMNOPQRSTUVWXY"; 
     const string highString = " ghijklmnopqrstuvwxyz"; 

     string repeatStr = ""; 
     if (high > 0) 
     { 
      repeatStr += highString[high]; 
     } 
     if (low > 0) 
     { 
      repeatStr += lowString[low]; 
     } 

     return repeatStr; 
    } 

    private static bool MatchByteArray(byte[] row, byte[] previousRow) 
    { 
     for (int i = 0; i < row.Length; i++) 
     { 
      if (row[i] != previousRow[i]) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

internal static class NativeMethods 
{ 
    #region winspool.drv 

    #region P/Invokes 

    [DllImport("winspool.Drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern bool OpenPrinter(string szPrinter, out IntPtr hPrinter, IntPtr pd); 

    [DllImport("winspool.Drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern bool ClosePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern UInt32 StartDocPrinter(IntPtr hPrinter, Int32 level, IntPtr di); 

    [DllImport("winspool.Drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern bool EndDocPrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern bool StartPagePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern bool EndPagePrinter(IntPtr hPrinter); 

    [DllImport("winspool.Drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern bool WritePrinter(
     // 0 
     IntPtr hPrinter, 
     [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] pBytes, 
     // 2 
     UInt32 dwCount, 
     out UInt32 dwWritten); 

    #endregion 

    #region Structs 

    [StructLayout(LayoutKind.Sequential)] 
    internal struct DOC_INFO_1 
    { 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string DocName; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string OutputFile; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string Datatype; 
    } 

    #endregion 

    #endregion 
} 

/// <summary> 
/// Represents a print job in a spooler queue 
/// </summary> 
public class GdiPrintJob 
{ 
    IntPtr PrinterHandle; 
    IntPtr DocHandle; 

    /// <summary> 
    /// The ID assigned by the print spooler to identify the job 
    /// </summary> 
    public UInt32 PrintJobID { get; private set; } 

    /// <summary> 
    /// Create a print job with a enumerated datatype 
    /// </summary> 
    /// <param name="PrinterName"></param> 
    /// <param name="dataType"></param> 
    /// <param name="jobName"></param> 
    /// <param name="outputFileName"></param> 
    public GdiPrintJob(string PrinterName, GdiPrintJobDataType dataType, string jobName, string outputFileName) 
     : this(PrinterName, translateType(dataType), jobName, outputFileName) 
    { 
    } 

    /// <summary> 
    /// Create a print job with a string datatype 
    /// </summary> 
    /// <param name="PrinterName"></param> 
    /// <param name="dataType"></param> 
    /// <param name="jobName"></param> 
    /// <param name="outputFileName"></param> 
    public GdiPrintJob(string PrinterName, string dataType, string jobName, string outputFileName) 
    { 
     if (string.IsNullOrWhiteSpace(PrinterName)) 
      throw new ArgumentNullException("PrinterName"); 
     if (string.IsNullOrWhiteSpace(dataType)) 
      throw new ArgumentNullException("PrinterName"); 

     IntPtr hPrinter; 
     if (!NativeMethods.OpenPrinter(PrinterName, out hPrinter, IntPtr.Zero)) 
      throw new Win32Exception(); 
     this.PrinterHandle = hPrinter; 

     NativeMethods.DOC_INFO_1 docInfo = new NativeMethods.DOC_INFO_1() 
     { 
      DocName = jobName, 
      Datatype = dataType, 
      OutputFile = outputFileName 
     }; 
     IntPtr pDocInfo = Marshal.AllocHGlobal(Marshal.SizeOf(docInfo)); 
     RuntimeHelpers.PrepareConstrainedRegions(); 
     try 
     { 
      Marshal.StructureToPtr(docInfo, pDocInfo, false); 
      UInt32 docid = NativeMethods.StartDocPrinter(hPrinter, 1, pDocInfo); 
      if (docid == 0) 
       throw new Win32Exception(); 
      this.PrintJobID = docid; 
     } 
     finally 
     { 
      Marshal.FreeHGlobal(pDocInfo); 
     } 
    } 

    /// <summary> 
    /// Write the data of a single page or a precomposed PCL document 
    /// </summary> 
    /// <param name="data"></param> 
    public void WritePage(Stream data) 
    { 
     if (data == null) 
      throw new ArgumentNullException("data"); 
     if (!data.CanRead && !data.CanWrite) 
      throw new ObjectDisposedException("data"); 
     if (!data.CanRead) 
      throw new NotSupportedException("stream is not readable"); 

     if (!NativeMethods.StartPagePrinter(this.PrinterHandle)) 
      throw new Win32Exception(); 

     byte[] buffer = new byte[0x14000]; /* 80k is Stream.CopyTo default */ 
     uint read = 1; 
     while ((read = (uint)data.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      UInt32 written; 
      if (!NativeMethods.WritePrinter(this.PrinterHandle, buffer, read, out written)) 
       throw new Win32Exception(); 

      if (written != read) 
       throw new InvalidOperationException("Error while writing to stream"); 
     } 

     if (!NativeMethods.EndPagePrinter(this.PrinterHandle)) 
      throw new Win32Exception(); 
    } 

    /// <summary> 
    /// Complete the current job 
    /// </summary> 
    public void CompleteJob() 
    { 
     if (!NativeMethods.EndDocPrinter(this.PrinterHandle)) 
      throw new Win32Exception(); 
    } 

    #region datatypes 
    private readonly static string[] dataTypes = new string[] 
    { 
     // 0 
     null, 
     "RAW", 
     // 2 
     "RAW [FF appended]", 
     "RAW [FF auto]", 
     // 4 
     "NT EMF 1.003", 
     "NT EMF 1.006", 
     // 6 
     "NT EMF 1.007", 
     "NT EMF 1.008", 
     // 8 
     "TEXT", 
     "XPS_PASS", 
     // 10 
     "XPS2GDI" 
    }; 

    private static string translateType(GdiPrintJobDataType type) 
    { 
     return dataTypes[(int)type]; 
    } 
    #endregion 
} 

public enum GdiPrintJobDataType 
{ 
    Unknown = 0, 
    Raw = 1, 
    RawAppendFF = 2, 
    RawAuto = 3, 
    NtEmf1003 = 4, 
    NtEmf1006 = 5, 
    NtEmf1007 = 6, 
    NtEmf1008 = 7, 
    Text = 8, 
    XpsPass = 9, 
    Xps2Gdi = 10 
} 
+0

आपने अभी अपना जीवन बचाया है! मैं इसकी प्रशंसा करता हूं! –

1

किसी कारण मैं B64 काम करने के लिए नहीं मिल सकता है के लिए, लेकिन सौभाग्य से मैं अपने रास्ते गूगल करने में सक्षम था सादे पुरानी जावास्क्रिप्ट का उपयोग करके Z64 काम (3 आत्मा-खोज दिनों में या तो) बनाने में।

बाकी ZPL प्रोग्रामिंग गाइड आप CISDFCRC16 आदेश पर आते हैं पर कहीं न कहीं - चलो गुप्त हो, क्यों नहीं - खंड, जिसमें कहा गया है:

"फ़ील्ड का मान CRC- गणना की जाती हैसीआरसी 16-सीसीआईटीटी बहुपद का उपयोग कर निर्दिष्ट फ़ाइल की सामग्री जो x^16 + x^12 + x^5 + 1. है। इसकी गणना 0x0000 के प्रारंभिक सीआरसी का उपयोग करके की जाती है। "

Japanglish एक तरफ, अब आप बाहर parametrised सीआरसी एल्गोरिदम के सूची 16 बिट (http://reveng.sourceforge.net/crc-catalogue/16.htm) के साथ की जाँच करें और XMODEM एल्गोरिथ्म, जो

width=16 poly=0x1021 init=0x0000 refin=false refout=false 
xorout=0x0000 check=0x31c3 name="XMODEM" 

अहा होने के लिए देख सकते हैं। मैं तो कोड मैं जरूरत के बाकी की तलाश शुरू कर और निम्नलिखित पर ठोकर खाई:

  • LZ77-एल्गोरिथ्म आधारित जावास्क्रिप्ट कंप्रेसर (http://lab.polygonpla.net/js/tinylz77.html)
  • आधार -64।एक 32- रूप में एहतियात के साथ बिटवाइज़-और करने के लिए 0xffff अद्यतन समारोह वापसी मान के साथ जावास्क्रिप्ट के बाद से व्यवहार करता है हर संख्या - js (https://github.com/beatgammit/base64-js/blob/master/lib/b64.js)
  • लैमर्ट Bies '2008 सीआरसी लाइब्रेरी (http://www.lammertbies.nl/comm/info/crc-calculation.html) एएनएसआई सी से स्थलांतरित बिट हस्ताक्षर पूर्णांक।

तो मैं एक बाइट सरणी (Uint8Array), एक स्ट्रिंग के रूप में उसे पार्स LZ77 के साथ सेक, एक बाइट सरणी में कि वापस कर देते हैं और बेस 64 का उपयोग कर इसे सांकेतिक शब्दों में बदलना है, जो बिंदु पर मैं सीआरसी की गणना के रूप में फ़ाइल को पढ़ने और इसे लगभग 40% की बचत के लिए अपने ZPL ~ DT कमांड में पेस्ट करें। सुंदर।

दुर्भाग्य से मैं एक मालिकाना समाधान विकसित कर रहा हूं इसलिए मैं कोई कोड पोस्ट नहीं कर सकता।

शुभकामनाएं!

- एक आदमी ने क्या किया एक और कर सकता है।

+0

ऐसा लगता है कि मैंने इसे हल करने में खुद को भ्रमित कर दिया। यदि बी 64 नहीं करता है तो Z64 के लिए यह सब कुछ समझ में नहीं आता है। साथ ही, ऐसा लगता है कि संकुचित लोगों को लोड करने में विफल होने के बाद ZPL को फ़ॉन्ट के असम्पीडित संस्करण में डिफॉल्ट किया गया है। ड्राइंग बोर्ड पर वापस। – thor2k

+0

जैसा कि यह पता चला है, मैं जिस प्रिंटर का उपयोग कर रहा हूं, उसमें संपीड़न कार्यक्षमता लागू नहीं की गई थी - निर्माता एक फर्मवेयर संस्करण पर काम कर रहा है जो संकुचित वस्तुओं (फोंट या छवियों) को संभालता है। मैं तुम्हें पोस्ट कर दूंगा! – thor2k