画图类

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. datafram 操作集锦

    Spark Python API 官方文档中文版> 之 pyspark.sql (二) 2017-11-04 22:13 by 牛仔裤的夏天, 365 阅读, 0 评论, 收藏, 编辑 摘要:在 ...

  2. unsafe包的学习和使用

    Go语言之unsafe包介绍及使用 unsafe内容介绍 type ArbitraryType int type Pointer *ArbitraryType func Sizeof(x Arbitr ...

  3. PostgreSQL 使用PG_Rman进行物理备份

    背景 在Oracle下我们可以使用rman进行物理备份,支持数据库的全量.增量.归档的备份模式而PostgreSQL作为开源数据库,近些时间来也一直向商业版数据库看齐,也推出了开源功工具pg_rman ...

  4. 三十九.NoSQL概述 部署Redis服务 、 部署LNMP+Redis

    1. 搭建Redis服务器 在主机 192.168.4.50 上安装并启用 redis 服务 设置变量test,值为123 查看变量test的值   1.1 搭建redis服务器 1.1.1 安装re ...

  5. vue中router-link的详细用法

    官网文档地址:https://router.vuejs.org/zh/api/#to 今天项目突然有需求,让vue中的一个页面跳转到另一个页面 // 字符串 <router-link to=&q ...

  6. (5)打造简单OS-进入保护模式

    1.简介: 8086实模式 80286才出现保护模式,保护模式下的段寄存器存储的是段选择子,不在是8086实模式的段基址了! [扩展知识]:可以看了后面知识在回头看一下这段. [8086各个段寄存器和 ...

  7. zabbix (11) 监控TCP连接数

    对TCP的监控可以采用ss.netstat./proc/net/tcp这三个不同的方案来实现.其中ss是最快的 (1)ss命令 [root@manager1 script_py ::]#time ss ...

  8. linux下安装apache和php和mysql

    我的系统环境时ubuntu 18.04.3,为了ROS: 首先:安装下面一堆软件包: sudo apt install nginx nginx-doc fcgiwrap sudo apt instal ...

  9. 手写实现RPC框架(不带注册中心和带注册中心两种)

    实现自己的RPC框架如果不需要自定义协议的话那就要基于Socket+序列化. ProcessorHandler:主要是用来处理客户端的请求. package dgb.nospring.myrpc; i ...

  10. laravel中打印一个sql语句

    查询构造器 打印sql是发现 toSql() 不可用 所以网上搜索下 //DB::connection()->enableQueryLog(); // 开启查询日志 $user=DB::tabl ...