方案一 将数据拼接成HTML字符串报道到指定地址,读取html转成base64Img数据
1>将字符串转成HTML并保持
String str="<!DOCTYPE html>\n" +
"<html>\n" +
"\n" +
"<head>\n" +
" <meta charset=\"utf-8\" />\n" +
" <title>Echarts</title>\n" +
"</head>\n" +
"\n" +
"<body>\n" +
" <div style=\"width: 650px\">\n" +
" <div style=\"width: 600px;margin: 0 auto;font-size: 10px;\">\n" +
" <div style=\"text-align: center;border-bottom: 1px dashed #000;line-height: 30px;font-size: 12px;\">\n" +
" 临时住宿人员信息表\n" +
" </div>\n" +
" <p>流水号:<span>NS305152520190201150134</span></p>\n" +
" <div style=\"text-align: center\">\n" +
" <img src=\"https://ss1.bdstatic.com/5aAHeD3nKgcUp2HgoI7O1ygwehsv/media/ch1000/png/pct1.png\" alt=\"\" style=\"width:580px;height:auto;text-align: center\">\n" +
" </div>\n" +
" <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
" <table style=\"width:580px;margin: 0 auto;line-height: 20px;\">\n" +
" <tr>\n" +
" <td style=\"text-align: left\">姓名</td>\n" +
" <td style=\"text-align: right\">XXX</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">身份号码</td>\n" +
" <td style=\"text-align: right\">XXXXX</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">性别</td>\n" +
" <td style=\"text-align: right\">男</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">民族</td>\n" +
" <td style=\"text-align: right\">XXX\n" +
" <img style=\"height:15px;position: relative;top:3px;\" src=\"XXXXXXX\">\n" +
" </td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">联系电话</td>\n" +
" <td style=\"text-align: right\">\n" +
" XXXXXXX\n" +
" <img style=\"height:15px;position: relative;top:3px;\" src=\"XXXXXXXX">\n" +
" </td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">常住地址</td>\n" +
" <td style=\"text-align: right\">北京市昌平区\n" +
" <img style=\"height:15px;position: relative;top:3px;\" src=\"XXXXXX">\n" +
" </td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">入住酒店</td>\n" +
" <td style=\"text-align: right\">\网证体验中心</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">入住房号</td>\n" +
" <td style=\"text-align: right\">458</td>\n" +
" </tr>\n" +
" <tr>\n" +
" <td style=\"text-align: left\">入住时间</td>\n" +
" <td style=\"text-align: right\">2019.02.01-2019.02.02</td>\n" +
" </tr>\n" +
" </table>\n" +
" <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
" <p>广州市公安局南沙分局</p>\n" +
" <table style=\"width:580px;margin: 0 auto;line-height: 20px;\">\n" +
" <tr>\n" +
" <td style=\"text-align: left\">打印时间<span>2019.02.01 03-01</span></td>\n" +
" <td style=\"text-align: right\">经办:<span>XXX</span></td>\n" +
" </tr>\n" +
" </table>\n" +
" <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
" <p>注:</p>\n" +
" <p>1、酒店需与派出所核对住宿人员信息;</p>\n" +
" <p>2、仅在同一酒店一次性住宿使用(可连续住宿多天,退房/复印无效);</p>\n" +
" <p>3、此件由酒店每月初交回派出所,复印订装备份</p>\n" +
" <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
" <table style=\"width:580px;margin: 0 auto;line-height: 20px;\">\n" +
" <tr>\n" +
" <td style=\"text-align: left\">经办人签名:</td>\n" +
" <td style=\"text-align: right\"><image style=\"height:20px;\" src=\"\"></image></td>\n" +
" </tr>\n" +
" </table>\n" +
" <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
" </div>\n" +
" </div>\n" +
"</body>\n" +
"\n" +
"</html>";
//String path=request.getServletContext().getRealPath("/");
File file=new File("./a.html");
BufferedWriter bw=null;
try {
bw=new BufferedWriter(new FileWriter(file,true));
bw.write(str);
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2> 读取HTML并转换成Base64
ImageRenderer render = new ImageRenderer();
String url = "file:///C:/Users/Lenovo/Desktop/a.html";
File file;
InputStream inputStream = null;
byte[] data = null;
try {
//创建一个临时文件
file = File.createTempFile("temp", ".png");
//将html转为png
FileOutputStream out = new FileOutputStream(file);
render.renderURL(url, out, ImageRenderer.Type.PNG);
//字节流读取png
inputStream = new FileInputStream(file);
data = new byte[inputStream.available()];
inputStream.read(data);
out.close();
inputStream.close();
file.deleteOnExit();
} catch (Exception e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
//删除所有空格,换行,解决base解码出现中文乱码
String dat1a = encoder.encode(data).replaceAll("\n", "").replaceAll("\r", "");
log.info(dat1a);
方案二 将数据拼转换成Io流程保存到ftp,读取ftp转成base64Img数据
1>将数据导入模板,上传ftp并解析
(这里模板就用上面的就好)
long data=System.currentTimeMillis();
//上传到ftp
InputStream inputStream=null;
byte [] io;
try {
io=str.getBytes();
inputStream = new ByteArrayInputStream(io);
}catch (Exception e){
e.printStackTrace();
}
FtpUtil.uploadFile("ip",端口号,"账号","密码","路径",data+"a.html",inputStream);
String base64Img=outImg("https://ns.weijing.gov.cn/DownloadData/data/download?serilId=a.html&fileName="+data+"a.html&path=/Dabby_test/wiicopData");
/**功能描述
* @Desc
* @Description 根据访问地址将HTML生成图片
* @Author chenzhicai
* @Date Created in 11:18 2019/2/12
* @Params
* @return
* @Version:
*
*
*/
public String outImg(String path){
//解析html
ImageRenderer render = new ImageRenderer();
String url = path;
File file;
InputStream inputStream = null;
byte[] data = null;
try {
//创建一个临时文件
file = File.createTempFile("temp", ".png");
//将html转为png
FileOutputStream out = new FileOutputStream(file);
render.renderURL(url, out, ImageRenderer.Type.PNG);
//字节流读取png
inputStream = new FileInputStream(file);
data = new byte[inputStream.available()];
inputStream.read(data);
out.close();
inputStream.close();
file.deleteOnExit();
} catch (Exception e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
//删除所有空格,换行,解决base解码出现中文乱码
String dat1a = encoder.encode(data).replaceAll("\n", "").replaceAll("\r", "");
log.info(dat1a);
return dat1a;
}
Ftp工具类
依赖
<!--ftp-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<!--解析-->
<dependency>
<groupId>com.github.xuwei-k</groupId>
<artifactId>html2image</artifactId>
<version>0.1.0</version>
</dependency>
<dependency>
<groupId>net.sf.cssbox</groupId>
<artifactId>cssbox</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
package cn.dabby.hotelacc.utils;
import java.io.*;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
/**
*
* @author
*
*/
public class FtpUtil {
/**
* 下载文件
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器文件目录
* @param filename weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20
* @param localpath 下载后的文件路径
* @return
*/
public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
//ftp中文编码格式设置
String LOCAL_CHARSET="GBK";
try {
try {
ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
} catch (Exception e) {
throw new Exception("login ftp error!");
}
//设置ftp编码格式
ftpClient.setControlEncoding(LOCAL_CHARSET);
//切换FTP目录
pathname=new String(pathname.getBytes("GBK"),"iso-8859-1");//如果目录名有中文则做编码格式转换
if (!ftpClient.changeWorkingDirectory(pathname)) {// 如果不能进入dir下,说明此目录不存在!
System.out.println("创建文件目录【"+pathname+"】 失败!");
return flag;
}
FTPFile[] ftpFiles = ftpClient.listFiles();
for(FTPFile file : ftpFiles){
if(filename.equalsIgnoreCase(file.getName())){
file.setName(new String(file.getName().getBytes("GBK"),"iso-8859-1"));//如果文件名名有中文则做编码格式转换
File localFile = new File(localpath);
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
}
}
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
/**
* 上传文件(可供Action/Controller层使用)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param fileName 上传到FTP服务器后的文件名称
* @param inputStream 输入文件流
* @return
*/
public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");
try {
try {
ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
} catch (Exception e) {
throw new Exception("connect ftp error!");
}
//pathname=new String(pathname.getBytes("UTF-8"),"iso-8859-1");//如果目录名有中文则做编码格式转换
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
if (!ftpClient.changeWorkingDirectory(pathname)) {// 如果不能进入dir下,说明此目录不存在!
if (!ftpClient.makeDirectory(pathname)) {
System.out.println("创建文件目录【"+pathname+"】 失败!");
}
}
ftpClient.enterLocalPassiveMode();
ftpClient.storeFile(fileName, inputStream);
inputStream.close();
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 上传文件(可对文件进行重命名)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param filename 上传到FTP服务器后的文件名称
* @param originfilename 待上传文件的名称(绝对地址)
* @return
*/
public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){
boolean flag = false;
try {
InputStream inputStream = new FileInputStream(new File(originfilename));
flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);
System.out.println(flag);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 上传文件(不可以进行文件的重命名操作)
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param originfilename 待上传文件的名称(绝对地址)
* @return
*/
public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){
boolean flag = false;
try {
String fileName = new File(originfilename).getName();
InputStream inputStream = new FileInputStream(new File(originfilename));
flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);
System.out.println(flag);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 删除文件
* @param hostname FTP服务器地址
* @param port FTP服务器端口号
* @param username FTP登录帐号
* @param password FTP登录密码
* @param pathname FTP服务器保存目录
* @param filename 要删除的文件名称
* @return
*/
public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){
boolean flag = false;
FTPClient ftpClient = new FTPClient();
try {
try {
ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
//连接FTP服务器
ftpClient.connect(hostname, port);
//登录FTP服务器
ftpClient.login(username, password);
//验证FTP服务器是否登录成功
int replyCode = ftpClient.getReplyCode();
if(!FTPReply.isPositiveCompletion(replyCode)){
return flag;
}
} catch (Exception e) {
throw new Exception("login ftp error!");
}
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
ftpClient.dele(filename);
ftpClient.logout();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
if(ftpClient.isConnected()){
try {
ftpClient.logout();
} catch (IOException e) {
}
}
}
return flag;
}
private FTPClient newFtpClient(String host, String user, String pwd) throws Exception {
FTPClient ftp = new FTPClient();
//ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
int reply;
ftp.connect(host);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
throw new Exception("Exception in connecting to FTP Server");
}
ftp.login(user, pwd);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
return ftp;
}
/**
* 根据地址直接获取文件内容
* @param absp
* @return
*/
public byte[] getFile(String absp,String Host,String Username,String Password) {
byte[] ret = null;
try {
FTPClient ftp = newFtpClient(Host, Username, Password);
InputStream is = ftp.retrieveFileStream(absp);
if (is != null) {
ret = IOUtils.toByteArray(is);
is.close();
}else{
System.out.println("找不到当天对账文件");
}
} catch (Exception e) {
ret = null;
}
return ret;
}
//可以将获取的byte[] 转换城base64字符串
Base64.getEncoder().encode(ret)
}