zoukankan      html  css  js  c++  java
  • 将html文档转成pdf

    (1)使用场景:在项目中使用到了合同,只有在合同的头部,是不相同的。在合同的主体部分都是相同的,因此就把他放到了模板(html文件)里面。

      在用户线上签约完成之后,可以将pdf版的合同下载。

    (2)需求:由上可以看出,首先需要把html文件转成pdf。其次需要将pdf下载。

    (3)code:

      1)在上午就顺利的找了一段合适的代码,成功的跑起来了,在参数里面需要传递一个html文件,因为我测试的是一个类似于hello word的简单的html,所以就侥幸成功了。可能是找的过程太顺利了!!!结果将html换成项目中的文件后死后调不出来,百度才知道,这种方式只能将标准格式的html转成pdf。这里所谓的标准,,标准到表态。。此方法,弃~【但是怎么也是费劲调出来的,就也贴出来吧】、

    原文地址:https://blog.csdn.net/m15732622413/article/details/78456961?utm_source=blogxgwz1

    package com.jeeplus.common.utils;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.StringWriter;
    import java.io.Writer;
    import java.net.MalformedURLException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.xhtmlrenderer.pdf.ITextFontResolver;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    
    import com.jeeplus.core.web.BaseController;
    import com.lowagie.text.DocumentException;
    import com.lowagie.text.pdf.BaseFont;
    import com.mitchellbosecke.pebble.PebbleEngine;
    import com.mitchellbosecke.pebble.template.PebbleTemplate;
    
    /**
     * 下载PDF文件
     * 
     * @author xiao
     *
     */
    @Controller
    
    public class PDFUtil extends BaseController {
        private static final String FONTPATH = "C:/WINDOWS/Fonts/simsun.ttc";// 支持中文字体(放哪里都行)
    
        public static String exportPdf(String htmlpath, HttpServletResponse response, HttpServletRequest request)
                throws Exception {
            String html = htmlpath;
            String pdf = html2Pdf(html, "D:/测试2.pdf");
            // 如果在控制类有response对象可以直接转换后的pdf文件,在控制类方法需要return null
            downloadFile(pdf, "我的PDF文件.pdf", response, request);
            // return null;
            System.out.println("create html success! 文件存放路径:" + pdf);
            return "导出成功!";
        }
    
        /**
         * html转换pdf文件 注:支持中文,目前iText只支持上面FONTPATH定义的这种字体,所以html文件中也需要用样式设置字体为:SimSun
         * htmlPath 需要转换的html源文件 pdfPath 转换后pdf文件存放地址
         */
        public static String html2Pdf(String htmlPath, String pdfPath) {
            try {
                String url = new File(htmlPath).toURI().toURL().toString();
                OutputStream output = new FileOutputStream(pdfPath);
                ITextRenderer renderer = new ITextRenderer();
                renderer.setDocument(url);
    
                // 解决中文支持问题(html的中文必须用SimSun字体,Java只能支持这1种字体)
                ITextFontResolver fontResolver = renderer.getFontResolver();
                fontResolver.addFont(FONTPATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                renderer.layout();
                renderer.createPDF(output);
                output.close();
                
                return pdfPath;
            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return null;
            } catch (DocumentException e) {
                e.printStackTrace();
                return null;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        /**
         * 文件下载-支持中文名称
         * 
         * @param          sourcePath下载文件全路径(F:/test.pdf)
         * @param          fileName需要生成的下载文件名(HTML转PDF测试.pdf)
         * @param response
         * @throws Exception
         */
        public static void downloadFile(String sourcePath, String fileName, HttpServletResponse response,
                HttpServletRequest request) throws Exception {
            // 读到流中
            InputStream inStream = null;
            try {
                inStream = new FileInputStream(sourcePath);// 文件的存放路径
                // 设置输出的格式
                response.reset();
                String name = new String((fileName));
                response.addHeader("Content-Disposition",
                        "attachment; filename=" + new String(name.getBytes(), "iso-8859-1"));
                // 循环取出流中的数据
                byte[] b = new byte[100];
                int len;
                while ((len = inStream.read(b)) > 0) {
                    response.getOutputStream().write(b, 0, len);
                }
                response.getOutputStream().flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    inStream.close();
                    response.getOutputStream().close();
                    // 删除源文件
                    /*
                     * File sourceFile = new File(sourcePath); if(sourceFile.exists()){
                     * sourceFile.delete(); }
                     */
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

     (4)在网上看到了这个比较,很清晰  原文:https://blog.csdn.net/huyuyang6688/article/details/79710704?utm_source=blogxgwz0

      

  • 相关阅读:
    23 抽象类 abstract
    22.4 Extends --super 和 this 的区别
    22.3 Extends 构造方法的执行顺序
    22.2 继承的 成员变量的执行顺序
    22.1 Extends 继承的 方法重写@Override 和 方法重载Overload 的区别
    22 Extends 继承(子类、父类)
    21.3代码块考试题
    vue-cli3安装
    ==隐式转换是怎样进行的?
    为什么有时候人们用translate来改变位置而不是定位?
  • 原文地址:https://www.cnblogs.com/excellencesy/p/9813725.html
Copyright © 2011-2022 走看看