使用java Graphics 绘图工具生成顺丰快递电子面单

最近公司需要开发一个公司内部使用的快递下单系统,给我的开发任务中有一个生成电子面单功能,为了下单时更方便,利用此功能使用快递公司给我们的打印机直接打印出电子面单,刚接到这个任务时我想这应该很简单,不就是做一个表格打印出来吗,原本以为使用excel或者word等工具直接生成一个文档,后来经理说不用excel和word工具,让用Java直接生成电子面单,刚开始有点懵,因为不知道Java还有绘图功能,因此在网上学习了一下Java怎样绘图,索性直接开干。

废话不多说直接上代码。

一、    首先是生成条码工具类,此类是生成快递单号条码。

SFBarCodeGenerateUtil.java

  1 package testNetty.wu;
  2
  3 import java.awt.Color;
  4 import java.awt.Graphics;
  5 import java.awt.Image;
  6 import java.awt.image.BufferedImage;
  7 import java.io.BufferedInputStream;
  8 import java.io.BufferedOutputStream;
  9 import java.io.File;
 10 import java.io.FileInputStream;
 11 import java.io.FileNotFoundException;
 12 import java.io.FileOutputStream;
 13 import java.io.OutputStream;
 14 import java.util.ArrayList;
 15 import java.util.List;
 16 import java.util.regex.Pattern;
 17
 18 import javax.imageio.ImageIO;
 19
 20 import org.apache.log4j.Logger;
 21
 22
 23 import com.sun.image.codec.jpeg.JPEGCodec;
 24 import com.sun.image.codec.jpeg.JPEGImageEncoder;
 25
 26 /**
 27  * 顺丰速运条码生成工具<br/>
 28  * 采用 code128c编码规则<br/>
 29  * <pre>
 30  *    CODE128C:[00]-[99]的数字对集合,共100个
 31  *    即只能表示偶数位长度的数字
 32  * </pre>
 33  * @author wu
 34  * @version 1.0
 35  * @Time 2017/03/29
 36  * */
 37 public class SFBarCodeGenerateUtil {
 38
 39     private static final Logger logger = Logger.getLogger(SFBarCodeGenerateUtil.class.getSimpleName());
 40
 41     /**图片格式  jpg 格式*/
 42     public static final String PICTURE_JPG = "JPG";
 43     /**图片格式  png 格式*/
 44     public static final String PICTURE_PNG = "PNG";
 45     /**图片格式  gif 格式*/
 46     public static final String PICTURE_GIF = "GIF";
 47
 48     /** code128编码字符集  二维数组*/
 49     private static String[][] code128 = {
 50             { " ", " ", "00", "212222", "11011001100" },
 51             { "!", "!", "01", "222122", "11001101100" },
 52             { "\"", "\"", "02", "222221", "11001100110" },
 53             { "#", "#", "03", "121223", "10010011000" },
 54             { "$", "$", "04", "121322", "10010001100" },
 55             { "%", "%", "05", "131222", "10001001100" },
 56             { "&", "&", "06", "122213", "10011001000" },
 57             { "‘", "‘", "07", "122312", "10011000100" },
 58             { "(", "(", "08", "132212", "10001100100" },
 59             { ")", ")", "09", "221213", "11001001000" },
 60             { "*", "*", "10", "221312", "11001000100" },
 61             { "+", "+", "11", "231212", "11000100100" },
 62             { ",", ",", "12", "112232", "10110011100" },
 63             { "-", "-", "13", "122132", "10011011100" },
 64             { ".", ".", "14", "122231", "10011001110" },
 65             { "/", "/", "15", "113222", "10111001100" },
 66             { "0", "0", "16", "123122", "10011101100" },
 67             { "1", "1", "17", "123221", "10011100110" },
 68             { "2", "2", "18", "223211", "11001110010" },
 69             { "3", "3", "19", "221132", "11001011100" },
 70             { "4", "4", "20", "221231", "11001001110" },
 71             { "5", "5", "21", "213212", "11011100100" },
 72             { "6", "6", "22", "223112", "11001110100" },
 73             { "7", "7", "23", "312131", "11101101110" },
 74             { "8", "8", "24", "311222", "11101001100" },
 75             { "9", "9", "25", "321122", "11100101100" },
 76             { ":", ":", "26", "321221", "11100100110" },
 77             { ";", ";", "27", "312212", "11101100100" },
 78             { "<", "<", "28", "322112", "11100110100" },
 79             { "=", "=", "29", "322211", "11100110010" },
 80             { ">", ">", "30", "212123", "11011011000" },
 81              { "?", "?", "31", "212321", "11011000110" },
 82             { "@", "@", "32", "232121", "11000110110" },
 83             { "A", "A", "33", "111323", "10100011000" },
 84             { "B", "B", "34", "131123", "10001011000" },
 85             { "C", "C", "35", "131321", "10001000110" },
 86             { "D", "D", "36", "112313", "10110001000" },
 87             { "E", "E", "37", "132113", "10001101000" },
 88             { "F", "F", "38", "132311", "10001100010" },
 89             { "G", "G", "39", "211313", "11010001000" },
 90             { "H", "H", "40", "231113", "11000101000" },
 91             { "I", "I", "41", "231311", "11000100010" },
 92             { "J", "J", "42", "112133", "10110111000" },
 93             { "K", "K", "43", "112331", "10110001110" },
 94             { "L", "L", "44", "132131", "10001101110" },
 95             { "M", "M", "45", "113123", "10111011000" },
 96             { "N", "N", "46", "113321", "10111000110" },
 97             { "O", "O", "47", "133121", "10001110110" },
 98             { "P", "P", "48", "313121", "11101110110" },
 99             { "Q", "Q", "49", "211331", "11010001110" },
100             { "R", "R", "50", "231131", "11000101110" },
101             { "S", "S", "51", "213113", "11011101000" },
102             { "T", "T", "52", "213311", "11011100010" },
103             { "U", "U", "53", "213131", "11011101110" },
104             { "V", "V", "54", "311123", "11101011000" },
105             { "W", "W", "55", "311321", "11101000110" },
106             { "X", "X", "56", "331121", "11100010110" },
107             { "Y", "Y", "57", "312113", "11101101000" },
108             { "Z", "Z", "58", "312311", "11101100010" },
109             { "[", "[", "59", "332111", "11100011010" },
110             { "\\", "\\", "60", "314111", "11101111010" },
111             { "]", "]", "61", "221411", "11001000010" },
112             { "^", "^", "62", "431111", "11110001010" },
113             { "_", "_", "63", "111224", "10100110000" },
114             { "NUL", "`", "64", "111422", "10100001100" },
115             { "SOH", "a", "65", "121124", "10010110000" },
116             { "STX", "b", "66", "121421", "10010000110" },
117             { "ETX", "c", "67", "141122", "10000101100" },
118             { "EOT", "d", "68", "141221", "10000100110" },
119             { "ENQ", "e", "69", "112214", "10110010000" },
120             { "ACK", "f", "70", "112412", "10110000100" },
121             { "BEL", "g", "71", "122114", "10011010000" },
122             { "BS", "h", "72", "122411", "10011000010" },
123             { "HT", "i", "73", "142112", "10000110100" },
124             { "LF", "j", "74", "142211", "10000110010" },
125             { "VT", "k", "75", "241211", "11000010010" },
126             { "FF", "I", "76", "221114", "11001010000" },
127             { "CR", "m", "77", "413111", "11110111010" },
128             { "SO", "n", "78", "241112", "11000010100" },
129             { "SI", "o", "79", "134111", "10001111010" },
130             { "DLE", "p", "80", "111242", "10100111100" },
131             { "DC1", "q", "81", "121142", "10010111100" },
132             { "DC2", "r", "82", "121241", "10010011110" },
133             { "DC3", "s", "83", "114212", "10111100100" },
134             { "DC4", "t", "84", "124112", "10011110100" },
135             { "NAK", "u", "85", "124211", "10011110010" },
136             { "SYN", "v", "86", "411212", "11110100100" },
137             { "ETB", "w", "87", "421112", "11110010100" },
138             { "CAN", "x", "88", "421211", "11110010010" },
139             { "EM", "y", "89", "212141", "11011011110" },
140             { "SUB", "z", "90", "214121", "11011110110" },
141             { "ESC", "{", "91", "412121", "11110110110" },
142             { "FS", "|", "92", "111143", "10101111000" },
143             { "GS", "},", "93", "111341", "10100011110" },
144             { "RS", "~", "94", "131141", "10001011110" },
145             { "US", "DEL", "95", "114113", "10111101000" },
146             { "FNC3", "FNC3", "96", "114311", "10111100010" },
147             { "FNC2", "FNC2", "97", "411113", "11110101000" },
148             { "SHIFT", "SHIFT", "98", "411311", "11110100010" },
149             { "CODEC", "CODEC", "99", "113141", "10111011110" },
150             { "CODEB", "FNC4", "CODEB", "114131", "10111101110" },
151             { "FNC4", "CODEA", "CODEA", "311141", "11101011110" },
152             { "FNC1", "FNC1", "FNC1", "411131", "11110101110" },
153             { "StartA", "StartA", "StartA", "211412", "11010000100" },
154             { "StartB", "StartB", "StartB", "211214", "11010010000" },
155             { "StartC", "StartC", "StartC", "211232", "11010011100" },
156             { "Stop", "Stop", "Stop", "2331112", "1100011101011" },
157     };
158
159     /**
160     * 生产Code128的条形码的code
161     * @param barCode 生成条码的数字号码
162     * @return
163     */
164     private static String getCode(String barCode) {
165         String rtnCode = "";// 返回的参数
166         List<Integer> rtnCodeNumb = new ArrayList<Integer>();// 2截取位的组合
167         int examine = 105; // 首位
168         // 编码不能是奇数
169         if (!((barCode.length() & 1) == 0))
170             return "";
171         while (barCode.length() != 0) {
172             int temp = 0;
173             try {
174                // Code128 编码必须为数字
175                temp = (Integer) Integer.valueOf(barCode.substring(0, 2));
176             } catch (Exception e) {
177                 e.printStackTrace();
178                 return "";
179             }
180             // 获得条纹
181             rtnCode += getValue(barCode, barCode.substring(0, 2), temp);
182             rtnCodeNumb.add(temp);
183             // 条码截取2个就需要去掉用过的前二位
184             barCode = barCode.substring(2);
185         }
186         if (rtnCodeNumb.size() == 0) {
187            return "";
188         }
189         rtnCode = getValue(examine) + rtnCode; // 获取开始位
190         for (int i = 0; i != rtnCodeNumb.size(); i++) {
191           examine += rtnCodeNumb.get(i) * (i + 1);
192         }
193         examine = examine % 103; // 获得校验位
194         rtnCode += getValue(examine); // 获取校验位
195         rtnCode += "1100011101011"; // 结束位
196         return rtnCode;
197     }
198
199     /**
200     * 根据编号获得条纹
201     *
202     * @param encode
203     * @param p_Value
204     * @param p_SetID
205     * @return
206     */
207     private static String getValue(String encode, String p_Value, int p_SetID) {
208        return code128[p_SetID][4];
209     }
210
211     /**
212      * 根据编号获得条纹
213      * @param p_CodeId
214      * @return
215      */
216     private static String getValue(int p_CodeId) {
217         return code128[p_CodeId][4];
218     }
219
220     // 条码的高度像素数
221     private static int m_nImageHeight = 40;
222
223     /**
224      * 生成条码
225      * @param barString 条码模式字符串
226      * @param path 生成条码图片的路径
227      */
228     private static boolean kiCode128C(String barString, String path) {
229         OutputStream out = null;
230         try {
231                 File myPNG = new File(path);
232                 out = new FileOutputStream(myPNG);
233                 int nImageWidth = 0;
234                 char[] cs = barString.toCharArray();
235                 for (int i = 0; i != cs.length; i++) {
236                     nImageWidth = cs.length;
237                 }
238                 BufferedImage bi = new BufferedImage(nImageWidth, m_nImageHeight,
239                 BufferedImage.TYPE_INT_RGB);
240                 Graphics g = bi.getGraphics();
241                 for (int i = 0; i < cs.length; i++) {
242                     if ("1".equals(cs[i] + "")) {
243                         g.setColor(Color.BLACK);
244                         g.fillRect(i, 0, 1, m_nImageHeight);
245                     } else {
246                         g.setColor(Color.WHITE);
247                         g.fillRect(i, 0, 1, m_nImageHeight);
248                     }
249                 }
250                 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
251                 encoder.encode(bi);
252                 return true;
253         } catch (FileNotFoundException fe) {
254             logger.error("系统找不到指定路径!!" + path, fe);
255             return false;
256         } catch (Exception e) {
257             e.printStackTrace();
258         } finally {
259             try {
260                 if (out != null)
261                     out.close();
262             } catch (Exception e2) {
263                 e2.printStackTrace();
264             }
265         }
266         return false;
267     }
268
269     /**
270      * 生成条形码<br/>
271      * 条码是图片格式(JPG、PNG、GIF)
272      * @param wayBillNo
273      *            运单号
274      * @param generatePathName
275      *            生成条形码路径及名称
276      * @param width
277      *            条码图片宽度
278      * @param height
279      *            条码图片高度
280      * @param picTyp
281      *            图片格式<br/>
282      *            JPG、PNG、GIF三种图片类型选择
283      * @return boolean类型值
284      *            true 生成成功,false 生成失败
285      * */
286     public static boolean generateBarCode(String wayBillNo, String generatePathName, int width,
287         int height, String picTyp){
288         //只能是数字
289         if (!Pattern.matches("[0-9]+", wayBillNo)) {
290             logger.error("生成CODE128C条码只能是0~9的数字不能有其他字符!!");
291         //运单号长度只能是偶数
292         } else if (wayBillNo.length() % 2 != 0) {
293             logger.error("生成CODE128C条码的长度只能是偶数!!");
294         //生成条码
295         } else if (kiCode128C(getCode(wayBillNo), generatePathName)){
296             /**
297              * 设置条码图片的尺寸
298              * */
299             BufferedInputStream bis = null;
300             BufferedOutputStream out = null;
301             try {
302                 File sfFile = new File(generatePathName);
303                 if (sfFile.isFile() && sfFile.exists()) {
304                     //读取图片
305                     bis = new BufferedInputStream(new FileInputStream(generatePathName));
306                     //转换成图片对象
307                     Image bi = ImageIO.read(bis);
308                     //构建图片流 设置图片宽和高
309                     BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
310                     //绘制改变尺寸后的图
311                     tag.getGraphics().drawImage(bi, 0, 0,width, height, null);
312                     //保存图片
313                     out = new BufferedOutputStream(new FileOutputStream(generatePathName));
314                     ImageIO.write(tag, picTyp,out);
315                     out.flush();
316                 }
317             } catch (Exception e) {
318                 e.printStackTrace();
319             } finally {
320                 try {
321                     if (out != null)
322                         out.close();
323                     if (bis != null)
324                         bis.close();
325                 } catch (Exception e2) {
326                     e2.printStackTrace();
327                 }
328             }
329             logger.info("条码生成成功. " + generatePathName + " 像素:" + width + "*" + height);
330             return true;
331         }
332         logger.error("条码生成失败!");
333         return false;
334     }
335
336 }

二、其次是生成电子面单表格类,包含条码、单号、寄件人和收件人信息。

SFOrderGenerateUtil.java

   1 package testNetty.wu;
   2
   3 import java.awt.BasicStroke;
   4 import java.awt.Color;
   5 import java.awt.Font;
   6 import java.awt.Graphics2D;
   7 import java.awt.Image;
   8 import java.awt.RenderingHints;
   9 import java.awt.image.BufferedImage;
  10 import java.io.BufferedInputStream;
  11 import java.io.BufferedOutputStream;
  12 import java.io.ByteArrayOutputStream;
  13 import java.io.File;
  14 import java.io.FileInputStream;
  15 import java.io.FileNotFoundException;
  16 import java.io.FileOutputStream;
  17 import java.io.IOException;
  18
  19 import javax.imageio.ImageIO;
  20
  21 import org.apache.commons.io.FileUtils;
  22 import org.apache.log4j.Logger;
  23
  24 import com.sun.image.codec.jpeg.JPEGCodec;
  25 import com.sun.image.codec.jpeg.JPEGEncodeParam;
  26 import com.sun.image.codec.jpeg.JPEGImageEncoder;
  27
  28 /**
  29  * 生成电子面单图片工具
  30  * @author wu
  31  * @version 1.0
  32  * @time 2017/04/25
  33  * */
  34 public class SFOrderGenerateUtil {
  35
  36      private static final Logger logger = Logger.getLogger(SFOrderGenerateUtil.class.getSimpleName());
  37
  38      //图片的宽度
  39      public static final int IMG_WIDTH = 1198;
  40      //图片的宽度
  41      public static final int IMG_HEIGHT = 1800;
  42      //LOGO的宽度
  43      public static final int LOGO_WIDTH = 240;
  44      //LOGO高度
  45      public static final int LOGO_HEIGHT = 100;
  46      //LOGO客服电话的宽度
  47      public static final int LOGO_TEL_WIDTH = 220;
  48      //LOGO客服电话高度
  49      public static final int LOGO_TEL_HEIGHT = 84;
  50
  51      //Logo路径
  52      public static final String LOGO_PATH = "C:\\Users\\Administrator\\Desktop\\expressLogo\\logoSC.png";
  53      //Logo客服电话
  54      public static final String LOGO_TEL_PATH = "C:\\Users\\Administrator\\Desktop\\expressLogo\\sf_Tel.png";;
  55
  56
  57      public static BufferedImage image;
  58      public static void createImage(String fileLocation) {
  59          FileOutputStream fos = null;
  60          BufferedOutputStream bos = null;
  61          try {
  62               fos = new FileOutputStream(fileLocation);
  63               bos = new BufferedOutputStream(fos);
  64               JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
  65               encoder.encode(image);
  66          } catch (Exception e) {
  67                e.printStackTrace();
  68          } finally {
  69              try {
  70                  if (bos != null) bos.close();
  71                  if (fos != null) fos.close();
  72             } catch (Exception e2) {
  73                 e2.printStackTrace();
  74             }
  75          }
  76     }
  77
  78      /**
  79       * 生成订单图片
  80       * @param orderPath
  81       *                 生成订单存放路径
  82       * @param printTyp
  83       *                 订单打印类型 1:A4纸打印   2:热敏纸打印
  84       * @param orderParam
  85       *                 生成订单所需的参数对象
  86       * @param isCompress
  87       *                 是否需要根据输入宽高压缩图片
  88       * <pre>
  89       *        isCompress 为ture时 所输入的宽高才起作用
  90       * </pre>
  91       * @param imgWidth
  92       *                图片宽度
  93       * @param imgHeidht
  94       *                图片高度
  95       * @author Administrator
  96       * @return
  97       *
  98       * */
  99     public static boolean generateOrders(String orderPath, SfPrintOrderParam orderParam, String printTyp, boolean isCompress, int imgWidth, int imgHeidht){
 100         if (null == orderParam)
 101             return false;
 102         int startHeight = 0;  //表格的起始高度
 103         int startWidth = 0;   //表格的起始宽度
 104         try {
 105             if (orderParam.getSubMailNos().size() == 0 || orderParam.getSubMailNos().isEmpty()) {
 106                 generateParentOrder(orderPath, orderParam, printTyp, isCompress, imgWidth, imgHeidht);
 107                 return true;
 108             } else {
 109                 String picPath = orderPath;
 110                 File mk = new File(picPath + orderParam.getMailNo());
 111                 if (mk.exists()){
 112                     FileUtils.deleteDirectory(mk);
 113                 }
 114                 for (int k = 0; k < orderParam.getSubMailNos().size(); k++) {
 115                     image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_RGB);
 116                     Graphics2D g = image.createGraphics();
 117                     //以运单号为名称创建存放订单的目录
 118                     FileUtils.forceMkdir(mk);
 119                     picPath += orderParam.getMailNo() + "/";
 120
 121                     //设置背景色为白色
 122                     g.setColor(Color.WHITE);
 123                     //设置颜色区域大小
 124                     g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
 125                     //提高导入Img的清晰度
 126
 127
 128                     /*
 129                      * 绘制表格 填充内容
 130                      * */
 131                     //表格线条的颜色
 132                     g.setColor(Color.BLACK);
 133
 134                     //消除文本出现锯齿现象
 135                     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 136                     //g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
 137
 138                     //表格的四个边框
 139                     g.drawLine(startWidth, startHeight, startWidth + 374, startHeight); //上边框
 140                     g.drawLine(startWidth, startHeight, startWidth, startHeight + 562); //左边框
 141                     g.drawLine(startWidth, startHeight + 562, startWidth + 375, startHeight + 562); //下边框
 142                     g.drawLine(startWidth + 374, startHeight, startWidth + 374, startHeight + 563); //右边框
 143
 144                     //绘制表格内容 第一行
 145                     g.drawLine(startWidth, startHeight + 48, startWidth + 375, startHeight + 48);
 146
 147                     //插入顺丰速运Logo
 148                     Image logoImg = insertImage(LOGO_PATH, LOGO_WIDTH, LOGO_HEIGHT, true);
 149                     g.drawImage(logoImg, startWidth + 4, startHeight + 8, null);
 150                     //插入第二个logo (客服电话)
 151                     Image logoTelImg = insertImage(LOGO_TEL_PATH, LOGO_TEL_WIDTH, LOGO_TEL_HEIGHT, true);
 152                     g.drawImage(logoTelImg, startWidth + 280, startHeight + 15, null);
 153
 154                     //填写产品类型
 155                     Font fontSfTyp = new Font("黑体", Font.BOLD, 36);
 156                     g.setFont(fontSfTyp);
 157                     //产品类型字符串
 158                     String sfProTypStr = orderParam.getEarthCarryFlag();
 159                     g.drawString(sfProTypStr, startWidth + 150, startHeight + 41);
 160
 161                     //绘制第二行
 162                     g.drawLine(startWidth, startHeight + 124, startWidth + 375, startHeight + 124);
 163                     g.drawLine(startWidth + 276, startHeight + 48, startWidth + 276, startHeight + 124);
 164
 165                     //生成code128c 条码
 166                     SFBarCodeGenerateUtil.generateBarCode(orderParam.getMailNo(),          //运单号
 167                              picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg",           //图片名称
 168                              262,                                   //图片宽度
 169                              45,                                    //图片高度
 170                              SFBarCodeGenerateUtil.PICTURE_JPG);
 171                     //导入条码图片
 172                     Image sfBarImg = insertImage(picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg", 0, 0, false);
 173                     g.drawImage(sfBarImg, startWidth + 7, startHeight + 53, null);
 174                     sfBarImg.flush();
 175
 176                     //设置字体
 177                     Font fontSfBarCode = new Font("黑体",Font.BOLD,10);
 178                     g.setFont(fontSfBarCode);
 179
 180                     String pageNum = (k + 1) + "/" + orderParam.getSubMailNos().size();
 181                      g.drawString(pageNum, startWidth + 7, startHeight + 108);
 182
 183                     //子单号
 184                     String subBarCodeStr = orderParam.getSubMailNos().get(k);
 185                     subBarCodeStr = subBarCodeStr.replaceAll("(.{3})", "$1 ");
 186                     g.drawString("子单号  " + subBarCodeStr, startWidth + 80, startHeight + 108);
 187
 188                     //条码字符串(条码母单号)
 189                     String sfBarCodeStr = orderParam.getMailNo();
 190                     sfBarCodeStr = sfBarCodeStr.replaceAll("(.{3})", "$1 ");
 191                     g.drawString("母单号  " + sfBarCodeStr, startWidth + 80, startHeight + 120);
 192
 193                     //绘制产品类型框
 194                     g.drawLine(startWidth + 276, startHeight + 70, startWidth + 375, startHeight + 70);
 195                     Font fontSfProtypSub = new Font("黑体", Font.BOLD, 14);
 196                     g.setFont(fontSfProtypSub);
 197
 198                     //产品类型字符串
 199                     String subSfProTypStr = orderParam.getExpressTyp();
 200                     g.drawString(subSfProTypStr, startWidth + 295, startHeight + 65);
 201
 202                     //目的地栏的绘制
 203                     g.drawLine(startWidth, startHeight + 176, startWidth + 375, startHeight + 176);
 204                     g.drawLine(startWidth + 21, startHeight + 124, startWidth + 21, startHeight + 176);
 205
 206                     //目的地填写
 207                     Font fontDest = new Font("黑体", Font.BOLD, 10);
 208                     g.setFont(fontDest);
 209                     //目的地标题
 210                     String destTitleStr = "目的地";
 211                     char[] destTitleArray = destTitleStr.toCharArray();
 212                     int destTitleWidth = startWidth + 6;
 213                     int destTitleHeight = startHeight + 140;
 214                     for (int i = 0; i < destTitleStr.length(); i++) {
 215                         g.drawString(String.valueOf(destTitleArray[i]), destTitleWidth, destTitleHeight);
 216                         destTitleHeight += 12;
 217                     }
 218
 219                     //目的地代码
 220                     Font fontDestCode = new Font("Arial", Font.BOLD, 36);
 221                     g.setFont(fontDestCode);
 222                     //目的地代码字符串
 223                     String destCode = orderParam.getDestCode();
 224                     g.drawString(destCode, startWidth + 24, startHeight + 165);
 225
 226                     //收件人表格栏
 227                     g.drawLine(startWidth, startHeight + 225, startWidth + 1198, startHeight + 225);
 228                     g.drawLine(startWidth + 21, startHeight + 176, startWidth + 21, startHeight + 225);
 229
 230                     //设置收件人标题字体
 231                     Font fontRevicer = new Font("黑体", Font.BOLD, 10);
 232                     g.setFont(fontRevicer);
 233                     //收件人标题字符串
 234                     String revicerTitleStr = "收件人";
 235                     char[] revicerTitleArray = revicerTitleStr.toCharArray();
 236                     int revicerTitleWidth = startWidth + 6;
 237                     int revicerTitleHeight = startHeight + 192;
 238                     for (int i = 0; i < revicerTitleStr.length(); i++) {
 239                         g.drawString(String.valueOf(revicerTitleArray[i]), revicerTitleWidth, revicerTitleHeight);
 240                         revicerTitleHeight += 11;
 241                     }
 242
 243                     /*
 244                      * 收件人详细信息
 245                      * */
 246                     String dContact = orderParam.getdContact(); //收件人姓名
 247                     String dTel = orderParam.getdTel(); //联系电话
 248                     String dMoblie = orderParam.getdMobile(); //联系人手机号
 249                     String dCompany = orderParam.getdCompany(); //公司名称
 250                     String dProvince = orderParam.getdProvince();
 251                     String dCity = orderParam.getdCity();
 252                     String dCounty = orderParam.getdCounty();
 253                     String dAddress = orderParam.getdAddress(); //详细地址
 254
 255                     String revicerInfo = dContact + " " + dTel + " " + dMoblie + "" + dCompany;
 256                     dAddress = dProvince + dCity + dCounty + dAddress;
 257
 258                     //设置收件人信息字体
 259                     Font fontRevicerInfo = new Font("黑体", Font.BOLD, 14);
 260                     g.setFont(fontRevicerInfo);
 261                     g.drawString(revicerInfo, startWidth + 24, startHeight + 190);
 262                     //设置收件人详细地址字体
 263                     Font fontReviceAddress = new Font("黑体", Font.BOLD, 14);
 264                     g.setFont(fontReviceAddress);
 265                     if (dAddress.length() > 23) {
 266                        g.drawString(dAddress.substring(0, 23), startWidth + 24, startHeight + 205);
 267                        g.drawString(dAddress.substring(23, dAddress.length()), startWidth + 24, startHeight + 220);
 268                     } else {
 269                        g.drawString(dAddress, startWidth + 24, startHeight + 205);
 270                     }
 271
 272                     //绘制寄件人表格
 273                     g.drawLine(startWidth, startHeight + 259, startWidth + 375, startHeight +259);
 274                     g.drawLine(startWidth + 21, startHeight + 225, startWidth + 21, startHeight + 259);
 275
 276                     //设置寄件人标题字体
 277                     Font fontSender = new Font("黑体", Font.BOLD, 10);
 278                     g.setFont(fontSender);
 279                     //寄件人标题字符串
 280                     String senderTitleStr = "寄件人";
 281                     char[] senderTitleArray = senderTitleStr.toCharArray();
 282                     int senderTitleWidth = startWidth + 6;
 283                     int senderTitleHeight = startHeight + 235;
 284                     for (int i = 0; i < senderTitleStr.length(); i++) {
 285                         g.drawString(String.valueOf(senderTitleArray[i]), senderTitleWidth, senderTitleHeight);
 286                         senderTitleHeight += 11;
 287                     }
 288
 289
 290                     /*
 291                      * 寄件人信息
 292                      * **/
 293                     String jContact = orderParam.getjContact(); //寄件人姓名
 294                     String jTel = orderParam.getjTel(); //寄件人联系电话
 295                     String jMobile = orderParam.getjMobile();
 296                     String jCompany = orderParam.getjCompany();
 297                     String jProvince = orderParam.getjProvince();
 298                     String jCity = orderParam.getjCity();
 299                     String jCounty = orderParam.getjCounty();
 300                     String jAddress = orderParam.getjAddress();
 301
 302                     String senderInfo = jContact + " " + jTel + " " + jMobile + " " + jCompany;
 303                     jAddress = jProvince + jCity + jCounty + jAddress;
 304
 305                     //设置寄件人信息字体
 306                     Font fontSenderInfo = new Font("黑体", Font.PLAIN, 8);
 307                     g.setFont(fontSenderInfo);
 308                     g.drawString(senderInfo, startWidth + 24, startHeight + 240);
 309
 310                     //设置寄件人详细地址字体
 311                     Font fontSenderAddress = new Font("黑体", Font.PLAIN, 8);
 312                     g.setFont(fontSenderAddress);
 313                     if (jAddress.length() > 27) {
 314                        g.drawString(jAddress.substring(0, 27), startWidth + 24, startHeight + 250);
 315                        g.drawString(jAddress.substring(27, jAddress.length()), startWidth + 24, startHeight + 265);
 316                     } else {
 317                        g.drawString(jAddress, startWidth + 24, startHeight + 250);
 318                     }
 319
 320                     //绘制派送方式表格
 321                     g.drawLine(startWidth + 310, startHeight + 225, startWidth + 310, startHeight + 338);
 322                     //设置派送类型字体
 323                     Font fontSenTyp = new Font("黑体", Font.BOLD, 55);
 324                     g.setFont(fontSenTyp);
 325
 326                     //快递详细信息表格
 327                     g.drawLine(startWidth, startHeight + 304, startWidth + 310, startHeight + 304);
 328
 329                     //快递详细信息
 330                     Font cellFont = new Font("黑体", Font.PLAIN, 9);
 331                     g.setFont(cellFont);
 332                     String[][] cellValue1 = {
 333                             {"付款方式:",orderParam.getPayMethod()},
 334                             {"月结账号:",orderParam.getMonthSettleNo()},
 335                             {"第三方地区:",orderParam.getThridArea()},
 336                             {"实际重量:",orderParam.getRealWeight()}
 337                     };
 338                     int cellLineHeight = startHeight + 268;
 339                     for (int i = 0; i < cellValue1.length; i++) {
 340                         g.drawString(cellValue1[i][0], startWidth + 3, cellLineHeight);
 341                         g.drawString(cellValue1[i][1], startWidth + 52, cellLineHeight);
 342                         cellLineHeight += 10;
 343                     }
 344                     String[][] cellValue2 = {
 345                             {"计费重量:",orderParam.getChargWeight()},
 346                             {"声明价值:",orderParam.getDeclarPrice()},
 347                             {"保价费用:",orderParam.getSupportFee()},
 348                             {"定时派送:",orderParam.getSendTime()}
 349                     };
 350                     cellLineHeight = startHeight + 268;
 351                     for (int i = 0; i < cellValue2.length; i++) {
 352                         g.drawString(cellValue2[i][0], startWidth + 100, cellLineHeight);
 353                         g.drawString(cellValue2[i][1], startWidth + 150, cellLineHeight);
 354                         cellLineHeight += 10;
 355                     }
 356                     String[][] cellValue3 = {
 357                             {"包装费用:",orderParam.getPackFee()},
 358                             {"运费:",orderParam.getFreight()},
 359                             {"费用合计:",orderParam.getSumFee()}
 360                     };
 361                     cellLineHeight = startHeight + 268;
 362                     for (int i = 0; i < cellValue3.length; i++) {
 363                         g.drawString(cellValue3[i][0], startWidth + 220, cellLineHeight);
 364                         g.drawString(cellValue3[i][1], startWidth + 270, cellLineHeight);
 365                         cellLineHeight += 10;
 366                     }
 367
 368                     //转寄协议客户
 369                     Font fowardFont = new Font("黑体", Font.BOLD, 9);
 370                     g.setFont(fowardFont);
 371                     String fowardStr = "转寄协议客户";
 372                     g.drawString(fowardStr, startWidth + 250, startHeight + 302);
 373
 374                     //托寄物
 375                     g.drawLine(startWidth + 21, startHeight + 304, startWidth + 21, startHeight + 338);
 376                     //托寄物标题字符串
 377                     String articleTitleStr = "托寄物";
 378                     char[] articleTitleArray = articleTitleStr.toCharArray();
 379                     int articleTitleWidth = startWidth + 6;
 380                     int articleTitleHeight = startHeight + 315;
 381                     for (int i = 0; i < articleTitleStr.length(); i++) {
 382                         g.drawString(String.valueOf(articleTitleArray[i]), articleTitleWidth, articleTitleHeight);
 383                         articleTitleHeight += 10;
 384                     }
 385
 386                     Font cargoFont = new Font("黑体", Font.PLAIN, 8);
 387                     g.setFont(cargoFont);
 388                     String cargoContent = orderParam.getCargoContent();
 389                     g.drawString(cargoContent, startWidth + 24, 315);
 390
 391                     //收件员信息
 392                     g.drawLine(startWidth + 220, startHeight + 304, startWidth + 220, startHeight + 338);
 393                     Font receDriverFont = new Font("黑体", Font.PLAIN, 8);
 394                     g.setFont(receDriverFont);
 395                     String[][] receDriverStrs = {
 396                             {"收件员:",orderParam.getReviceDriver()},
 397                             {"寄件日期:",orderParam.getSendDate()},
 398                             {"派件员:",orderParam.getSendDriver()}
 399                     };
 400                     cellLineHeight = startHeight + 315;
 401                     for (int i = 0; i < receDriverStrs.length; i++) {
 402                         g.drawString(receDriverStrs[i][0], startWidth + 225, cellLineHeight);
 403                         g.drawString(receDriverStrs[i][1], startWidth + 265, cellLineHeight);
 404                         cellLineHeight += 10;
 405                     }
 406                     //签名
 407                     String signStr = "签名:";
 408                     g.drawString(signStr, startWidth + 312, startHeight + 268);
 409                     //月日
 410                     String monthDay = "月   日";
 411                     g.drawString(monthDay, startWidth + 345, startHeight + 336);
 412
 413                     //母单与子单分割线
 414                     g.drawLine(startWidth, startHeight + 338, startWidth + 375, startHeight + 338);
 415
 416                     //--------------------------- 如果有子单号 生成子单信息 ----------------------------------//
 417                     g.drawLine(startWidth, startHeight + 394, startWidth + 375, startHeight + 394);
 418                     g.drawLine(startWidth + 100, startHeight + 338, startWidth + 100, startHeight + 394);
 419                     //插入Logo
 420                     Image sublogoImg = insertImage(LOGO_PATH, LOGO_WIDTH, LOGO_HEIGHT, true);
 421                     g.drawImage(sublogoImg, startWidth + 10, startHeight + 338, null);
 422                     //插入第二个logo (客服电话)
 423                     Image sublogoTelImg = insertImage(LOGO_TEL_PATH, LOGO_TEL_WIDTH, LOGO_TEL_HEIGHT, true);
 424                     g.drawImage(sublogoTelImg, startWidth + 15, startHeight + 368, null);
 425
 426                     //导入子单条码
 427                     //生成code128c 条码
 428                     SFBarCodeGenerateUtil.generateBarCode(orderParam.getSubMailNos().get(k),          //运单号
 429                              picPath + "SFBarCoding_sub_" + orderParam.getSubMailNos().get(k) + ".jpg",           //图片名称
 430                              169,                                   //图片宽度
 431                              37,                                    //图片高度
 432                              SFBarCodeGenerateUtil.PICTURE_JPG);
 433                     Image sfSubBarImg = insertImage(picPath + "SFBarCoding_sub_" + orderParam.getSubMailNos().get(k) + ".jpg", 0, 0, false);
 434                     g.drawImage(sfSubBarImg, startWidth + 150, startHeight + 342, null);
 435                     sfSubBarImg.flush();
 436
 437                     //子单号
 438                     Font subOrderFont = new Font("黑体", Font.BOLD, 10);
 439                     g.setFont(subOrderFont);
 440                     g.drawString("子单号: " + subBarCodeStr, startWidth + 160, startHeight + 390);
 441
 442                     //绘制寄件人表格 子单
 443                     g.drawLine(startWidth, startHeight + 431, startWidth + 375, startHeight + 431);
 444                     g.drawLine(startWidth + 21, startHeight + 394, startWidth + 21, startHeight + 431);
 445                     //设置寄件人标题字体
 446                     Font fontsubSender = new Font("黑体", Font.BOLD, 10);
 447                     g.setFont(fontsubSender);
 448                     //寄件人标题字符串
 449                     String senderSubTitleStr = "寄件人";
 450                     char[] senderSubTitleArray = senderSubTitleStr.toCharArray();
 451                     int senderSubTitleWidth = startWidth + 6;
 452                     int senderSubTitleHeight = startHeight + 408;
 453                     for (int i = 0; i < senderSubTitleStr.length(); i++) {
 454                         g.drawString(String.valueOf(senderSubTitleArray[i]), senderSubTitleWidth, senderSubTitleHeight);
 455                         senderSubTitleHeight += 10;
 456                     }
 457                     Font subJInfoFont = new Font("黑体", Font.PLAIN, 8);
 458                     g.setFont(subJInfoFont);
 459                     g.drawString(senderInfo, startWidth + 24, startHeight + 405);
 460
 461                     if (jAddress.length() > 30) {
 462                       g.drawString(jAddress.substring(0, 30), startWidth + 24, startHeight + 415);
 463                       g.drawString(jAddress.substring(30, jAddress.length()), startWidth + 24, startHeight + 425);
 464                     } else {
 465                       g.drawString(jAddress, startWidth + 24, startHeight + 415);
 466                     }
 467
 468                     //绘制收件人表格 子单
 469                     g.drawLine(startWidth, startHeight + 469, startWidth + 375, startHeight + 469);
 470                     g.drawLine(startWidth + 21, startHeight + 394, startWidth + 21, startHeight + 469);
 471                     //收件人标题字符串
 472                     Font fontsubReveicer = new Font("黑体", Font.BOLD, 10);
 473                     g.setFont(fontsubReveicer);
 474                     String revicerSubTitleStr = "收件人";
 475                     char[] revicerSubTitleArray = revicerSubTitleStr.toCharArray();
 476                     int revicerSubTitleWidth = startWidth + 6;
 477                     int revicerSubTitleHeight = startHeight + 445;
 478                     for (int i = 0; i < revicerSubTitleStr.length(); i++) {
 479                         g.drawString(String.valueOf(revicerSubTitleArray[i]), revicerSubTitleWidth, revicerSubTitleHeight);
 480                         revicerSubTitleHeight += 10;
 481                     }
 482
 483                     Font subDInfoFont = new Font("黑体", Font.PLAIN, 8);
 484                     g.setFont(subDInfoFont);
 485                     g.drawString(revicerInfo, startWidth + 24, startHeight + 442);
 486                     if (dAddress.length() > 35) {
 487                        g.drawString(dAddress.substring(0, 35), startWidth + 24, startHeight + 452);
 488                        g.drawString(dAddress.substring(35, dAddress.length()), startWidth + 24, startHeight + 462);
 489                     } else {
 490                        g.drawString(dAddress, startWidth + 24, startHeight + 452);
 491                     }
 492                     createImage(picPath + "SfOrderImage_" + orderParam.getMailNo() + "_" + (k + 1) + ".jpg");
 493                     //如果需要需要根据自定义尺寸压缩图片
 494                     if (isCompress) {
 495                         //压缩图片
 496                         compressImg(picPath + "SfOrderImage_" + orderParam.getMailNo() + "_" + (k + 1) + ".jpg", imgWidth, imgHeidht);
 497                     }
 498                     g.dispose();
 499                     File sfSubFile = new File(picPath + "SFBarCoding_sub_" + orderParam.getSubMailNos().get(k) + ".jpg");
 500                     if (sfSubFile.exists() && sfSubFile.isFile()) {
 501                         if (!sfSubFile.delete()){
 502                             logger.error("删除" + picPath + "SFBarCoding_sub_" + orderParam.getSubMailNos().get(k) + ".jpg 失败!");
 503                         }
 504                     }
 505                     File sfbarFile = new File(picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg");
 506                     if (sfbarFile.exists() && sfbarFile.isFile()) {
 507                         if (!sfbarFile.delete()) {
 508                             logger.error("删除" + picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg 失败!");
 509                         }
 510                     }
 511                     logger.error("订单生成成功. " + picPath + "SfOrderImage_" + orderParam.getMailNo() + "_" + (k + 1) + ".jpg");
 512                     picPath = orderPath;
 513                 }
 514             }
 515             return true;
 516
 517         } catch (IOException e) {
 518             e.printStackTrace();
 519         } catch (Exception e) {
 520             e.printStackTrace();
 521         }
 522         return false;
 523     }
 524
 525     /**
 526      * 插入图片 自定义图片的宽高
 527      * @param imgPath
 528      *             插入图片的路径
 529      * @param imgWidth
 530      *             设置图片的宽度
 531      * @param imgHeight
 532      *             设置图片的高度
 533      * @param isCompress
 534      *             是否按输入的宽高定义图片的尺寸,只有为true时 输入的宽度和高度才起作用<br/>
 535      *             为false时输入的宽高不起作用,按输入图片的默认尺寸
 536      * @return
 537      * @throws Exception
 538      * */
 539     private static Image insertImage(String imgPath, int imgWidth, int imgHeight, boolean isCompress) throws Exception {
 540         File fileimage = new File(imgPath);
 541         Image src = ImageIO.read(fileimage);
 542         if (isCompress) {
 543             Image image = src.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH);
 544             return image;
 545         }
 546         return src;
 547     }
 548
 549     /**
 550      * 生成母订单
 551      * @param orderParam 生成订单所需的参数对象
 552      * @return boolean
 553      * */
 554     private static boolean generateParentOrder(String orderPath, SfPrintOrderParam orderParam, String printTyp, boolean isCompress, int imgWidth, int imgHeidht){
 555         if (null == orderParam)
 556             return false;
 557         String picPath = orderPath;
 558         int startHeight = 0;  //表格的起始高度
 559         int startWidth = 0;   //表格的起始宽度
 560         try {
 561             if (orderParam.getSubMailNos().size() == 0 || orderParam.getSubMailNos().isEmpty()) {
 562                 image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_RGB);
 563                 Graphics2D g = image.createGraphics();
 564
 565                 //以运单号为名称创建存放订单的目录
 566                 File mk = new File(picPath + orderParam.getMailNo());
 567                 if (mk.exists()) {
 568                     FileUtils.deleteDirectory(mk);
 569                 }
 570                 FileUtils.forceMkdir(mk);
 571
 572                 picPath += orderParam.getMailNo() + "/";
 573
 574                 //设置背景色为白色
 575                 g.setColor(Color.WHITE);
 576                 //设置颜色区域大小
 577                 g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
 578
 579                 /*
 580                  * 绘制表格 填充内容
 581                  * */
 582                 //表格线条的颜色
 583                 g.setColor(Color.BLACK);
 584                 //边框加粗
 585                 g.setStroke(new BasicStroke(2.0f));
 586                 //消除文本出现锯齿现象
 587                 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 588                 //表格的四个边框
 589                 g.drawLine(startWidth, startHeight, startWidth + 1198, startHeight); //上边框
 590
 591                 g.drawLine(startWidth, startHeight, startWidth, startHeight + 1800); //左边框
 592                 g.drawLine(startWidth, startHeight + 1799, startWidth + 1198, startHeight + 1799); //下边框
 593                 g.drawLine(startWidth + 1197, startHeight, startWidth + 1197, startHeight + 1800); //右边框
 594
 595                 //绘制表格内容 第一行
 596                 g.drawLine(startWidth, startHeight + 155, startWidth + 1198, startHeight + 155);
 597
 598                 //A4纸打印是才有Logo
 599                 if (Integer.valueOf(printTyp) == ExpressConstant.ORDER_PRINT_TYP_A4) {
 600                     //插入Logo
 601                     Image logoImg = insertImage(LOGO_PATH, LOGO_WIDTH, LOGO_HEIGHT, true);
 602                     g.drawImage(logoImg, startWidth + 30, startHeight + 30, null);
 603                     //插入第二个logo (客服电话)
 604                     Image logoTelImg = insertImage(LOGO_TEL_PATH, LOGO_TEL_WIDTH, LOGO_TEL_HEIGHT, true);
 605                     g.drawImage(logoTelImg, startWidth + 920, startHeight + 30, null);
 606                 }
 607
 608                 //E路标识
 609                 Font fontSfTyp = new Font("微软雅黑", Font.BOLD, 145);
 610                 g.setFont(fontSfTyp);
 611                 //E路标识
 612                 String sfProTypStr = orderParam.getEarthCarryFlag();
 613                 g.drawString(sfProTypStr, startWidth + 445, startHeight + 130);
 614
 615                 //绘制第二行
 616                 g.drawLine(startWidth, startHeight + 396, startWidth + 1198, startHeight + 396);
 617                 g.drawLine(startWidth + 750, startHeight + 155, startWidth + 750, startHeight + 396);
 618
 619                 //生成code128c 条码
 620                 SFBarCodeGenerateUtil.generateBarCode(orderParam.getMailNo(),          //运单号
 621                         picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg",           //图片名称
 622                          600,                                   //图片宽度
 623                          120,                                   //图片高度
 624                          SFBarCodeGenerateUtil.PICTURE_JPG);
 625                 //导入条码图片
 626                 Image sfBarImg = insertImage(picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg", 0, 0, false);
 627                 g.drawImage(sfBarImg, startWidth + 80, startHeight + 191, null);
 628
 629                 //设置字体
 630                 Font fontSfBarCode = new Font("黑体",Font.BOLD,35);
 631                 g.setFont(fontSfBarCode);
 632
 633                 String sfBarCodeStr = orderParam.getMailNo();
 634                 sfBarCodeStr = sfBarCodeStr.replaceAll("(.{3})", "$1 ");
 635                 g.drawString("母单号  " + sfBarCodeStr, startWidth + 150, startHeight + 355);
 636
 637                 //绘制产品类型框
 638                 g.drawLine(startWidth + 750, startHeight + 240, startWidth + 1198, startHeight + 240);
 639                 Font fontSfProtypSub = new Font("黑体", Font.BOLD, 50);
 640                 g.setFont(fontSfProtypSub);
 641
 642                   //产品类型字符串
 643                 String subSfProTypStr = orderParam.getExpressTyp();
 644                 g.drawString(subSfProTypStr, startWidth + 850, startHeight + 220);
 645
 646                 //目的地栏的绘制
 647                 g.drawLine(startWidth, startHeight + 563, startWidth + 1198, startHeight + 563);
 648                 g.drawLine(startWidth + 80, startHeight + 396, startWidth + 80, startHeight + 563);
 649
 650                 //目的地填写
 651                 Font fontDest = new Font("黑体", Font.BOLD, 30);
 652                 g.setFont(fontDest);
 653                 //目的地标题
 654                 String destTitleStr = "目的地";
 655                 char[] destTitleArray = destTitleStr.toCharArray();
 656                 int destTitleWidth = startWidth + 40;
 657                 int destTitleHeight = startHeight + 460;
 658                 for (int i = 0; i < destTitleStr.length(); i++) {
 659                     g.drawString(String.valueOf(destTitleArray[i]), destTitleWidth, destTitleHeight);
 660                     destTitleHeight += 33;
 661                 }
 662
 663                 //目的地代码
 664                 Font fontDestCode = new Font("Arial", Font.BOLD, 214);
 665                 g.setFont(fontDestCode);
 666                 //目的地代码字符串
 667                 String destCode = orderParam.getDestCode() == null ? "" : orderParam.getDestCode();
 668                 g.drawString(destCode, startWidth + 90, startHeight + 555);
 669
 670                 //收件人表格栏
 671                 g.drawLine(startWidth, startHeight + 720, startWidth + 1198, startHeight + 720);
 672                 g.drawLine(startWidth + 80, startHeight + 563, startWidth + 80, startHeight + 720);
 673
 674                 //设置收件人标题字体
 675                 Font fontRevicer = new Font("黑体", Font.BOLD, 25);
 676                 g.setFont(fontRevicer);
 677                 //收件人标题字符串
 678                 String revicerTitleStr = "收件人";
 679                 char[] revicerTitleArray = revicerTitleStr.toCharArray();
 680                 int revicerTitleWidth = startWidth + 40;
 681                 int revicerTitleHeight = startHeight + 620;
 682                 for (int i = 0; i < revicerTitleStr.length(); i++) {
 683                     g.drawString(String.valueOf(revicerTitleArray[i]), revicerTitleWidth, revicerTitleHeight);
 684                     revicerTitleHeight += 31;
 685                 }
 686
 687                 /*
 688                  * 收件人详细信息
 689                  * */
 690                 String dContact = orderParam.getdContact(); //收件人姓名
 691                 String dTel = orderParam.getdTel(); //联系电话
 692                 String dMoblie = orderParam.getdMobile(); //联系人手机号
 693                 String dCompany = orderParam.getdCompany(); //公司名称
 694                 String dProvince = orderParam.getdProvince();
 695                 String dCity = orderParam.getdCity();
 696                 String dCounty = orderParam.getdCounty();
 697                 String dAddress = orderParam.getdAddress(); //详细地址
 698
 699                 String revicerInfo = dContact + " " + dTel + " " + dMoblie + " " + dCompany;
 700                 dAddress = dProvince + dCity + dCounty + dAddress;
 701
 702                 //设置收件人信息字体
 703                 Font fontRevicerInfo = new Font("黑体", Font.BOLD, 35);
 704                 g.setFont(fontRevicerInfo);
 705                 g.drawString(revicerInfo, startWidth + 90, startHeight + 610);
 706                 //设置收件人详细地址字体
 707                 Font fontReviceAddress = new Font("黑体", Font.BOLD, 40);
 708                 g.setFont(fontReviceAddress);
 709                 if (dAddress.length() > 30) {
 710                    g.drawString(dAddress.substring(0, 30), startWidth + 90, startHeight + 655);
 711                    g.drawString(dAddress.substring(30, dAddress.length()), startWidth + 90, startHeight + 700);
 712                 } else {
 713                    g.drawString(dAddress, startWidth + 90, startHeight + 655);
 714                 }
 715
 716                 //绘制寄件人表格
 717                 g.drawLine(startWidth, startHeight + 828, startWidth + 1198, startHeight +828);
 718                 g.drawLine(startWidth + 80, startHeight + 720, startWidth + 80, startHeight + 828);
 719
 720                 //设置寄件人标题字体
 721                 Font fontSender = new Font("黑体", Font.BOLD, 25);
 722                 g.setFont(fontSender);
 723                 //寄件人标题字符串
 724                 String senderTitleStr = "寄件人";
 725                 char[] senderTitleArray = senderTitleStr.toCharArray();
 726                 int senderTitleWidth = startWidth + 40;
 727                 int senderTitleHeight = startHeight + 752;
 728                 for (int i = 0; i < senderTitleStr.length(); i++) {
 729                     g.drawString(String.valueOf(senderTitleArray[i]), senderTitleWidth, senderTitleHeight);
 730                     senderTitleHeight += 27;
 731                 }
 732
 733
 734                 /*
 735                  * 寄件人信息
 736                  * **/
 737                 String jContact = orderParam.getjContact(); //寄件人姓名
 738                 String jTel = orderParam.getjTel(); //寄件人联系电话
 739                 String jMobile = orderParam.getjMobile();
 740                 String jCompany = orderParam.getjCompany();
 741                 String jProvince = orderParam.getjProvince();
 742                 String jCity = orderParam.getjCity();
 743                 String jCounty = orderParam.getjCounty();
 744                 String jAddress = orderParam.getjAddress();
 745
 746                 String senderInfo = jContact + " " + jTel + " " + jMobile + " " + jCompany;
 747                 jAddress = jProvince + jCity + jCounty + jAddress;
 748
 749                 //设置寄件人信息字体
 750                 Font fontSenderInfo = new Font("黑体", Font.PLAIN, 30);
 751                 g.setFont(fontSenderInfo);
 752                 g.drawString(senderInfo, startWidth + 90, startHeight + 752);
 753
 754                 //设置寄件人详细地址字体
 755                 Font fontSenderAddress = new Font("黑体", Font.PLAIN, 30);
 756                 g.setFont(fontSenderAddress);
 757                 if (jAddress.length() > 27) {
 758                    g.drawString(jAddress.substring(0, 27), startWidth + 90, startHeight + 785);
 759                    g.drawString(jAddress.substring(27, jAddress.length()), startWidth + 90, startHeight + 817);
 760                 } else {
 761                    g.drawString(jAddress, startWidth + 90, startHeight + 785);
 762                 }
 763
 764                 //绘制派送方式表格
 765                 g.drawLine(startWidth + 850, startHeight + 720, startWidth + 850, startHeight + 1080);
 766                 //设置派送类型字体
 767                 Font fontSenTyp = new Font("黑体", Font.BOLD, 55);
 768                 g.setFont(fontSenTyp);
 769
 770                 //快递详细信息表格
 771                 g.drawLine(startWidth, startHeight + 972, startWidth + 850, startHeight + 972);
 772
 773                 //快递详细信息
 774                 Font cellFont = new Font("黑体", Font.PLAIN, 22);
 775                 g.setFont(cellFont);
 776                 String[][] cellValue1 = {
 777                         {"付款方式:",orderParam.getPayMethod()},
 778                         {"月结账号:",orderParam.getMonthSettleNo()},
 779                         {"第三方地区:",orderParam.getThridArea()},
 780                         {"实际重量:",orderParam.getRealWeight()}
 781                 };
 782                 int cellLineHeight = startHeight + 855;
 783                 for (int i = 0; i < cellValue1.length; i++) {
 784                     g.drawString(cellValue1[i][0], startWidth + 30, cellLineHeight);
 785                     g.drawString(cellValue1[i][1], startWidth + 155, cellLineHeight);
 786                     cellLineHeight += 30;
 787                 }
 788                 String[][] cellValue2 = {
 789                         {"计费重量:",orderParam.getChargWeight()},
 790                         {"声明价值:",orderParam.getDeclarPrice()},
 791                         {"保价费用:",orderParam.getSupportFee()},
 792                         {"定时派送:",orderParam.getSendTime()}
 793                 };
 794                 cellLineHeight = startHeight + 855;
 795                 for (int i = 0; i < cellValue2.length; i++) {
 796                     g.drawString(cellValue2[i][0], startWidth + 355, cellLineHeight);
 797                     g.drawString(cellValue2[i][1], startWidth + 470, cellLineHeight);
 798                     cellLineHeight += 30;
 799                 }
 800                 String[][] cellValue3 = {
 801                         {"包装费用:",orderParam.getPackFee()},
 802                         {"运费:",orderParam.getFreight()},
 803                         {"费用合计:",orderParam.getSumFee()}
 804                 };
 805                 cellLineHeight = startHeight + 855;
 806                 for (int i = 0; i < cellValue3.length; i++) {
 807                     g.drawString(cellValue3[i][0], startWidth + 655, cellLineHeight);
 808                     g.drawString(cellValue3[i][1], startWidth + 770, cellLineHeight);
 809                     cellLineHeight += 30;
 810                 }
 811
 812                 //转寄协议客户
 813                 Font fowardFont = new Font("黑体", Font.BOLD, 25);
 814                 g.setFont(fowardFont);
 815                 String fowardStr = "转寄协议客户";
 816                 g.drawString(fowardStr, startWidth + 693, startHeight + 965);
 817
 818                 //托寄物
 819                 g.drawLine(startWidth + 80, startHeight + 972, startWidth + 80, startHeight + 1080);
 820                 //托寄物标题字符串
 821                 String articleTitleStr = "托寄物";
 822                 char[] articleTitleArray = articleTitleStr.toCharArray();
 823                 int articleTitleWidth = startWidth + 40;
 824                 int articleTitleHeight = startHeight + 1005;
 825                 for (int i = 0; i < articleTitleStr.length(); i++) {
 826                     g.drawString(String.valueOf(articleTitleArray[i]), articleTitleWidth, articleTitleHeight);
 827                     articleTitleHeight += 31;
 828                 }
 829
 830                 //收件员信息
 831                 g.drawLine(startWidth + 600, startHeight + 972, startWidth + 600, startHeight + 1080);
 832                 Font receDriverFont = new Font("黑体", Font.PLAIN, 25);
 833                 g.setFont(receDriverFont);
 834                 String[][] receDriverStrs = {
 835                         {"收件员:",orderParam.getReviceDriver()},
 836                         {"寄件日期:",orderParam.getSendDate()},
 837                         {"派件员:",orderParam.getSendDriver()}
 838                 };
 839                 cellLineHeight = startHeight + 1005;
 840                 for (int i = 0; i < receDriverStrs.length; i++) {
 841                     g.drawString(receDriverStrs[i][0], startWidth + 610, cellLineHeight);
 842                     g.drawString(receDriverStrs[i][1], startWidth + 730, cellLineHeight);
 843                     cellLineHeight += 31;
 844                 }
 845                 //签名
 846                 String signStr = "签名:";
 847                 g.drawString(signStr, startWidth + 860, startHeight + 860);
 848                 //月日
 849                 String monthDay = "月   日";
 850                 g.drawString(monthDay, startWidth + 1100, startHeight + 1070);
 851
 852                 //母单与子单分割线
 853                 g.drawLine(startWidth, startHeight + 1080, startWidth + 1198, startHeight + 1080);
 854                 //--------------------------- 第二联信息 ----------------------------------//
 855                 g.drawLine(startWidth, startHeight + 1260, startWidth + 1198, startHeight + 1260);
 856                 g.drawLine(startWidth + 300, startHeight + 1080, startWidth + 300, startHeight + 1260);
 857                 //插入Logo
 858                 Image sublogoImg = insertImage(LOGO_PATH, LOGO_WIDTH, LOGO_HEIGHT, true);
 859                 g.drawImage(sublogoImg, startWidth + 40, startHeight + 1085, null);
 860                 //插入第二个logo (客服电话)
 861                 Image sublogoTelImg = insertImage(LOGO_TEL_PATH, LOGO_TEL_WIDTH, LOGO_TEL_HEIGHT, true);
 862                 g.drawImage(sublogoTelImg, startWidth + 50, startHeight + 1170, null);
 863
 864                 //导入子单条码
 865                 Image sfSubBarImg = insertImage(picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg", 0, 0, false);
 866                 g.drawImage(sfSubBarImg, startWidth + 400, startHeight + 1095, null);
 867
 868                 //子单号
 869                 Font subOrderFont = new Font("黑体", Font.BOLD, 30);
 870                 g.setFont(subOrderFont);
 871                 g.drawString("母单号  " + sfBarCodeStr, startWidth + 460, startHeight + 1250);
 872
 873                 //绘制寄件人表格 子单
 874                 g.drawLine(startWidth, startHeight + 1379, startWidth + 1198, startHeight + 1379);
 875                 g.drawLine(startWidth + 80, startHeight + 1260, startWidth + 80, startHeight + 1379);
 876                 //设置寄件人标题字体
 877                 Font fontsubSender = new Font("黑体", Font.BOLD, 30);
 878                 g.setFont(fontsubSender);
 879                 //寄件人标题字符串
 880                 String senderSubTitleStr = "寄件人";
 881                 char[] senderSubTitleArray = senderSubTitleStr.toCharArray();
 882                 int senderSubTitleWidth = startWidth + 40;
 883                 int senderSubTitleHeight = startHeight + 1295;
 884                 for (int i = 0; i < senderSubTitleStr.length(); i++) {
 885                     g.drawString(String.valueOf(senderSubTitleArray[i]), senderSubTitleWidth, senderSubTitleHeight);
 886                     senderSubTitleHeight += 33;
 887                 }
 888                 Font subJInfoFont = new Font("黑体", Font.PLAIN, 35);
 889                 g.setFont(subJInfoFont);
 890                 g.drawString(senderInfo, startWidth + 110, startHeight + 1295);
 891
 892                 if (jAddress.length() > 30) {
 893                   g.drawString(jAddress.substring(0, 30), startWidth + 110, startHeight + 1330);
 894                   g.drawString(jAddress.substring(30, jAddress.length()), startWidth + 110, startHeight + 1365);
 895                 } else {
 896                   g.drawString(jAddress, startWidth + 110, startHeight + 1330);
 897                 }
 898
 899                 //绘制收件人表格 子单
 900                 g.drawLine(startWidth, startHeight + 1499, startWidth + 1198, startHeight + 1499);
 901                 g.drawLine(startWidth + 80, startHeight + 1379, startWidth + 80, startHeight + 1499);
 902                 //收件人标题字符串
 903                 Font fontsubReveicer = new Font("黑体", Font.BOLD, 30);
 904                 g.setFont(fontsubReveicer);
 905                 String revicerSubTitleStr = "收件人";
 906                 char[] revicerSubTitleArray = revicerSubTitleStr.toCharArray();
 907                 int revicerSubTitleWidth = startWidth + 40;
 908                 int revicerSubTitleHeight = startHeight + 1415;
 909                 for (int i = 0; i < revicerSubTitleStr.length(); i++) {
 910                     g.drawString(String.valueOf(revicerSubTitleArray[i]), revicerSubTitleWidth, revicerSubTitleHeight);
 911                     revicerSubTitleHeight += 33;
 912                 }
 913
 914                 Font subDInfoFont = new Font("黑体", Font.PLAIN, 35);
 915                 g.setFont(subDInfoFont);
 916                 g.drawString(revicerInfo, startWidth + 110, startHeight + 1415);
 917                 if (dAddress.length() > 30) {
 918                    g.drawString(dAddress.substring(0, 30), startWidth + 110, startHeight + 1450);
 919                    g.drawString(dAddress.substring(30, dAddress.length()), startWidth + 110, startHeight + 1486);
 920                 } else {
 921                    g.drawString(dAddress, startWidth + 110, startHeight + 1450);
 922                 }
 923                 g.dispose();
 924                 File sfbarFile = new File(picPath + "SFBarCoding_" + orderParam.getMailNo() + ".jpg");
 925                 if (sfbarFile.exists() && sfbarFile.isFile()) {
 926                     sfbarFile.delete();
 927                 }
 928                 //生成订单图片
 929                 createImage(picPath + "SfOrderImage_" + orderParam.getMailNo() + ".jpg");
 930                 if (isCompress) {
 931                     compressImg(picPath + "SfOrderImage_" + orderParam.getMailNo() + ".jpg", imgWidth, imgHeidht);
 932                 }
 933                 logger.info("订单生成成功. " + picPath + "SfOrderImage_" + orderParam.getMailNo() + ".jpg");
 934                 return true;
 935             }
 936         } catch (Exception e) {
 937             e.printStackTrace();
 938         }
 939         return false;
 940     }
 941
 942     /**
 943      * 水平翻转图像 顺时针旋转90度、左右翻转
 944      * @param bufferedimage 目标图像
 945      * @return
 946      */
 947     private static BufferedImage rotate90DX(BufferedImage bi)
 948     {
 949         int width = bi.getWidth();
 950         int height = bi.getHeight();
 951
 952         BufferedImage biFlip = new BufferedImage(height, width, bi.getType());
 953
 954         for(int i=0; i<width; i++)
 955             for(int j=0; j<height; j++)
 956                 biFlip.setRGB(height-1-j, width-1-i, bi.getRGB(i, j));
 957
 958         return biFlip;
 959     }
 960
 961
 962     /**
 963      * 水平翻转图像 逆时针旋转90度、左右翻转
 964      * @param bufferedimage 目标图像
 965      * @return
 966      */
 967     private static BufferedImage rotate90SX(BufferedImage bi)
 968     {
 969         int width = bi.getWidth();
 970         int height = bi.getHeight();
 971
 972         BufferedImage biFlip = new BufferedImage(height, width, bi.getType());
 973
 974         for(int i=0; i<width; i++)
 975             for(int j=0; j<height; j++)
 976                 biFlip.setRGB(j, i, bi.getRGB(i, j));
 977
 978         return biFlip;
 979     }
 980
 981     /**
 982      * 根据规定尺寸压缩图片
 983      * @param imgPath 图片路径
 984      * @param width 图片宽度
 985      * @param height 图片高度
 986      * */
 987     private static void compressImg(String imgPath, int width, int height){
 988         /**
 989          * 设置条码图片的尺寸
 990          * */
 991         BufferedInputStream bis = null;
 992         BufferedOutputStream out = null;
 993         FileOutputStream fis = null;
 994         try {
 995             File sfFile = new File(imgPath);
 996             if (sfFile.isFile() && sfFile.exists()) {
 997                 //读取图片
 998                 bis = new BufferedInputStream(new FileInputStream(imgPath));
 999                 //转换成图片对象
1000                 Image bi = ImageIO.read(bis).getScaledInstance(width, height, Image.SCALE_SMOOTH);
1001                 //构建图片流 设置图片宽和高
1002                 BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
1003                 //绘制改变尺寸后的图
1004                 tag.getGraphics().drawImage(bi, 0, 0,width, height, null);
1005                 //保存图片
1006                 fis = new FileOutputStream(imgPath);
1007                 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fis);
1008                 JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
1009                 //设置压缩图片质量
1010                 jep.setQuality(3f, true);
1011                 encoder.encode(tag, jep);
1012             }
1013         } catch (Exception e) {
1014             e.printStackTrace();
1015         } finally {
1016             try {
1017                 if (fis != null) fis.close();
1018                 if (out != null) out.close();
1019                 if (bis != null) bis.close();
1020             } catch (Exception e2) {
1021                 e2.printStackTrace();
1022             }
1023         }
1024     }
1025
1026     //创建目录
1027     private static boolean createDir(String destDirName){
1028         try {
1029             File file = new File(destDirName);
1030             if (destDirName.endsWith(File.separator))
1031                 destDirName += File.separator;
1032             if (file.mkdir())
1033                 return true;
1034         } catch (Exception e) {
1035             e.printStackTrace();
1036         }
1037         return false;
1038     }
1039
1040     //删除目录
1041     public static boolean removeDir(File dir){
1042         File[] files = dir.listFiles();
1043         for (File file : files) {
1044             if (file.isDirectory()) {
1045                 return removeDir(file);
1046             } else {
1047                 return file.delete();
1048             }
1049         }
1050         return dir.delete();
1051     }
1052
1053     //删除目录
1054     public static boolean deleteMk(String dirPath){
1055         File dirFile = new File(dirPath);
1056         if (dirFile.isDirectory()) {
1057             File[] files = dirFile.listFiles();
1058             for (int i = 0; i < files.length; i++) {
1059                 files[i].delete();
1060             }
1061         }
1062         return dirFile.delete();
1063     }
1064
1065     /**
1066       * 把文件转换为byte[]
1067       * @param filePath 文件路径
1068       * */
1069      public static byte[] getFileBytes(String filePath){
1070             byte[] buffer = null;
1071             FileInputStream fis = null;
1072             ByteArrayOutputStream bos = null;
1073             try {
1074                 File file = new File(filePath);
1075                 fis = new FileInputStream(file);
1076                 bos = new ByteArrayOutputStream(1000);
1077                 byte[] b = new byte[1000];
1078                 int n;
1079                 while ((n = fis.read(b)) != -1) {
1080                     bos.write(b, 0, n);
1081                 }
1082                 buffer = bos.toByteArray();
1083             } catch (FileNotFoundException e) {
1084                 e.printStackTrace();
1085             } catch (IOException e) {
1086                 e.printStackTrace();
1087             } finally {
1088                 try {
1089                     if (bos != null) {
1090                         bos.close();
1091                     }
1092                     if (fis != null) {
1093                         fis.close();
1094                     }
1095                 } catch (Exception e2) {
1096                     e2.printStackTrace();
1097                 }
1098             }
1099             return buffer;
1100     }
1101 }

三、生成电子面单所需参数类。

SfPrintOrderParam.java

  1 package testNetty.wu;
  2
  3 import java.io.Serializable;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6
  7 /**
  8  * 打印订单所需要的参数
  9  * */
 10 public class SfPrintOrderParam implements Serializable{
 11
 12     /**
 13      *
 14      */
 15     private static final long serialVersionUID = 1L;
 16
 17     //陆运标识
 18     private String earthCarryFlag = "";
 19     //母运单号
 20     private String mailNo = "";
 21     //子运单号
 22     private List<String> subMailNos = new ArrayList<String>();
 23     //目的地代码
 24     private String destCode = "";
 25     //产品类型
 26     private String expressTyp = "";
 27     //收件人姓名
 28     private String dContact = "";
 29     //收件人公司名称
 30     private String dCompany = "";
 31     //收件人联系方式
 32     private String dTel = "";
 33     //收件人手机号
 34     private String dMobile = "";
 35     //收件人省份
 36     private String dProvince = "";
 37     //收件人城市
 38     private String dCity = "";
 39     //收件人区、县
 40     private String dCounty = "";
 41     //收件人详细地址
 42     private String dAddress = "";
 43     //寄件人姓名
 44     private String jContact = "";
 45     //寄件人公司名称
 46     private String jCompany = "";
 47     //寄件人联系方式
 48     private String jTel = "";
 49     //寄件人手机号
 50     private String jMobile = "";
 51     //寄件人省份
 52     private String jProvince = "";
 53     //寄件人城市
 54     private String jCity = "";
 55     //寄件人区、县
 56     private String jCounty = "";
 57     //寄件人详细地址
 58     private String jAddress = "";
 59     //付款方式
 60     private String payMethod = "";
 61     //月结账号
 62     private String monthSettleNo = "";
 63     //第三方地区
 64     private String thridArea = "";
 65     //实际重量
 66     private String realWeight = "";
 67     //计费重量
 68     private String chargWeight = "";
 69     //声明价值
 70     private String declarPrice = "";
 71     //保价费用
 72     private String supportFee = "";
 73     //定时派送时间
 74     private String sendTime = "";
 75     //包装费用
 76     private String packFee = "";
 77     //运费
 78     private String freight = "";
 79     //费用合计
 80     private String sumFee = "";
 81     //收件员编号
 82     private String reviceDriver = "";
 83     //寄件日期
 84     private String sendDate = "";
 85     //派件员
 86     private String sendDriver = "";
 87     //拖寄物信息
 88     private String cargoContent = "";
 89
 90     public SfPrintOrderParam() {
 91         super();
 92         // TODO Auto-generated constructor stub
 93     }
 94
 95     public String getEarthCarryFlag() {
 96         return earthCarryFlag;
 97     }
 98     public void setEarthCarryFlag(String earthCarryFlag) {
 99         this.earthCarryFlag = earthCarryFlag;
100     }
101     public String getMailNo() {
102         return mailNo;
103     }
104     public void setMailNo(String mailNo) {
105         this.mailNo = mailNo;
106     }
107     public List<String> getSubMailNos() {
108         return subMailNos;
109     }
110     public String getExpressTyp() {
111         return expressTyp;
112     }
113
114     public void setExpressTyp(String expressTyp) {
115         this.expressTyp = expressTyp;
116     }
117
118     public void setSubMailNos(List<String> subMailNos) {
119         this.subMailNos = subMailNos;
120     }
121     public String getDestCode() {
122         return destCode;
123     }
124     public void setDestCode(String destCode) {
125         this.destCode = destCode;
126     }
127     public String getdContact() {
128         return dContact;
129     }
130     public void setdContact(String dContact) {
131         this.dContact = dContact;
132     }
133     public String getdCompany() {
134         return dCompany;
135     }
136     public void setdCompany(String dCompany) {
137         this.dCompany = dCompany;
138     }
139     public String getdTel() {
140         return dTel;
141     }
142     public void setdTel(String dTel) {
143         this.dTel = dTel;
144     }
145     public String getdMobile() {
146         return dMobile;
147     }
148     public void setdMobile(String dMobile) {
149         this.dMobile = dMobile;
150     }
151     public String getdProvince() {
152         return dProvince;
153     }
154     public void setdProvince(String dProvince) {
155         this.dProvince = dProvince;
156     }
157     public String getdCity() {
158         return dCity;
159     }
160     public void setdCity(String dCity) {
161         this.dCity = dCity;
162     }
163     public String getdCounty() {
164         return dCounty;
165     }
166     public void setdCounty(String dCounty) {
167         this.dCounty = dCounty;
168     }
169     public String getdAddress() {
170         return dAddress;
171     }
172     public void setdAddress(String dAddress) {
173         this.dAddress = dAddress;
174     }
175     public String getjContact() {
176         return jContact;
177     }
178     public void setjContact(String jContact) {
179         this.jContact = jContact;
180     }
181     public String getjCompany() {
182         return jCompany;
183     }
184     public void setjCompany(String jCompany) {
185         this.jCompany = jCompany;
186     }
187     public String getjTel() {
188         return jTel;
189     }
190     public void setjTel(String jTel) {
191         this.jTel = jTel;
192     }
193     public String getjMobile() {
194         return jMobile;
195     }
196     public void setjMobile(String jMobile) {
197         this.jMobile = jMobile;
198     }
199     public String getjProvince() {
200         return jProvince;
201     }
202     public void setjProvince(String jProvince) {
203         this.jProvince = jProvince;
204     }
205     public String getjCity() {
206         return jCity;
207     }
208     public void setjCity(String jCity) {
209         this.jCity = jCity;
210     }
211     public String getjCounty() {
212         return jCounty;
213     }
214     public void setjCounty(String jCounty) {
215         this.jCounty = jCounty;
216     }
217     public String getjAddress() {
218         return jAddress;
219     }
220     public void setjAddress(String jAddress) {
221         this.jAddress = jAddress;
222     }
223     public String getPayMethod() {
224         return payMethod;
225     }
226     public void setPayMethod(String payMethod) {
227         this.payMethod = payMethod;
228     }
229     public String getMonthSettleNo() {
230         return monthSettleNo;
231     }
232     public void setMonthSettleNo(String monthSettleNo) {
233         this.monthSettleNo = monthSettleNo;
234     }
235     public String getThridArea() {
236         return thridArea;
237     }
238     public void setThridArea(String thridArea) {
239         this.thridArea = thridArea;
240     }
241     public String getRealWeight() {
242         return realWeight;
243     }
244     public void setRealWeight(String realWeight) {
245         this.realWeight = realWeight;
246     }
247     public String getChargWeight() {
248         return chargWeight;
249     }
250     public void setChargWeight(String chargWeight) {
251         this.chargWeight = chargWeight;
252     }
253     public String getDeclarPrice() {
254         return declarPrice;
255     }
256     public void setDeclarPrice(String declarPrice) {
257         this.declarPrice = declarPrice;
258     }
259     public String getSupportFee() {
260         return supportFee;
261     }
262     public void setSupportFee(String supportFee) {
263         this.supportFee = supportFee;
264     }
265     public String getSendTime() {
266         return sendTime;
267     }
268     public void setSendTime(String sendTime) {
269         this.sendTime = sendTime;
270     }
271     public String getPackFee() {
272         return packFee;
273     }
274     public void setPackFee(String packFee) {
275         this.packFee = packFee;
276     }
277     public String getFreight() {
278         return freight;
279     }
280     public void setFreight(String freight) {
281         this.freight = freight;
282     }
283     public String getSumFee() {
284         return sumFee;
285     }
286     public void setSumFee(String sumFee) {
287         this.sumFee = sumFee;
288     }
289     public String getReviceDriver() {
290         return reviceDriver;
291     }
292     public void setReviceDriver(String reviceDriver) {
293         this.reviceDriver = reviceDriver;
294     }
295     public String getSendDate() {
296         return sendDate;
297     }
298     public void setSendDate(String sendDate) {
299         this.sendDate = sendDate;
300     }
301     public String getSendDriver() {
302         return sendDriver;
303     }
304     public void setSendDriver(String sendDriver) {
305         this.sendDriver = sendDriver;
306     }
307
308     public String getCargoContent() {
309         return cargoContent;
310     }
311     public void setCargoContent(String cargoContent) {
312         this.cargoContent = cargoContent;
313     }
314
315 }

四、测试运行此程序

 1 package testNetty.wu;
 2
 3 /**
 4  *
 5  */
 6 public class App
 7 {
 8     public static void main( String[] args )
 9     {
10           SfPrintOrderParam param = new SfPrintOrderParam();
11
12           param.setMailNo("883987638272");
13           param.setEarthCarryFlag("E");
14           param.setDestCode("0311");
15           param.setdContact("李XX");
16           param.setdCompany("河北北国商城");
17           param.setdMobile("13588911223");
18           param.setdProvince("河北省");
19           param.setdCity("石家庄市");
20           param.setdCounty("桥西区");
21           param.setdAddress("华润万象城");
22           param.setjContact("吴XX");
23           param.setjMobile("13716533121");
24           param.setjCompany("北京XXX科技公司");
25           param.setjProvince("北京");
26           param.setjCity("北京市");
27           param.setjCounty("朝阳区");
28           param.setjCounty("东三环24号XXX大厦");
29
30
31           SFOrderGenerateUtil.generateOrders(
32                     "C:\\Users\\Administrator\\Desktop\\",
33                     param,
34                     "1",
35                     false,
36                     600,
37                     400);
38     }
39 }

五、生成电子面单图片效果 如图:

原文地址:https://www.cnblogs.com/wm-dv/p/11135573.html

时间: 2024-10-13 08:10:06

使用java Graphics 绘图工具生成顺丰快递电子面单的相关文章

常用电子面单接口API及对接攻略(快递鸟、菜鸟、顺丰)

现在电商行业发展很快,很多企业订单量大,手写快递单比较慢,所以开通对接电子面单打印API接口就成了很多企业迫切需要的功能: 关于电子面单: 电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务.通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍.电子面单以接口形式嵌入到自己的系统.网站上,可以在自己的平台操作打印电子面单. 电子面单的应用主要包括电子面单接口和电子面单服务等内容,通过整合平台优化服务,可减少电子面单所受限制,使电子面单的应用更广泛使用更便捷优质.电子面单的单号是卖家向合

用java Graphics生成验证码

以下下是API文档对Graphics的介绍! Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制. Graphics 对象封装了 Java 支持的基本呈现操作所需的状态信息.此状态信息包括以下属性: 要在其上绘制的 Component 对象. 呈现和剪贴坐标的转换原点. 当前剪贴区. 当前颜色. 当前字体. 当前逻辑像素操作函数(XOR 或 Paint). 当前 XOR 交替颜色(参见 setXORMode(java.awt.Colo

Java SE (2)之 Graphics 画图工具

Graphics 绘图类: 提供两个方法.Paint (绘图,被系统自动调用)    repaint(重绘) Paint 调用原理(1.窗口最大化,再最小化 窗口的大小发生变化 Repaint函数被调用) package com.sunzhiyan; import java.awt.*; import javax.swing.*; public class Demo_5 extends JFrame{ /** * @param args */ public static void main(St

在线数据库表(sql语句)生成java实体类工具

相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设计的一定是数据库表结构,而不是实体类.实体类仅仅是对底层数据结构的有损压缩,它仅仅是数据载体,不具备数据归档能力. 因此,很多时候,我们需要将原始的SQL建表语句转换成java实体类,这项工作看似简单,但若人工完成,工作量也是相当可观的,而且难免会出现差错. 到目前为止,笔者还没有发现比较靠谱的此类

使用linux perf工具生成java程序火焰图

pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: 120% } a:link { } 重要参考文献:www.brendangregg.com/blog/2017-06-30/package-flame-graph.html Java FlameGraph(火焰图)能够非常直观的展示java程序的性能分析结果,方便发现程序热点和进一步调优.本文将展示如何使用

在线数据库表(sql语句)生成java实体类工具 - 参考手册

SQL建表语句 说明 格式良好的SQL建表语句,可以是直接从PowerDesigner.Navicat等工具中导出SQL建表语句.所谓格式良好,是指建表指令与表名必须在一行,字段名称.类型.注释必须在一行,因为这个工具是用正则实现的,并不是语法解析器,当然,以后有时间的话,会改进成解析器. 举例 -- ---------------------------- -- Table structure for t_activity -- ---------------------------- DRO

java利用zxing开源工具生成二维码QRCode

原文:java利用zxing开源工具生成二维码QRCode 源代码下载地址:http://www.zuidaima.com/share/1550463727340544.htm

java二维码生成工具

import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Hashtable; import java.util.Map; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import

Android Layout Binder(在线将XML中View find出来,生成java代码的工具)

废话不多说,这是地址:http://android.lineten.net/layout.php. 有图有真相,例如: 你的XML假如是这样: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fil