IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java html转PDF -> 正文阅读

[Java知识库]java html转PDF

根据网上java io.woo.htmltopdf依赖库在windows测试能运行,一旦部署到线上总是报依赖的so文件找不到,按照官网文档安装各种ubuntu下依赖都不行,只能放弃。因此本文直接用linux或者windows上htmltopdf工具,执行命令行的方式进行。itextpdf样式不好,也是放弃的。调用addhtml生成html,在调用htmlToPdf生成PDF。

1. 下载工具包

windows上水印添加需要配置环境。

下载地址?wkhtmltopdf

ubuntu下载

apt install wkhtmltopdf

2.?代码实现

package com.xxxx.tools;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;

/**
 * * @Creator  Jacky
 * * @CreateTime 2022/2/22
 * * @Description
 */
public class HtmlTools {

    public static String LINUX_PATH = "/usr/bin/xvfb-run /usr/bin/wkhtmltopdf";

    public static String WINDOWS_PATH = "C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";

    public static boolean addHtml(JSONObject jsonObject, String path){
        //用于存储html字符串
        StringBuilder html = new StringBuilder();
        //输入HTML文件内容
        html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">").append("\n");
        html.append("<head>").append("\n");
        html.append("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">").append("\n");
        //html.append("<meta charset=\"utf-8\">").append("\n");
        //html.append("<title>简历</title>").append("\n");
        getCss(html);
        html.append("</head>").append("\n");
        html.append("<body style='font-family: SimSun,serif;word-wrap:break-word;word-break: break-all;'>").append("\n");
        getBody(html,jsonObject);
        html.append("</body></html>").append("\n");
        try{
            File f = new File(path);
            if (f.getParentFile() == null) {
                Objects.requireNonNull(f.getParentFile()).isDirectory();
            }
            // 创建文件
            f.getParentFile().mkdirs();
            //将HTML文件内容写入文件中
            FileOutputStream fileOutputStream=new FileOutputStream(path);
            PrintStream printStream=new PrintStream(fileOutputStream);
            // 转码,转化为utf-8
            String htmls = new String(html.toString().getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
            printStream.println(htmls);
            fileOutputStream.flush();
            printStream.flush();
            fileOutputStream.close();
            printStream.close();
            return true;
        }catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static boolean htmlToPdf(String outputFile,String htmlPath) {
        File outFile = new File(outputFile);
        if (!outFile.exists()) {
            outFile.getParentFile().mkdirs();
        }

        String toPdfTool = "";
        StringBuilder cmd = new StringBuilder();
        if (!System.getProperty("os.name").contains("Windows")) {
         // 非windows 系统
            toPdfTool =LINUX_PATH;
         }else{
            toPdfTool = WINDOWS_PATH;
        }
        cmd.append(toPdfTool);
        cmd.append(" ");
        cmd.append(" ");
        cmd.append(htmlPath);
        cmd.append(" ");
        cmd.append(" ");
        cmd.append(outputFile);
        System.out.println(cmd);
        boolean result = true;
        try {
           String html = new String(cmd.toString().getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
           Process proc = Runtime.getRuntime().exec(html);
           HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
           HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
           error.start();
           output.start();
           proc.waitFor();
        } catch (Exception e) {
            result = false;
            e.printStackTrace();
        }
        return result;
    }

    public static void getCss(StringBuilder html){
        html.append("<style type=\"text/css\">").append("\n");
        html.append("@page:left{margin: 0cm;}").append("\n");
        html.append("@page:right{margin: 0cm;}").append("\n");
        html.append(".resumeDetails .t1 {width: 90%;margin: 0 auto;padding: 0 20px 20px 20px;background: #ffffff;border-radius: 10px;}").append("\n");
        html.append(".resumeDetails .t3 {border-left: 4px solid #00abc3;padding-left: 8px;line-height: 1;font-size: 28px;margin: 30px 0 20px;font-weight: bold;color: #333333; }").append("\n");
        html.append(".resumeDetails .t12 {position: relative;padding: 20px 40px 30px;}").append("\n");
        html.append(".resumeDetails .t5 {font-size: 32px;font-weight: bold;color: #333333;margin: 24px 0;}").append("\n");
        html.append(".resumeDetails .t6 { font-size: 24px;color: #666666;margin: 24px 0 40px; }").append("\n");
        html.append(".resumeDetails .t10 { position: absolute;right: 50px;top: 50px;width: 78px;height: 78px;display: flex; }").append("\n");
        html.append(".resumeDetails .t10 .headImg { width: 78px;height: 78px;border-radius: 50%; }").append("\n");
        html.append(".resumeDetails .t10 .sexIcon { width: 16px;height: 16px;position: absolute;right: 0;bottom: 0; }").append("\n");
        html.append(".resumeDetails .t4 .t8>p { font-size: 26px;font-weight: bold;display: inline-block;vertical-align: top;color: #333333;line-height: 1;padding-right: 20px;margin-right: 20px; }").append("\n");
        html.append(".resumeDetails .t4 .t9>p { display: inline-block;padding: 4px 20px;background: #f3f7fa;border-radius: 5px;margin-right: 10px;font-size: 22px;color: #999999; }").append("\n");
        html.append(".resumeDetails .t4 .t7 { border-right: 2px solid #999999; }").append("\n");
        html.append(".resumeDetails .t4>div { display: flex;margin-top: 10px;font-size: 24px;color: #666666; }").append("\n");
        html.append(".resumeDetails .t4 .a1 { display: block; }").append("\n");
        html.append(".resumeDetails .t4 .a1 span { margin-right: 30px; }").append("\n");
        html.append(".resumeDetails .t4 .a1 .a2 { margin-bottom: 10px; }").append("\n");
        html.append(".resumeDetails .t4 .a1 .a2 img { height: 112px;border-radius: 9px;margin-right: 12px;margin-bottom: 12px; }").append("\n");
        html.append("</style>").append("\n");
    }

    public static void getBody(StringBuilder html,JSONObject jsonObject){
        Integer def = jsonObject.getInteger("pdf_lang");
        html.append("<div class=\"resumeDetails\">").append("\n");
        html.append("<div class=\"t1\">").append("\n");
        html.append("<div class=\"t12\" id=\"pdfDom\">").append("\n");

        if(!StringUtils.isEmpty(jsonObject.getString("pdf_info"))){
            //个人模块
            ResumePdfInfo pdfInfo = (ResumePdfInfo)jsonObject.get("pdf_info");
            if(pdfInfo!=null){
                html.append("<div class=\"t5\">").append(pdfInfo.getNickName()).append("</div>\n");
                html.append("<div class=\"t6\">").append("\n");
                html.append("<span>")
                    .append(pdfInfo.getEducation()).append(" | ")
                    .append(pdfInfo.getCityName()).append(" | ")
                    .append(pdfInfo.getAge()).append(" | ")
                    .append(pdfInfo.getMobile()).append(" | ")
                    .append(pdfInfo.getEmail()).append("</span>\n");
                html.append("</div>").append("\n");
            }
        }


        if(!StringUtils.isEmpty(jsonObject.getString("pdf_info"))){
            //个人模块
            ResumePdfInfo pdfInfo = (ResumePdfInfo)jsonObject.get("pdf_info");
            if(pdfInfo!=null){
                html.append("<div class=\"t10\">").append("\n");
                html.append("<div>").append("\n");
                if(!StringUtils.isEmpty(pdfInfo.getImageUrl())){
                    html.append("<img class=\"headImg\" src=\"").append(pdfInfo.getImageUrl()).append("\" alt=\"\"/>").append("\n");
                }else{
                    html.append("<img class=\"headImg\" src=\"xxxxx\"/>").append("\n");
                }

                if(pdfInfo.getGender()!=null){
                    if(pdfInfo.getGender()==1){
                        html.append("<img class=\"sexIcon\" src=\"xxx\"/>").append("\n");
                    }else{
                        html.append("<img class=\"sexIcon\" src=\"https://xxxx\"/>").append("\n");
                    }
                }
                html.append("</div>").append("\n");
                html.append("</div>").append("\n");
            }
        }

        html.append("</div>").append("\n");
        html.append("</div>").append("\n");
        html.append("</div>").append("\n");
    }

}
package com.xxxx.tools;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * * @Creator  Jacky
 * * @CreateTime 2022/3/15
 * * @Description
 */
public class HtmlToPdfInterceptor extends Thread {
    private InputStream is;

    public HtmlToPdfInterceptor(InputStream is){
        this.is = is;
    }

    @Override
    public void run(){
        try{
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line.toString()); //输出内容
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:29:52  更:2022-04-07 22:30:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:58:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码