浏览代码

供应商条码打印项目修改

Hcsy 7 年之前
父节点
当前提交
77aa596d57

+ 1 - 1
UAS_Web/Browser.cs

@@ -18,7 +18,7 @@ namespace UAS_Web
         {
             InitializeComponent();
             Text = "供应商条码打印";
-            string path = "http://stwecig.vicp.io:8099/ERP/jsps/vendbarcode/login.jsp";
+            string path = "http://183.238.39.179:8099/ERP/jsps/vendbarcode/login.jsp";
             webBrowser = new ChromiumWebBrowser(path)
             {
                 Dock = DockStyle.Fill

+ 15 - 1
UAS_Web/PrinterList.Designer.cs

@@ -33,6 +33,7 @@
             this.PrintFile = new System.Drawing.Printing.PrintDocument();
             this.PRXA = new System.Windows.Forms.RadioButton();
             this.PRPIC = new System.Windows.Forms.RadioButton();
+            this.PRFR = new System.Windows.Forms.RadioButton();
             this.SuspendLayout();
             // 
             // Printer
@@ -69,18 +70,30 @@
             // PRPIC
             // 
             this.PRPIC.AutoSize = true;
-            this.PRPIC.Location = new System.Drawing.Point(226, 84);
+            this.PRPIC.Location = new System.Drawing.Point(125, 84);
             this.PRPIC.Name = "PRPIC";
             this.PRPIC.Size = new System.Drawing.Size(71, 16);
             this.PRPIC.TabIndex = 3;
             this.PRPIC.Text = "图片打印";
             this.PRPIC.UseVisualStyleBackColor = true;
             // 
+            // PRFR
+            // 
+            this.PRFR.AutoSize = true;
+            this.PRFR.Location = new System.Drawing.Point(226, 84);
+            this.PRFR.Name = "PRFR";
+            this.PRFR.Size = new System.Drawing.Size(71, 16);
+            this.PRFR.TabIndex = 4;
+            this.PRFR.TabStop = true;
+            this.PRFR.Text = "程序打印";
+            this.PRFR.UseVisualStyleBackColor = true;
+            // 
             // PrinterList
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.ClientSize = new System.Drawing.Size(321, 170);
+            this.Controls.Add(this.PRFR);
             this.Controls.Add(this.PRPIC);
             this.Controls.Add(this.PRXA);
             this.Controls.Add(this.Confirm);
@@ -103,5 +116,6 @@
         private System.Drawing.Printing.PrintDocument PrintFile;
         private System.Windows.Forms.RadioButton PRXA;
         private System.Windows.Forms.RadioButton PRPIC;
+        private System.Windows.Forms.RadioButton PRFR;
     }
 }

+ 10 - 0
UAS_Web/UAS_Web.csproj

@@ -76,6 +76,15 @@
     <ApplicationIcon>tool\print.ico</ApplicationIcon>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="FastReport">
+      <HintPath>..\..\..\..\Users\Hcsy\Documents\Visual Studio 2015\Projects\WinformT\WinformT\FastReport.dll</HintPath>
+    </Reference>
+    <Reference Include="FastReport.Bars">
+      <HintPath>..\..\..\..\Users\Hcsy\Documents\Visual Studio 2015\Projects\WinformT\WinformT\FastReport.Bars.dll</HintPath>
+    </Reference>
+    <Reference Include="FastReport.Editor">
+      <HintPath>..\..\..\..\Users\Hcsy\Documents\Visual Studio 2015\Projects\WinformT\WinformT\FastReport.Editor.dll</HintPath>
+    </Reference>
     <Reference Include="PresentationCore" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
@@ -110,6 +119,7 @@
     </Compile>
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="tool\Code128.cs" />
     <Compile Include="tool\CustomCommand.cs" />
     <Compile Include="tool\DownLoadFile.cs" />
     <Compile Include="tool\FilterManager.cs" />

+ 166 - 0
UAS_Web/tool/Code128.cs

@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+
+namespace UAS_Web.tool
+{
+    public class Code128
+    {
+        //ASCII从32到127对应的条码区,由3个条、3个空、共11个单元构成,符号内含校验码
+        private string[] Code128Encoding = new string[] {
+            "11011001100", "11001101100", "11001100110", "10010011000", "10010001100", "10001001100", "10011001000", "10011000100", "10001100100", "11001001000",
+            "11001000100", "11000100100", "10110011100", "10011011100", "10011001110", "10111001100", "10011101100", "10011100110", "11001110010", "11001011100",
+            "11001001110", "11011100100", "11001110100", "11101101110", "11101001100", "11100101100", "11100100110", "11101100100", "11100110100", "11100110010",
+            "11011011000", "11011000110", "11000110110", "10100011000", "10001011000", "10001000110", "10110001000", "10001101000", "10001100010", "11010001000",
+            "11000101000", "11000100010", "10110111000", "10110001110", "10001101110", "10111011000", "10111000110", "10001110110", "11101110110", "11010001110",
+            "11000101110", "11011101000", "11011100010", "11011101110", "11101011000", "11101000110", "11100010110", "11101101000", "11101100010", "11100011010",
+            "11101111010", "11001000010", "11110001010", "10100110000", "10100001100", "10010110000", "10010000110", "10000101100", "10000100110", "10110010000",
+            "10110000100", "10011010000", "10011000010", "10000110100", "10000110010", "11000010010", "11001010000", "11110111010", "11000010100", "10001111010",
+            "10100111100", "10010111100", "10010011110", "10111100100", "10011110100", "10011110010", "11110100100", "11110010100", "11110010010", "11011011110",
+            "11011110110", "11110110110", "10101111000", "10100011110", "10001011110", "10111101000", "10111100010", "11110101000", "11110100010", "10111011110",
+            "10111101110", "11101011110", "11110101110", "11010000100", "11010010000", "11010011100"
+        };
+        private const string Code128Stop = "11000111010", Code128End = "11";      //固定码尾
+        private enum Code128ChangeModes { CodeA = 101, CodeB = 100, CodeC = 99 }; //变更
+        private enum Code128StartModes { CodeUnset = 0, CodeA = 103, CodeB = 104, CodeC = 105 };//各类编码的码头
+
+        /// <summary>
+        /// 绘制Code128码(以像素为单位)
+        /// </summary>
+        public int EncodeBarcode(string code, System.Drawing.Graphics g, int x, int y, int width, int height, bool showText)
+        {
+            if (string.IsNullOrEmpty(code)) new Exception("条码不能为空");
+            List<int> encoded = CodetoEncoded(code);            //1.拆分转义
+            encoded.Add(CheckDigitCode128(encoded));            //2.加入校验码
+            string encodestring = EncodeString(encoded);        //3.编码
+
+            if (showText) //计算文本的大小,字体占图像的1/4高
+            {
+                Font font = new System.Drawing.Font("宋体", height / 7F, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel, ((byte)(0)));
+                SizeF size = g.MeasureString(code, font);
+                height = height - (int)size.Height;
+                g.DrawString(code, font, System.Drawing.Brushes.Black, x+11, y + height);
+                int w = DrawBarCode(g, encodestring, x, y, width, height); //4.绘制
+                return ((int)size.Width > w ? (int)size.Width : w);
+            }
+            else
+                return DrawBarCode(g, encodestring, x, y, width, height); //4.绘制
+        }
+
+        //1.检测并将字符串拆分并加入码头
+        private List<int> CodetoEncoded(string code)
+        {
+            List<int> encoded = new List<int>();
+            int type = 0;//2:B类,3:C类
+            for (int i = 0; code.Length > 0; i++)
+            {
+                int k = isNumber(code);
+                if (k >= 4)   //连续偶个数字可优先使用C类(其实并不定要转C类,但能用C类时条码会更短)
+                {
+                    if (type == 0) encoded.Add((int)Code128StartModes.CodeC);   //加入码头
+                    else if (type != 3) encoded.Add((int)(Code128ChangeModes.CodeC)); //转义
+                    type = 3;
+                    for (int j = 0; j < k; j = j + 2) //两位数字合为一个码身
+                    {
+                        encoded.Add(Int32.Parse(code.Substring(0, 2)));
+                        code = code.Substring(2);
+                    }
+                }
+                else
+                {
+                    if ((int)code[0] < 32 || (int)code[0] > 126) throw new Exception("字符串必须是数字或字母");
+                    if (type == 0) encoded.Add((int)Code128StartModes.CodeB);   //加入码头
+                    else if (type != 2) encoded.Add((int)(Code128ChangeModes.CodeB)); //转义
+                    type = 2;
+                    encoded.Add((int)code[0] - 32);//字符串转为ASCII-32
+                    code = code.Substring(1);
+                }
+            }
+            return encoded;
+        }
+        //2.校验码
+        private int CheckDigitCode128(List<int> encoded)
+        {
+            int check = encoded[0];
+            for (int i = 1; i < encoded.Count; i++)
+                check = check + (encoded[i] * i);
+            return (check % 103);
+        }
+
+        //2.编码(对应Code128Encoding数组)
+        private string EncodeString(List<int> encoded)
+        {
+            string encodedString = "";
+            for (int i = 0; i < encoded.Count; i++)
+            {
+                encodedString += Code128Encoding[encoded[i]];
+            }
+            encodedString += Code128Stop + Code128End; // 加入结束码
+            return encodedString;
+        }
+
+        //4.绘制条码(返回实际图像宽度)
+        private int DrawBarCode(System.Drawing.Graphics g, string encodeString, int x, int y, int width, int height)
+        {
+            //int w = width / encodeString.Length;
+            int w = 1;
+            for (int i = 0; i < encodeString.Length; i++)
+            {
+                g.FillRectangle(encodeString[i] == '0' ? System.Drawing.Brushes.White : System.Drawing.Brushes.Black, x, y, w, height);
+                x += w;
+            }
+            return w * (encodeString.Length + 2);
+        }
+        //检测是否连续偶个数字,返回连续数字的长度
+        private int isNumber(string code)
+        {
+            int k = 0;
+            for (int i = 0; i < code.Length; i++)
+            {
+                if (char.IsNumber(code[i]))
+                    k++;
+                else
+                    break;
+            }
+            if (k % 2 != 0) k--;
+            return k;
+        }
+
+        /// <summary>
+        /// 绘制Code128码到图片
+        /// </summary>
+        public Image EncodeBarcode(string code, int width, int height, bool showText)
+        {
+            Bitmap image = new Bitmap(width, height);
+            using (Graphics g = Graphics.FromImage(image))
+            {
+                g.Clear(Color.White);
+                int w = EncodeBarcode(code, g, 15, 0, width, height, showText);
+
+                Bitmap image2 = new Bitmap(w+15, height); //剪切多余的空白;
+                using (Graphics g2 = Graphics.FromImage(image2))
+                {
+                    g2.DrawImage(image, 0, 0);
+                    return image2;
+                }
+
+            }
+
+        }
+        /// <summary>
+        /// 绘制Code128码到流
+        /// </summary>
+        public byte[] EncodeBarcodeByte(string code, int width, int height, bool showText)
+        {
+            Image image = EncodeBarcode(code, width, height, showText);
+            System.IO.MemoryStream ms = new System.IO.MemoryStream();
+            image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
+            byte[] byteImage = ms.ToArray();
+            ms.Close();
+            image.Dispose();
+            return byteImage;
+
+        }
+    }
+}

二进制
UAS_Web/tool/FastReport.Bars.dll


二进制
UAS_Web/tool/FastReport.Editor.dll


二进制
UAS_Web/tool/FastReport.dll


+ 5 - 2
UAS_Web/tool/PrintHelper.cs

@@ -155,9 +155,12 @@ namespace UAS_Web.tool
             //writer.Options = options;
             //Bitmap imgTemp = writer.Write(str);
 
-            Code128BarcodeDraw barcode128 = BarcodeDrawFactory.Code128WithChecksum;
+            //Code128BarcodeDraw barcode128 = BarcodeDrawFactory.Code128WithChecksum;
 
-            Image imgTemp = barcode128.Draw(str, (int)height * 4);
+            //Image imgTemp = barcode128.Draw(str, (int)height * 4);
+
+            Code128 co128 = new Code128();
+            Image imgTemp = co128.EncodeBarcode(str, 400, (int)height * 4, false);
 
             bitmap = (Bitmap)CombinImage(bitmap, imgTemp, (float)x, (float)y);
         }

+ 115 - 12
UAS_Web/tool/RequestHandler.cs

@@ -7,6 +7,8 @@ using System.Linq;
 using System.Text.RegularExpressions;
 using System.Windows.Forms;
 using System.Drawing.Printing;
+using FastReport;
+using System.Data;
 
 namespace UAS_Web.tool
 {
@@ -17,6 +19,10 @@ namespace UAS_Web.tool
         //打印图片集合
         List<Bitmap> bitmaps = new List<Bitmap>();
 
+        DataTable dt = new DataTable("VENDORBARCODE_VIEW");
+
+        Report Report = new Report();
+
         //图片打印中间变量
         int imagecount = 0;
         int index = 0;
@@ -116,6 +122,21 @@ namespace UAS_Web.tool
                     PrintType = data["data"].ToString().Replace("\"", "");
                     break;
                 case "vendorZplPrint.action":
+                    RadioButton PRFR = (RadioButton)print.Controls["PRFR"];
+                    RadioButton PRPIC = (RadioButton)print.Controls["PRPIC"];
+                    if (PRFR.Checked)
+                    {
+                        try
+                        {
+                            Report.Load(System.AppDomain.CurrentDomain.BaseDirectory + "GD.frx");
+                        }
+                        catch
+                        {
+                            MessageBox.Show("未找到可使用的标签文件");
+                            return;
+                        }
+                    }
+                    bitmaps.Clear();
                     filter = FilterManager.GetFileter(request.Identifier.ToString()) as MessageFilter;
                     str = System.Text.Encoding.UTF8.GetString(filter.dataAll.ToArray());
                     data = ToDictionary(str);
@@ -170,21 +191,104 @@ namespace UAS_Web.tool
                                             itemstr = itemstr.Replace("\\\"", "\"");                                 
                                         }
                                     }
-                                    PrintHelper.Printstring(itemc.Value != null ? itemstr : " ", int.Parse(Sidc["LP_SIZE"].ToString()), g, int.Parse(Sidc["LP_LEFTRATE"].ToString()), int.Parse(Sidc["LP_TOPRATE"].ToString()));
+                                    if (PRFR.Checked)
+                                    {
+                                        DataColumn DC = new DataColumn(itemc.Key, Type.GetType("System.String"));
+                                        if (!dt.Columns.Contains(itemc.Key))
+                                            dt.Columns.Add(DC);
+                                    }
+                                    if (PRPIC.Checked)
+                                    {
+                                        PrintHelper.Printstring(itemc.Value != null ? itemstr : " ", int.Parse(Sidc["LP_SIZE"].ToString()), g, int.Parse(Sidc["LP_LEFTRATE"].ToString()), int.Parse(Sidc["LP_TOPRATE"].ToString()));
+                                    }
                                 }
                                 else if (Sidc["LP_VALUETYPE"].ToString().Replace(" ", "").Replace("\"", "") == "barcode")
                                 {
-                                    PrintHelper.DrawBarcode(itemc.Value != null ? itemc.Value.ToString().Replace("\"", "") : " ", ref bit, double.Parse(Sidc["LP_LEFTRATE"].ToString()), double.Parse(Sidc["LP_TOPRATE"].ToString()), double.Parse(Sidc["LP_WIDTH"].ToString()), double.Parse(Sidc["LP_HEIGHT"].ToString()) - 2);
-                                    PrintHelper.Printstring(itemc.Value != null ? itemc.Value.ToString().Replace("\"", "") : " ", int.Parse(Sidc["LP_SIZE"].ToString()), g, int.Parse(Sidc["LP_LEFTRATE"].ToString()), int.Parse(Sidc["LP_TOPRATE"].ToString()) + double.Parse(Sidc["LP_HEIGHT"].ToString()) - 2);
+                                    if (PRFR.Checked)
+                                    {
+                                        DataColumn DC = new DataColumn(itemc.Key, Type.GetType("System.String"));
+                                        if (!dt.Columns.Contains(itemc.Key))
+                                            dt.Columns.Add(DC);
+                                    }
+                                    if (PRPIC.Checked)
+                                    {
+                                        PrintHelper.DrawBarcode(itemc.Value != null ? itemc.Value.ToString().Replace("\"", "") : " ", ref bit, double.Parse(Sidc["LP_LEFTRATE"].ToString()), double.Parse(Sidc["LP_TOPRATE"].ToString()), double.Parse(Sidc["LP_WIDTH"].ToString()), double.Parse(Sidc["LP_HEIGHT"].ToString()) - 2);
+                                        PrintHelper.Printstring(itemc.Value != null ? itemc.Value.ToString().Replace("\"", "") : " ", int.Parse(Sidc["LP_SIZE"].ToString()), g, int.Parse(Sidc["LP_LEFTRATE"].ToString()), int.Parse(Sidc["LP_TOPRATE"].ToString()) + double.Parse(Sidc["LP_HEIGHT"].ToString()) - 2);
+                                    }
                                 }
                             }
                         }
                         bitmaps.Add(bit);
                     }
-                    imagecount = bitmaps.Count;
-                    ////设置打印机名称
-                    print.PrintDoc.PrintPage += PrintPage;
-                    print.PrintDoc.Print();
+                    if (PRFR.Checked)
+                    {
+                        foreach (var item in barcode)
+                        {
+                            DataRow dr = dt.NewRow();
+                            //g.CompositingQuality = CompositingQuality.HighQuality;
+                            //g.SmoothingMode = SmoothingMode.HighQuality;
+                            //g.InterpolationMode = InterpolationMode.HighQualityBicubic;
+                            ////定义一枝画笔
+                            //Pen pen = new Pen(Color.Black);
+                            ////用这个画笔在左上角画一个矩形
+                            //g.DrawRectangle(pen, new Rectangle(10, 10, 50, 20));
+                            foreach (var itemc in item)
+                            {
+                                Dictionary<string, object> Sidc = parameter.Find(p => p["LP_NAME"].ToString().Replace(" ", "").Replace("\"", "").ToUpper() == itemc.Key.ToUpper());
+                                if (Sidc["LP_VALUETYPE"].ToString().Replace(" ", "").Replace("\"", "") == "text")
+                                {
+                                    string itemstr = "";
+                                    if (itemc.Value != null)
+                                    {
+                                        itemstr = itemc.Value.ToString();
+                                        while (itemstr.StartsWith("\f") || itemstr.StartsWith("\v") || itemstr.StartsWith("\t") || itemstr.StartsWith("\r") || itemstr.StartsWith("\n"))
+                                        {
+                                            itemstr = itemstr.Remove(0, 2);
+                                        }
+                                        if (itemstr.StartsWith("\""))
+                                        {
+                                            itemstr = itemstr.Remove(0, 1);
+                                        }
+                                        while (itemstr.EndsWith("\f") || itemstr.EndsWith("\v") || itemstr.EndsWith("\t") || itemstr.EndsWith("\r") || itemstr.EndsWith("\n"))
+                                        {
+                                            itemstr = itemstr.Remove(itemstr.Length - 2);
+                                        }
+                                        if (itemstr.EndsWith("\""))
+                                        {
+                                            itemstr = itemstr.Remove(itemstr.Length - 1);
+                                        }
+                                        if (itemstr.Contains("\\\""))
+                                        {
+                                            itemstr = itemstr.Replace("\\\"", "\"");
+                                            Console.WriteLine(itemstr);
+                                        }
+                                    }
+                                    dr[itemc.Key] = itemstr;
+                                }
+                                else if (Sidc["LP_VALUETYPE"].ToString().Replace(" ", "").Replace("\"", "") == "barcode")
+                                {
+                                    dr[itemc.Key] = itemc.Value.ToString().Replace("\"", "");
+                                }
+                            }
+                            dt.Rows.Add(dr);
+                        }
+                    }
+                    if (PRPIC.Checked)
+                    {
+                        imagecount = bitmaps.Count;
+                        ////设置打印机名称
+                        print.PrintDoc.PrintPage += PrintPage;
+                        print.PrintDoc.Print();
+                    }
+                    if(PRFR.Checked)
+                    {
+                        Report.RegisterData(dt, "VENDORBARCODE_VIEW");
+                        Report.GetDataSource("VENDORBARCODE_VIEW").Enabled = true;
+                        Report.PrintSettings.ShowDialog = false;
+                        Report.PrintSettings.Printer = PrinterName;
+                        Report.Print();
+                        dt.Clear();
+                    }
                     break;
                 default:
                     break;
@@ -195,7 +299,7 @@ namespace UAS_Web.tool
         {
             Image i = bitmaps[index];
             Graphics g = e.Graphics;
-            g.DrawImage(i, 5, 10, i.Width, i.Height);
+            g.DrawImage(i, 4, 10, i.Width, i.Height);
             if (index < imagecount - 1)
             {
                 e.HasMorePages = true;
@@ -205,7 +309,6 @@ namespace UAS_Web.tool
             {
                 index = 0;
                 e.HasMorePages = false;
-                bitmaps.Clear();
             }
         }
 
@@ -219,11 +322,11 @@ namespace UAS_Web.tool
             //获取矩阵图的分辨率
             Graphics gr = print.PrintDoc.PrinterSettings.CreateMeasurementGraphics();
             print.browser.FocusedFrame.ExecuteJavaScriptAsync("(function(value,value1){dpi=value,printType=value1})('" + gr.DpiX + "','" + PrintType + "')");
-            if (PRPIC.Checked) {
-                print.browser.FocusedFrame.ExecuteJavaScriptAsync("document.getElementById('confirmPicturePrint').click();");
+            if (PRXA.Checked) {
+                print.browser.FocusedFrame.ExecuteJavaScriptAsync("document.getElementById('confirmZplPrint').click();");
             }
             else
-            print.browser.FocusedFrame.ExecuteJavaScriptAsync("document.getElementById('confirmZplPrint').click();");
+                print.browser.FocusedFrame.ExecuteJavaScriptAsync("document.getElementById('confirmPicturePrint').click();");
 
             print.Close();
         }