首先,是接到了一个在web端打印图片的需求。因为我前端使用Jsp,网上查到jsp页面不能够直接引用本地文件夹中的文件。所以只能另寻他法。
从C-Lodopa客服发的官方样例38了解到,C-Lodopa可以直接打印base64编码的图片,所以后端如下
@RequestMapping("/readImg")
@ResponseBody
public String readImg(HttpServletRequest request,HttpServletResponse response) throws IOException,ParseException {
String jpgPath = "输入你的图片路径";
byte[] data = null;
//读取图片
BufferedInputStream in = new BufferedInputStream(new FileInputStream(jpgPath));
//字节流转图片对象
Image bi =ImageIO.read(in);
//获取图像的高度,宽度
int height=bi.getHeight(null);
int width =bi.getWidth(null);
//构建图片流
BufferedImage tag = new BufferedImage(width / 4, height / 4,
BufferedImage.TYPE_INT_RGB);
//绘制改变尺寸后的图
tag.getGraphics().drawImage(bi, 0, 0,width / 4, height / 4, null);
//转字节流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(tag, "jpg",out);
//InputStream is = new ByteArrayInputStream(out.toByteArray());
data = out.toByteArray();
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
String img = encoder.encode(data).replaceAll("\r\n|\r|\n", "");
return img;
}
前端代码如下:
function printDraw(){
var LODOP;
LODOP = getLodop();
LODOP.SET_PRINT_PAGESIZE(1,0,0,"A1");
$.ajax({
type: 'post',
async: false,
data: {},
url: "${pageContext.request.contextPath}/F09/readImg",//方法路径
success: function (data1) {
debugger
if (data1 != null) {
var a = data1.replace(/\"/g, '');
LODOP.ADD_PRINT_IMAGE("5mm","5mm","190mm","350mm","data:image/jpg;base64,"+a);
}
}
})
LODOP.PREVIEW();
}
上过代码之后,说一下我在编写此段代码中遇到的坑。
首先是在后台转换base64编码后,打印图片会报错
查看前台的base64编码
发现前台读取后竟然多了很多“\t\n”,于是在后台代码中添加了
String img = encoder.encode(data).replaceAll("\r\n|\r|\n", "");
本来想这样肯定可以打出图片来,但是按过打印按钮以后,发现虽然插件没报错,但是打印出来的还是一张白纸。
经过一些图片的替换后,原来是图片尺寸过大,无法完全显示。之后又加上以下代码:
//获取图像的高度,宽度
int height=bi.getHeight(null);
int width =bi.getWidth(null);
//构建图片流
BufferedImage tag = new BufferedImage(width / 4, height / 4,
BufferedImage.TYPE_INT_RGB);
//绘制改变尺寸后的图
tag.getGraphics().drawImage(bi, 0, 0,width / 4, height / 4, null);
将图片缩小。
这回终于可以正常的打印图片了!