html转换为pdf

1、参考

wkhtmltopdf下载页面

Windows和Linux 安装wkhtmltopdf

2、说明

3、代码

package com.kikyo.data.utils;

import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;


public class PdfHtmlToPdfUtils {
    private static String toPdfTool = "D:\\Program\\tools\\wkhtmltox-0.12.6-1.mxe-cross-win64\\wkhtmltox\\bin\\wkhtmltopdf.exe";
    private static String Font = "C:\\Windows\\Fonts\\simsun.ttc";

    /**
     * html转pdf
     *
     * @param srcPath  html路径,可以是硬盘上的路径,也可以是网络路径
     * @param destPath pdf保存路径
     * @return 转换成功返回true
     */
    public static boolean convert(String srcPath, String destPath) throws Exception {
        File parent = new File(destPath).getParentFile();
        if (!parent.exists()) {
            parent.mkdirs();
        }
        StringBuilder cmd = new StringBuilder();
        if (System.getProperty("os.name").indexOf("Windows") == -1) {
            toPdfTool = "/usr/local/bin/wkhtmltopdf";   //非windows 系统
        }
        String r_header = "https://xxxxxxxxxxxxxxx/uploadCard/header.html";
        String r_footer = "https://xxxxxxxxxxxxxxxx/uploadCard/footer.html";

        cmd.append(toPdfTool);
        cmd.append(" ");
        cmd.append(" --header-html " + r_header + "?");
        cmd.append(" --footer-html " + r_footer + "?");
        cmd.append(" --margin-top 3cm ");//设置页面上边距 (default 10mm)
        cmd.append(" --margin-bottom 2cm ");
        cmd.append(" --header-spacing 5 ");// (设置页眉和内容的距离,默认0)
        cmd.append(" --footer-spacing 5 ");// (设置页脚和内容的距离)
        cmd.append(srcPath);
        cmd.append(" ");
        cmd.append(destPath);

        boolean result = true;
        try {
            System.out.println("aaaaaaaaaa1->" + cmd.toString());
            Process proc = Runtime.getRuntime().exec(cmd.toString(), new String[0]);
            System.out.println("aaaaaaaaaa2->");
            ThreadPoolHelper.execute(() -> {
                print_msg(proc.getErrorStream());
            });
            System.out.println("aaaaaaaaaa3->");
            ThreadPoolHelper.execute(() -> {
                print_msg(proc.getInputStream());
            });
            System.out.println("aaaaaaaaaa4->");
            proc.waitFor();
            System.out.println("aaaaaaaaaa7->");
        } catch (Exception e) {
            System.out.println("aaaaaaaaaa8->" + e.getMessage());
            result = false;
            e.printStackTrace();
            throw e;
        }

        System.out.println("aaaaaaaaaa9->" + Boolean.valueOf(result).toString());

        return result;
    }


    public static boolean convertHtmlToPdf(String inputFile, String outputFile) throws Exception {
        OutputStream os = new FileOutputStream(outputFile);
        ITextRenderer renderer = new ITextRenderer();
        String url = new File(inputFile).toURI().toURL().toString();
        System.out.println(url);
        renderer.setDocument(url);

        // 解决中文支持问题
        ITextFontResolver fontResolver = renderer.getFontResolver();
        fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);  //宋体(新宋体) simsun.ttc
        //解决图片的相对路径问题
        //renderer.getSharedContext().setBaseURL("file:/D:/");
        renderer.layout();
        renderer.createPDF(os);

        os.flush();
        os.close();
        return true;

    }

    public static void itextHtmlToPdf(String path, String pdfPath) throws Exception {
        String url = new File(path).toURI().toURL().toString();
        FileOutputStream os = new FileOutputStream(pdfPath);
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(url);
        // 解决中文不显示问题
        ITextFontResolver fontResolver = renderer.getFontResolver();
        fontResolver.addFont(Font, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

        renderer.layout();
        renderer.createPDF(os);
    }

    public static void print_msg(InputStream inputStream) {
        try {
            InputStreamReader isr = new InputStreamReader(inputStream, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line.toString()); //输出内容
            }
            isr.close();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

        }
    }

    public static void main(String[] args) throws Exception {
        //PdfHtmlToPdfUtils.convert("http://www.baidu.com", "d:/ceshi.pdf");
        //PdfHtmlToPdfUtils.convertHtmlToPdf("pdf.html", "d:/ceshi2.pdf");
        //PdfHtmlToPdfUtils.convert("https://xxxxxxxxxxx/static/pages/consulationCustomerDetail.html?id=139", "d:/ceshi.pdf");
        PdfHtmlToPdfUtils.convert("https://xxxxxxxxxxxxxx/dialog/getDiseaseMessage?id=7882#", "C:\\Users\\K\\Desktop\\test.pdf");
    }
}

posted @ 2023-04-18 18:19  一只桔子2233  阅读(185)  评论(0编辑  收藏  举报