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(文字/图片/页眉页脚)...相关推荐

  1. Java 处理PDF文档(一):页眉页脚、水印、背景、附件

    前言 本文将介绍通过Java编程来处理PDF文档的一些方法,因为一篇文档的处理可能包括很多内容,比如文档安全性设置(水印.加密/解密).文本/图片/图形操作.注释.附件.域.文档转换(其他文件格式转为 ...

  2. Java生成pdf设置两行页脚_Itextpdf 5 html生成pdf 页眉页脚

    效果图 QQ图片20190117140345.png 继承PdfPageEventHelper重写onEndPage方法 package com.xuqiang.itext.test; import ...

  3. java 手机号脱敏,身份证号脱敏 工具类

    java 手机号脱敏,身份证号脱敏 工具类 import org.apache.commons.lang3.StringUtils;/*** * @title: 脱敏工具类* @author: wll ...

  4. JAVA进阶级开发之(Array工具类)

    目录 常见的算法: 1.排序算法: 2.查找算法: 3.算法: 4.冒泡排序算法(理论) 4.选择排序算法(理论) 5.数组的元素查找: 6.介绍一下java.util.Arrays工具类 我们学习数 ...

  5. Java基础---常用类之Arrays工具类+基本类型的包装类

    常用类之Arrays工具类 1.binarySearch(int[] a,int key) 使用二分搜索法来搜索指定的 int 型数组 2.fill(int[] a,int val)将指定的 int ...

  6. Java - HuTool 使用 EscapeUtil、XmlUtil等工具类(四)

    Java - HuTool 使用 EscapeUtil.XmlUtil等工具类(四) 本篇主要介绍 HuTool工具, 其是 java工具类,对于一些静态方法进行封装,虽然很小,但很全,里面拥有平时我 ...

  7. java pdf 页眉_itext生成PDF设置页眉页脚的实例详解

    itext生成PDF设置页眉页脚的实例详解 实例代码: /** * ITextTest * iText生成PDF加入列表,注释等内容,同时设置页眉和页脚及页码等. */ package com.lab ...

  8. 记录一下:Java 汉字获取拼音或首字母工具类

    记录一下:Java 汉字获取拼音或首字母工具类 Maven依赖配置 Java代码 本文主要记录一下在Java中,如何将字符串中的中文转化为拼音,获取汉字串拼音首字母,获取汉字串拼音的工具类,以及相关的 ...

  9. Java教程:微信排序并加密工具类

    Java教程:微信排序并加密工具类 源码: import cn.bsit.commons.md5.MD5Utils;import java.util.Arrays; import java.util. ...

  10. java多线程并发之旅-20-同步工具类。闭锁/栅栏/信号量/阻塞队列/FutureTask

    同步工具类 同步工具类主要包括闭锁(如CountDownLatch),栅栏(如CyclicBarrier),信号量(如Semaphore)和阻塞队列(如LinkedBlockingQueue)等: F ...

最新文章

  1. android studio 2.1正式版,Android Studio 1.2 正式版发布
  2. tensorflow+python flask进行手写识别_使用tensorflow进行手写数字识别
  3. FastDFS部署及测试
  4. WPF TextBox 正则验证 大于等于0 小于等于1 的两位小数
  5. 基于AVR单片机PWM功能的数控恒流源研制
  6. 蓝桥杯 ALGO-143 算法训练 字符串变换
  7. linux添加一块硬盘分区,centos6中添加一块新的硬盘并分区的方法介绍
  8. 【ARM】Linux驱动移植
  9. Oracle如何导出存储过程
  10. SpringBoot导出txt文件
  11. win10系统怎么查看电脑配置,win10电脑配置查看
  12. 新手如何发网站外链,网站的外链如何发,发外链的方法集合
  13. 伴儿行“四村点面融入,文化牵线搭桥”项目结项
  14. 首次公开,用了三年的 pandas 速查表
  15. c语言小游戏----改版斗兽棋
  16. 对于电商尺码跟颜色组成的表格输入框,对输入框的操作
  17. 网站装饰html代码,html常用装饰代码分享
  18. Jave虚拟机划分的三个代: 年轻代、年老代和持久代
  19. Java发送邮件链接实现登录注册
  20. 新日标 第一课 李さんは中国人です(ノート)

热门文章

  1. linux环境ubuntu: pushd: not found
  2. Spring中引用不同xml中的bean
  3. python学习之课后习题
  4. w3wp.exe进程资源占用过大问题
  5. OMEA Pro,刚刚荣获15届Jolt大奖,综合RSS阅读,邮件、任务等管理的IIM(智能信息管理)...
  6. sqlhelp(sqlite)
  7. 火狐浏览器 附件组件 Xpath 使用
  8. C++编译器在编译程序时会自动定义的预处理器(类似于全局变量)
  9. mysql中where的用法_详解MySQL中WHERE子句的用法
  10. 日常投票评分:大多都是拉票