java实现pdf打印工具类,Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚)...
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* 生成PDF工具类
*/
@Slf4j
public class HtmlToPdfUtils {
/**
* wkhtmltopdf在 Windows、Linux系统中的安装路径
*/
private static final String WINDOWS_HTML_TO_PDF_TOOL = "E:\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
private static final String LINUX_HTML_TO_PDF_TOOL = "/opt/wkhtmltox/bin/wkhtmltopdf";
/**
* 页眉图片html:Windows、Linux系统中的路径
*/
private static final String WINDOWS_HEAD_HTML = "D:\\head.html";
private static final String LINUX_HEAD_HTML = "/opt/head.html";
/**
* 页脚图片html:Windows、Linux系统中的路径
*/
private static final String WINDOWS_FOOT_HTML = "D:\\foot.html";
private static final String LINUX_FOOT_HTML = "/opt/foot.html";
/**
* 临时文件存放目录:Windows、Linux系统中的路径
*/
public static final String WINDOWS_FILE_URL = "D:\\pdf\\temporary\\file";
public static final String LINUX_FILE_URL = "/opt/temporary/file";
static {
String fileUrl = isWindowsSystem() ? WINDOWS_FILE_URL : LINUX_FILE_URL;
File f = new File(fileUrl);
if(!f.exists()){
f.mkdirs();
}
}
/**
* html字符串转pdf,会生成垃圾文件,需要定时清理
*
* @param data 替换好的html字符串
* @param destFileName 保存pdf的名称
* @return 返回pdf成功生成的路径
*/
public static String convertStringToHtml(String data, String destFileName) {
return convert(stringToHtml(data), destFileName);
}
/**
* 判断当前系统是否是Windows系统
* @return true:Windows系统,false:Linux系统
*/
public static boolean isWindowsSystem(){
String property = System.getProperty("os.name").toLowerCase();
return property.contains("windows");
}
/**
* html转pdf(加页眉页脚)
*
* @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径
* @param destFileName 保存pdf的名称
* @return 返回pdf成功生成的路径
*/
public static String convert(String srcPath, String destFileName) {
destFileName = (isWindowsSystem() ? WINDOWS_FILE_URL + "\\" : LINUX_FILE_URL + "/") + destFileName;
File file = new File(destFileName);
// File parent = file.getParentFile();
//如果pdf保存路径不存在,则创建路径
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
log.error("html转pdf,创建文件失败:{}", destFileName);
}
}
StringBuilder cmd = new StringBuilder();
String toPdfTool = isWindowsSystem() ? WINDOWS_HTML_TO_PDF_TOOL : LINUX_HTML_TO_PDF_TOOL;
// 这里可以拼接页眉页脚等参数
cmd.append(toPdfTool);
cmd.append(" ");
// wkhtmltopdf默认不允许访问本地文件,需加入以下参数
cmd.append(" --enable-local-file-access");
// cmd.append(" --page-size A4");
cmd.append(" ");
cmd.append(" --disable-smart-shrinking");
// 页眉图片
cmd.append(" --header-html " + (isWindowsSystem() ? WINDOWS_HEAD_HTML : LINUX_HEAD_HTML));
cmd.append(" --header-spacing 5");
// 页脚图片
cmd.append(" --footer-html " + (isWindowsSystem() ? WINDOWS_FOOT_HTML : LINUX_FOOT_HTML));
cmd.append(" " + srcPath);
cmd.append(" ");
cmd.append(destFileName);
try {
log.info("html转pdf命令:{}", cmd.toString());
Process proc = Runtime.getRuntime().exec(cmd.toString());
HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
error.start();
output.start();
proc.waitFor();
log.info("html转pdf成功:html路径:{} pdf保存路径:{}", srcPath, destFileName);
} catch (Exception e) {
destFileName = "";
e.printStackTrace();
log.error("html转pdf失败:html路径:{} pdf保存路径:{}", srcPath, destFileName);
}
return destFileName;
}
/**
* html字符串转pdf,会生成临时html文件,需要定时清理
*
* @param data 替换好的html字符串
* @return 返回生成的临时文件名称
*/
public static String stringToHtml(String data) {
String srcPath = "";
OutputStreamWriter osw = null;
try {
// 生成随机名字
String code = String.format("%04d",(int) ((Math.random()*9+1) * 1000));
String nowDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
// 根据系统,创建字符输出流对象,负责向文件内写入
if (!isWindowsSystem()) {
// 非Windows 系统
srcPath = LINUX_FILE_URL + "/" +String.format("%s%s", code , nowDate) + ".html";
} else {
srcPath = WINDOWS_FILE_URL + "\\" + String.format("%s%s", code , nowDate) + ".html";
}
osw = new OutputStreamWriter(new FileOutputStream(srcPath), StandardCharsets.UTF_8);
log.info("html转pdf,生成临时文件:{}", srcPath);
// 将str里面的内容读取到fw所指定的文件中
osw.write(data);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
log.error("html转pdf,生成临时文件失败:{}", e);
}finally{
if(osw!=null){
try {
osw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
log.error("html转pdf,生成临时文件关流失败:{}", e);
}
}
}
return srcPath;
}
public static void main(String[] args) {
HtmlToPdfUtils.convert("D:\\test.html", "D:\\wkhtmltopdf.pdf");
}
}
java实现pdf打印工具类,Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚)...相关推荐
- Java 处理PDF文档(一):页眉页脚、水印、背景、附件
前言 本文将介绍通过Java编程来处理PDF文档的一些方法,因为一篇文档的处理可能包括很多内容,比如文档安全性设置(水印.加密/解密).文本/图片/图形操作.注释.附件.域.文档转换(其他文件格式转为 ...
- Java生成pdf设置两行页脚_Itextpdf 5 html生成pdf 页眉页脚
效果图 QQ图片20190117140345.png 继承PdfPageEventHelper重写onEndPage方法 package com.xuqiang.itext.test; import ...
- java 手机号脱敏,身份证号脱敏 工具类
java 手机号脱敏,身份证号脱敏 工具类 import org.apache.commons.lang3.StringUtils;/*** * @title: 脱敏工具类* @author: wll ...
- JAVA进阶级开发之(Array工具类)
目录 常见的算法: 1.排序算法: 2.查找算法: 3.算法: 4.冒泡排序算法(理论) 4.选择排序算法(理论) 5.数组的元素查找: 6.介绍一下java.util.Arrays工具类 我们学习数 ...
- Java基础---常用类之Arrays工具类+基本类型的包装类
常用类之Arrays工具类 1.binarySearch(int[] a,int key) 使用二分搜索法来搜索指定的 int 型数组 2.fill(int[] a,int val)将指定的 int ...
- Java - HuTool 使用 EscapeUtil、XmlUtil等工具类(四)
Java - HuTool 使用 EscapeUtil.XmlUtil等工具类(四) 本篇主要介绍 HuTool工具, 其是 java工具类,对于一些静态方法进行封装,虽然很小,但很全,里面拥有平时我 ...
- java pdf 页眉_itext生成PDF设置页眉页脚的实例详解
itext生成PDF设置页眉页脚的实例详解 实例代码: /** * ITextTest * iText生成PDF加入列表,注释等内容,同时设置页眉和页脚及页码等. */ package com.lab ...
- 记录一下:Java 汉字获取拼音或首字母工具类
记录一下:Java 汉字获取拼音或首字母工具类 Maven依赖配置 Java代码 本文主要记录一下在Java中,如何将字符串中的中文转化为拼音,获取汉字串拼音首字母,获取汉字串拼音的工具类,以及相关的 ...
- Java教程:微信排序并加密工具类
Java教程:微信排序并加密工具类 源码: import cn.bsit.commons.md5.MD5Utils;import java.util.Arrays; import java.util. ...
- java多线程并发之旅-20-同步工具类。闭锁/栅栏/信号量/阻塞队列/FutureTask
同步工具类 同步工具类主要包括闭锁(如CountDownLatch),栅栏(如CyclicBarrier),信号量(如Semaphore)和阻塞队列(如LinkedBlockingQueue)等: F ...
最新文章
- android studio 2.1正式版,Android Studio 1.2 正式版发布
- tensorflow+python flask进行手写识别_使用tensorflow进行手写数字识别
- FastDFS部署及测试
- WPF TextBox 正则验证 大于等于0 小于等于1 的两位小数
- 基于AVR单片机PWM功能的数控恒流源研制
- 蓝桥杯 ALGO-143 算法训练 字符串变换
- linux添加一块硬盘分区,centos6中添加一块新的硬盘并分区的方法介绍
- 【ARM】Linux驱动移植
- Oracle如何导出存储过程
- SpringBoot导出txt文件
- win10系统怎么查看电脑配置,win10电脑配置查看
- 新手如何发网站外链,网站的外链如何发,发外链的方法集合
- 伴儿行“四村点面融入,文化牵线搭桥”项目结项
- 首次公开,用了三年的 pandas 速查表
- c语言小游戏----改版斗兽棋
- 对于电商尺码跟颜色组成的表格输入框,对输入框的操作
- 网站装饰html代码,html常用装饰代码分享
- Jave虚拟机划分的三个代: 年轻代、年老代和持久代
- Java发送邮件链接实现登录注册
- 新日标 第一课 李さんは中国人です(ノート)
热门文章
- linux环境ubuntu: pushd: not found
- Spring中引用不同xml中的bean
- python学习之课后习题
- w3wp.exe进程资源占用过大问题
- OMEA Pro,刚刚荣获15届Jolt大奖,综合RSS阅读,邮件、任务等管理的IIM(智能信息管理)...
- sqlhelp(sqlite)
- 火狐浏览器 附件组件 Xpath 使用
- C++编译器在编译程序时会自动定义的预处理器(类似于全局变量)
- mysql中where的用法_详解MySQL中WHERE子句的用法
- 日常投票评分:大多都是拉票