画图类

package com.example.testpdf;

import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv; import javax.imageio.ImageIO;
import javax.print.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; /**
* @author 李文
* @create 2019-11-13 11:12
**/
public class ElectronicSurfaceSingle
{
//初始的宽度
private static final int START_WIDTH = 0; //初始的高度
private static final int START_HEIGHT = 0; //图片的宽度
private static final int IMG_WIDTH = (int) UnitConv.mm2pt(100);
//图片的宽度
private static final int IMG_HEIGHT = (int) UnitConv.mm2pt(120); // 条形码 高
private static final int BAR_HEIGHT = (int) UnitConv.mm2pt(20); // 条形码 宽
private static final int MODULE_WIDTH = (int) UnitConv.mm2pt(70); private static final String STORE_PATH = "d:\\2.png"; public void print(ZjsPrintOrderParam z) { //构建打印请求属性集
//HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
//设置打印格式,如未确定类型,选择autosense
//DocFlavor flavor = DocFlavor.INPUT_STREAM.TEXT_HTML_HOST;
DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG; //查找所有的可用的打印服务
//PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
//定位默认的打印服务
PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();
//显示打印对话框
//PrintService service = ServiceUI.printDialog(null, 200, 200, printService, defaultService, flavor, pras);
if (defaultService != null) {
try {
DocPrintJob job = defaultService.createPrintJob();//创建打印作业
byte[] bytes = createApiCture(z);
InputStream fis = new ByteArrayInputStream(bytes);//构造待打印的文件流
//FileInputStream fis = new FileInputStream("C:\\Users\\atliwen\\Desktop\\新建文本文档.txt");//构造待打印的文件流
//DocAttributeSet das = new HashDocAttributeSet();
Doc doc = new SimpleDoc(fis, flavor, null);
job.print(doc, null);
} catch (Exception e) {
e.printStackTrace();
}
} } private byte[] createApiCture(ZjsPrintOrderParam z) throws IOException { BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics(); // 创建画板
buildTheSketchpad(g); // 画A部分
partA(g, z.getProductType(), z.getSortCode(), z.getTheAwb()); // 画B部分
partB(g, z.getSProvince(), z.getSCity(), z.getSArea(), z.getSAddress(), z.getSName(), z.getSMobilePhone(), z.getSPhone()); // 画c部分
partC(g, z.getFProvince(), z.getFCity(), z.getFArea(), z.getFAddress(), z.getFName(), z.getFMobilePhone(), z.getFPhone()); // 画D部分 partD(g, z.getCod(), z.getNumber(), z.getChargeableWeight(), z.getPrintUnit(), z.getPrintTime()); // 画E部分
partE(g, z.getCod(), z.getBarCode(), z.getMailNo(), z.getItemName()); g.dispose(); ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", os);
return os.toByteArray();
//ImageIO.write(image, "PNG", new File(STORE_PATH)); } /**
* @param g 画布
* @param cod 总代收款 9200.00
* @param barCode 条码号 A11000225225155-999-1
* @param mailNo 客户单号 1212151215151
* @param itemName 商品名称 服服服服服服服服服服服服服服服服服服服服服服QWW啊啊啊啊啊啊啊啊啊啊啊啊
*/
private void partE(Graphics2D g, String cod, String barCode, String mailNo, String itemName) {
String 条码号 = "A11000225225155-999-1";
g.drawString("条 码 号:" + barCode, (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(99));
String 客户单号 = "1212151215151";
g.drawString("客户单号:" + mailNo, (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(102));
g.setFont(new Font("黑体", Font.PLAIN, 10));
g.drawString("代收款:" + cod + " 元", (int) UnitConv.mm2pt(64), (int) UnitConv.mm2pt(100)); String 商品名称 = "服服服服服服服服服服服服服服服服服服服服服服QWW啊啊啊啊啊啊啊啊啊啊啊啊"; drawString(g, new Font("黑体", Font.PLAIN, 12), itemName, 264, 4, 108, 5);
} /**
* @param g
* @param cod 总共代收款 39000.00
* @param number 件数 999
* @param chargeableWeight 计费重量 200.05
* @param printUnit 打印单位 中国移动
* @param printTime 打印时间 2018-05-17
* @return
*/
private void partD(Graphics2D g, String cod, String number, String chargeableWeight, String printUnit, String printTime) {
g.setFont(new Font("黑体", Font.BOLD, 9));
g.drawString("重要提示:", (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(71));
g.drawString("总代收款:", (int) UnitConv.mm2pt(57), (int) UnitConv.mm2pt(79)); String 总代收款 = "39000.00";
g.setFont(new Font("黑体", Font.BOLD, 18));
g.drawString("¥" + cod + "元", (int) UnitConv.mm2pt(57), (int) UnitConv.mm2pt(86));
g.drawString("签收人:", (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(88)); g.setFont(new Font("黑体", Font.PLAIN, 8));
g.drawString("派送前请联系收货人,必须本人签收,他人代收要求提供代。", (int) UnitConv.mm2pt(20), (int) UnitConv.mm2pt(71));
g.drawString("收人身份证号后六位", (int) UnitConv.mm2pt(20), (int) UnitConv.mm2pt(75)); String 件数 = "999";
g.drawString("件数:共 " + number + "件", (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(79)); String 计费重量 = "200.05";
g.drawString("计费重量:" + chargeableWeight + "公斤", (int) UnitConv.mm2pt(27), (int) UnitConv.mm2pt(79)); String 打印单位 = "中国移动";
g.drawString("打印单位:" + printUnit, (int) UnitConv.mm2pt(68), (int) UnitConv.mm2pt(89)); String 打印时间 = "2018-05-17";
g.drawString("打印时间:" + printTime, (int) UnitConv.mm2pt(68), (int) UnitConv.mm2pt(93));
// 签收下划线
g.drawLine(START_HEIGHT, START_WIDTH + (int) UnitConv.mm2pt(95), START_WIDTH + (int) UnitConv.mm2pt(100), START_HEIGHT + (int) UnitConv.mm2pt(95)); //下边框 } /**
* @param g 画布
* @param province 发件人 省 北京
* @param city 发件人 市 北京
* @param area 发件人 区 顺义区
* @param address 发件人 地址 顺义顺义顺义顺义空港物流园八街三号一一一一AAAAA一
* @param name 发件人 姓名 李先生
* @param mobilePhone 发件人 手机 19210001200
* @param phone 发件人 电话 1230-15151-8481
*/
private void partC(Graphics2D g, String province, String city, String area, String address, String name, String mobilePhone, String phone) { g.drawLine(START_WIDTH + (int) UnitConv.mm2pt(10), START_HEIGHT + (int) UnitConv.mm2pt(54), START_WIDTH + (int) UnitConv.mm2pt(10), START_HEIGHT + (int) UnitConv.mm2pt(67)); //下边框 Font sFont = new Font("黑体", Font.PLAIN, 8);
g.setFont(sFont);
g.drawString("发", (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(58));
g.drawString("件", (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(62));
g.drawString("人", (int) UnitConv.mm2pt(4), (int) UnitConv.mm2pt(65)); String 发件人地址 = "北京 北京 顺义区 顺义顺义顺义顺义空港物流园八街三号一一一一AAAAA一";
String s = province + " " + city + " " + area + " " + address;
drawString(g, sFont, s, 240, 12, 58, 4); String 发件人姓名手机电话 = "李先生 19210001200 1230-15151-8481";
String d = name + " " + mobilePhone + " " + phone;
g.drawString(d, (int) UnitConv.mm2pt(12), (int) UnitConv.mm2pt(66)); // 发件人下划线
g.drawLine(START_HEIGHT, START_WIDTH + (int) UnitConv.mm2pt(67), START_WIDTH + (int) UnitConv.mm2pt(100), START_HEIGHT + (int) UnitConv.mm2pt(67));
} /**
* @param g 画布
* @param province 收件人 省 河北
* @param city 收件人 市 石家庄
* @param area 收件人 区 无名
* @param address 收件人 地址 天天阿里中文路为大帝滴滴aaaaaa为大帝滴滴aass大帝
* @param name 收件人 姓名 李先生
* @param mobilePhone 收件人 手机 19210001200
* @param phone 收件人 电话 1230-15151-8481
*/
private void partB(Graphics2D g, String province, String city, String area, String address, String name, String mobilePhone, String phone) {
g.drawLine(START_WIDTH + (int) UnitConv.mm2pt(10), START_HEIGHT + (int) UnitConv.mm2pt(38), START_WIDTH + (int) UnitConv.mm2pt(10), START_HEIGHT + (int) UnitConv.mm2pt(55)); Font addressFont = new Font("黑体", Font.PLAIN, 12);
g.setFont(addressFont);
g.drawString("收", (int) UnitConv.mm2pt(3), (int) UnitConv.mm2pt(43));
g.drawString("件", (int) UnitConv.mm2pt(3), (int) UnitConv.mm2pt(49));
g.drawString("人", (int) UnitConv.mm2pt(3), (int) UnitConv.mm2pt(53)); String s = province + " " + city + " " + area + " " + address; String 收件人地址 = "河北 石家庄 天天阿里中文路为大帝滴滴aaaaaa为大帝滴滴"; drawString(g, addressFont, s, 235, 12, 43, 4); String 收件人姓名手机电话 = "李先生 19210001200 1230-15151-8481";
String d = name + " " + mobilePhone + " " + phone;
g.drawString(d, (int) UnitConv.mm2pt(12), (int) UnitConv.mm2pt(52)); // 收件人下划线
g.drawLine(START_HEIGHT, START_WIDTH + (int) UnitConv.mm2pt(54), START_WIDTH + (int) UnitConv.mm2pt(100), START_HEIGHT + (int) UnitConv.mm2pt(54));
} /**
* @param g 画布
* @param productType 产品类型
* @param sortCode 分拣编码 311A-CA08-C001
* @param theAwb 运单号 A1000101111111101111101
*/
private void partA(Graphics2D g, String productType, String sortCode, String theAwb) {
//填写产品类型
g.setFont(new Font("黑体", Font.BOLD, 24));
g.drawString(productType, START_WIDTH + (int) UnitConv.mm2pt(90), START_HEIGHT + (int) UnitConv.mm2pt(9));
//分拣编码
Font sortCodeFont = new Font("黑体", Font.BOLD, 32);
g.setFont(sortCodeFont);
g.drawString(sortCode, (IMG_WIDTH - g.getFontMetrics(sortCodeFont).stringWidth(sortCode)) / 2, START_HEIGHT + (int) UnitConv.mm2pt(17)); // 条形码
Image image1 = getBarCode(theAwb);
g.drawImage(image1, (IMG_WIDTH - MODULE_WIDTH) / 2, (int) UnitConv.mm2pt(18), null);
// 条形码 下线
g.drawLine(START_HEIGHT, START_WIDTH + (int) UnitConv.mm2pt(38), START_WIDTH + (int) UnitConv.mm2pt(100), START_HEIGHT + (int) UnitConv.mm2pt(38));
} private void buildTheSketchpad(Graphics2D g) { //设置背景色为白色
g.setColor(Color.WHITE);
//设置颜色区域大小
g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
/*
* 绘制表格 填充内容
* */
//表格线条的颜色
g.setColor(Color.BLACK); //消除文本出现锯齿现象
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); //表格的四个边框 // 上边框
g.drawLine(START_WIDTH, START_HEIGHT, START_WIDTH + (int) UnitConv.mm2pt(100), START_HEIGHT);
//左边框
g.drawLine(START_WIDTH, START_HEIGHT, START_WIDTH, START_HEIGHT + (int) UnitConv.mm2pt(120));
//下边框
g.drawLine(START_WIDTH, START_HEIGHT + (int) UnitConv.mm2pt(120), START_WIDTH + (int) UnitConv.mm2pt(99), START_HEIGHT + (int) UnitConv.mm2pt(119));
//下边框
g.drawLine(START_WIDTH + (int) UnitConv.mm2pt(100), START_HEIGHT, START_WIDTH + (int) UnitConv.mm2pt(99), START_HEIGHT + (int) UnitConv.mm2pt(119)); } private Image getBarCode(String msg) {
try {
ByteArrayOutputStream ous = new ByteArrayOutputStream();
Code128Bean bean = new Code128Bean();
final int resolution = 150;
bean.setModuleWidth(UnitConv.in2mm(3.0f / resolution));
String format = "image/png";
// 输出流
BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format,
resolution, BufferedImage.TYPE_BYTE_BINARY, false, 0);
//生成条码
bean.generateBarcode(canvas, msg);
canvas.finish();
InputStream i = new ByteArrayInputStream(ous.toByteArray());
return ImageIO.read(i).getScaledInstance(MODULE_WIDTH, BAR_HEIGHT, Image.SCALE_SMOOTH); } catch (IOException e) {
throw new RuntimeException(e);
} } /**
* 文字超出限定长度自动换行
*
* @param g 画布
* @param font 字体样式
* @param text 文字
* @param widthLength 最大长度 (多少长度后需要换行)
* @param x 文字位置坐标 x
* @param y 文字位置坐标 Y
* @param yn 每次换行偏移多少pt
*/
private void drawString(Graphics2D g, Font font, String text, int widthLength, int x, int y, int yn) { FontMetrics fg = g.getFontMetrics(font);
List<String> ls = new ArrayList<>(2);
getListText(fg, text, widthLength, ls);
for (int i = 0; i < ls.size(); i++) {
if (i == 0) {
g.drawString(ls.get(i), (int) UnitConv.mm2pt(x), (int) UnitConv.mm2pt(y));
} else {
g.drawString(ls.get(i), (int) UnitConv.mm2pt(x), (int) UnitConv.mm2pt(y + yn));
}
}
} /**
* 递归 切割字符串
* @param fg
* @param text
* @param widthLength
* @param ls
*/
private void getListText(FontMetrics fg, String text, int widthLength, List<String> ls) {
String ba = text;
boolean b = true;
int i = 1;
while (b) {
if (fg.stringWidth(text) > widthLength) {
text = text.substring(0, text.length() - 1);
i++;
} else {
b = false;
}
}
if (i != 1) {
ls.add(ba.substring(0, ba.length() - i));
getListText(fg, ba.substring(ba.length() - i), widthLength, ls);
} else {
ls.add(text);
}
} }

入参实体类

package com.example.testpdf;

import lombok.Data;

/**
* @author 李文
* @create 2019-11-14 10:46
**/
@Data
public class ZjsPrintOrderParam
{ /**
* 产品类型 L
*/
private String productType; /**
* 分拣编码 311A-CA08-C001
*/
private String sortCode; /**
* 运单号 A100010111111
*/
private String theAwb; /**
* 收件人 省 河北
*/
private String sProvince; /**
* 收件人 市 石家庄
*/
private String sCity; /**
* 收件人 区 无名
*/
private String sArea; /**
* 收件人 地址 天天阿里中文路为大帝滴滴aaaaaa为大帝滴滴aass大帝
*/
private String sAddress; /**
* 收件人 姓名 李先生
*/
private String sName; /**
* 收件人 手机 19210001200
*/
private String sMobilePhone; /**
* 收件人 电话 1230-15151-8481
*/
private String sPhone; /**
* 发件人 省 河北
*/
private String fProvince; /**
* 发件人 市 石家庄
*/
private String fCity; /**
* 发件人 区 无名
*/
private String fArea; /**
* 发件人 地址 天天阿里中文路为大帝滴滴aaaaaa为大帝滴滴aass大帝
*/
private String fAddress; /**
* 发件人 姓名 李先生
*/
private String fName; /**
* 发件人 手机 19210001200
*/
private String fMobilePhone; /**
* 发件人 电话 1230-15151-8481
*/
private String fPhone; /**
* 总共代收款 39000.00
*/
private String cod; /**
* 件数 999
*/
private String number; /**
* 计费重量 200.05
*/
private String chargeableWeight; /**
* 打印单位 中国移动
*/
private String printUnit; /**
* 打印时间 2018-05-17
*/
private String printTime; /**
* 条码号 A11000225225155-999-1
*/
private String barCode; /**
* 客户单号 1212151215151
*/
private String mailNo; /**
* 商品名称 服服服服服服服服服服服服服服服服服服服服服服QWW啊啊啊啊啊啊啊啊啊啊啊啊
*/
private String itemName; }

maven 引用包

 <dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j-light</artifactId>
<version>2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>

Graphics2D画快递电子面单图片并且打印的更多相关文章

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

    最近公司需要开发一个公司内部使用的快递下单系统,给我的开发任务中有一个生成电子面单功能,为了下单时更方便,利用此功能使用快递公司给我们的打印机直接打印出电子面单,刚接到这个任务时我想这应该很简单,不就 ...

  2. 电子口岸 打开“退税联打印”时,PDF界面无法显示

    电子口岸 打开“退税联打印”时,PDF界面无法显示 咨询0571-95198 : IE要在8-10间,系统 要Win7 32B ---------------------参考------------- ...

  3. Java Graphics2D 画出文字描边效果

    在CSDN看到的,在此记下. (http://bbs.csdn.net/topics/390703095) import javax.swing.*; import java.awt.*; impor ...

  4. 在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理

    在一些内部OA或者流转的文件,或者给一些客户的报价文件.合同,或者一些医院出示的给保险机构的病历资料等,有时候可能都希望快速的使用电子签章的处理方式来给文件盖上特定的印章,本篇随笔介绍基于Vue&am ...

  5. 基于PHP的对接电子面单接口平台案例

    电子面单接口目前有三种对接方式,快递电子面单接口.菜鸟电子面单接口和快递鸟电子面单接口.这三种接口各有特点. 一.电子面单接口定义 1. 快递电子面单接口:快递公司自己开发的电子面单服务, 商家使用必 ...

  6. 各种电子面单_Api接口

    电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务.通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍.电子面单以接口形式嵌入到自己的系统.网站上,可以在自己的平台操作打印电子面单.   ...

  7. java Graphics2D绘制文字 本地正常服务器乱码问题

    先贴关键代码: 用Graphics2D画文字到图片,再生成图片文件,在本地运行正常,一部署到服务器就不正常,变成了正方框如下图 解决问题思路: 1.部署服务器的编码问题. 2.代码问题. 以上两点一直 ...

  8. 电子质检报告系统v3.8

    南京转折点信息是太阳升软件全资子公司,一家专业从事医药软件开发的医药软件企业. 根据新版GSP支持医药企业药品质检报告电子化的要求及国家药监局的解释:供货商提供的加盖企业电子印章的电子药品检验报告与纸 ...

  9. miniproject black jack--Fail

    第一部分 下载这个小项目的程序模板并回顾card类的定义.这个类已经执行了所以你的任务是自己熟悉下代码.开始,通过粘贴card类定义到程序模板中并验证我们的代码如预期那样工作. 实现“__init__ ...

随机推荐

  1. [Dart] Dynamic variable in Dart

    First way to create dynamic variable is using 'dymaic' keywrod: dynamic a = 123; a = '123'; Second w ...

  2. 接口实现后台GZIP压缩,pako.js 前端解压

    import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException; ...

  3. LOJ P10151 分离与合体 题解

    Analysis 区间dp+记录路径 用dfs倒着找倒数第几次合并 #include<iostream> #include<cstdio> #include<cstrin ...

  4. LOJ P10147 石子合并 题解

    Analysis 区间dp+前缀和 #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  5. SYSTEM_INFORMATION_CLASS

    source: https://github.com/processhacker/processhacker/blob/master/phnt/include/ntexapi.h // rev // ...

  6. jquery实现图片切换

    <div> <img class="imgclick" src="img/pic1.png" /> </div> <s ...

  7. Redis Mysql 双写一致性问题

    一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)-  先更新数据库,后更新 ...

  8. CentOS7安装Airflow

    实验环境: centos7python3.6 安装配置: 1.看看是否有gcc,没有的话需要进行安装: yum install gcc  (后续安装airflow如果不成功,可以再次执行,它会更新包) ...

  9. FOI 冬令营 Day6

    目录 T1.堆(heap) 传送门 Code T2.密文(secret) 传送门 Code T3.树(tree) 传送门 Code 别问Day5到底去哪里了,咕咕咕 T1.堆(heap) 传送门 Co ...

  10. 获取Linux系统运行时间

    uptime |sed 's/^.*up//' |sed 's/users.*//g'|awk '{for(i=1;i<NF;++i) printf $i "\t";prin ...