把浏览器中的页面数据下载为pdf

2023-11-01

把浏览器中的页面数据下载为pdf

![页面样子](https://img-blog.csdnimg.cn/7c0f58887b6c40fe8a7112800e9a8c93.png在这里插入图片描述
下载后效果:(只是内容不一致而已,样式差不多)



前言

通过键值对的方式把数据写入document对象中,下载为pdf
其中本案例是无模板导出PDF,需要设置pdf的格式

一、aaaController

   /**
     * 法律法规下载
     */
    @PostMapping("/downloadLaws")
    public void downloadLaws( HttpServletResponse response){
        Map<String, Object> map = new HashMap<>();
        map.put("organ", "中国制定机关");
        map.put("word", "中国的发文字号");
        map.put("publicTime", "中国的公布日期");
        map.put("startTime", "中国的实施日期");
        map.put("ageing", "永久有效");
        map.put("rank", "中国的效力位阶");

        List<String> catalogList = new ArrayList<>();
        catalogList.add("第一章 多品牌官微下架蔡徐坤相关内容");
        catalogList.add("第二章 狗仔说不排除爆料有假");
        catalogList.add("第三章 雀巢中国等多个品牌微博已清空蔡徐坤相关内容");
        catalogList.add("第四章 媒体评蔡徐坤事件:仍有许多疑点");
        catalogList.add("第五章 蔡徐坤工作室称已起诉造谣者");


        List<String> lawsDetails = new ArrayList<>();
        lawsDetails.add("这套中文题目包括单选和完形填空。看后,不少网友表示这题目难度不大,但总感觉哪里有点儿怪;也有网友称,原来做完型看的懂是这种感觉。");
        lawsDetails.add("采访中,王阿姨的手里紧紧攥着一张照片,照片拍摄于1983年3月,王阿姨穿着唐装,抱着10个月大的女儿,笑得十分开心。这张照片,是她这辈子跟女儿的唯一一张合照:“女儿1982年出生的,当时爸爸在服刑,我把孩子抱去他服刑的地方,看了一次就永远分别了。 ”");
        lawsDetails.add("第一条");
        lawsDetails.add("第一条");
        lawsDetails.add("第一条");

        docUtil.generatePDFDoc("aaaa", response, map, catalogList, lawsDetails);

    }

二、docUtil

public class docUtil {


    /**
     *
     * @param value 文本
     * @param font 字体
     * @param horizontalAlignment 水平样式 0-left, 1-center, 2-right
     * @param verticalAlignment 垂直样式  4-top, 5-middle, 6-bottom;
     * @param colspan 列合并
     * @param rowspan 行合并
     * @param borderSide 外边框
     *  0-默认
     *  1-隐藏上边框
     *  2-隐藏下边框
     *  3-隐藏上、下边框
     *  4-隐藏左边框
     *  5-隐藏左、上边框
     *  6-隐藏左、下边框
     *  7-隐藏左、上、下边框
     *  8-隐藏右边框
     *  9-隐藏右、上边框
     *  10-隐藏右、下边框
     *  11-隐藏右、上、下边框
     *  12-隐藏左、右边框
     *  13-隐藏上、左、右边框
     *  14-隐藏下、左、右边框
     *  15-隐藏全部
     * @return
     */
    public static PdfPCell createCell(String value, Font font, int horizontalAlignment, int verticalAlignment, int colspan, int rowspan, int borderSide) {
        PdfPCell cell = new PdfPCell();
        cell.setPhrase(new Phrase(value, font));
        //水平居中
        cell.setHorizontalAlignment(horizontalAlignment);
        if(verticalAlignment>0){
            //垂直居中
            cell.setUseAscender(true);
        }
        //垂直居中
        cell.setVerticalAlignment(verticalAlignment);
        if(colspan>0 ){
            cell.setColspan(colspan);
        }
        if(rowspan>0){
            cell.setRowspan(rowspan);
        }
        if(borderSide>0){
            cell.disableBorderSide(borderSide);
        }
        return cell;
    }



    /**
     * 添加段落 自动换行
     */
    public static void addTextParagraph(Document document, String text,Font font) throws DocumentException {
        Paragraph paragraph = new Paragraph(text,font);
        paragraph.setAlignment(0); //设置文字居中 0靠左   1,居中     2,靠右
        paragraph.setIndentationLeft(12); //设置左缩进
        paragraph.setIndentationRight(12); //设置右缩进
        paragraph.setFirstLineIndent(32); //设置首行缩进
        paragraph.setLeading(30f); //行间距
        document.add(paragraph);
    }

    public static void addNoBorderCell(PdfPTable table,String text,Font font) {
        PdfPCell cell = new PdfPCell(new Paragraph(text,font));
        cell.setBorderWidth(0);
        cell.setLeading(24,0); //行间距
        table.addCell(cell);
    }

    public static PdfPTable createTable() throws DocumentException {
        PdfPTable table = new PdfPTable(2);
        // 设置总宽度
        table.setTotalWidth(490);
        table.setLockedWidth(true);
        // 设置每一列宽度
        table.setTotalWidth(new float[] {240,240});
        table.setLockedWidth(true);
        return table;
    }



    /**
     * 无模板导出PDF
     * @param fileName 导出文件名
     * @param response  返回响应
     * @param data 要打包的数据
     */
    public static void generatePDFDoc(String fileName, HttpServletResponse response, Map<String, Object> data, List<String> catalogList,List<String> lawsDetails){
        try{
            fileName = URLEncoder.encode(fileName, "UTF-8");
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }
        // 设置响应头
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition","attachment;fileName=" + fileName + ".pdf");
        OutputStream out = null;
        Document doc = new Document(PageSize.A4);
        try {
            out = response.getOutputStream();
            PdfWriter writer = PdfWriter.getInstance(doc, out);
            doc.open();
            doc = makeSinglePDF(doc,data,catalogList,lawsDetails);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 关闭文档
            if(doc!=null){
                doc.close();
            }
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }


    /**
     * 生成单个PDF文档
     * @param data 数据键值对,根据实际情况修改键名称
     * @return
     */
    private static Document makeSinglePDF(Document doc,Map<String, Object> data,List<String> catalogList,List<String> lawsDetails){
        try {
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Font font = new Font(bf, 12, Font.NORMAL, BaseColor.BLACK);
            Font fontTile = new Font(bf, 14, Font.BOLD, BaseColor.BLACK);
            Font fontTwoTile = new Font(bf, 12, Font.BOLD, BaseColor.BLACK);

            /**
             * 标题
             */
            Paragraph paragraph1 = new Paragraph((String) data.get("name"), fontTile);
            paragraph1.setAlignment(PdfPCell.ALIGN_CENTER);
            //设置行间距
            paragraph1.setLeading(15f);
            //设置段落下空白
            paragraph1.setSpacingAfter(20f);


            PdfPTable table =createTable();
            addNoBorderCell(table, StringUtils.join("制定机关:",data.getOrDefault("organ"," ")),font);
            addNoBorderCell(table, StringUtils.join("",""),font);
            addNoBorderCell(table, StringUtils.join("发文字号:",data.getOrDefault("word"," ")),font);
            addNoBorderCell(table, StringUtils.join("",""),font);

            addNoBorderCell(table, StringUtils.join("公布日期:",data.getOrDefault("publicTime"," ")),font);
            addNoBorderCell(table, StringUtils.join("施行日期:",data.getOrDefault("startTime"," ")),font);
            addNoBorderCell(table, StringUtils.join("时效性:",data.getOrDefault("ageing"," ")),font);
            addNoBorderCell(table, StringUtils.join("效力位阶:",data.getOrDefault("rank"," ")),font);
            addNoBorderCell(table, StringUtils.join("",""),font);



            /**
             * 名称
             */
            Paragraph paragraph2 = new Paragraph((String) data.get("name"), font);
            paragraph2.setAlignment(PdfPCell.ALIGN_CENTER);
            //设置行间距
            paragraph2.setLeading(50f);




            /**
             * 解释
             */
            Paragraph paragraph3 = new Paragraph((String) data.get("reason"), font);
            paragraph3.setAlignment(PdfPCell.ALIGN_CENTER);
            //设置行间距
            paragraph3.setLeading(30f);

            doc.add(paragraph1);
            doc.add(table);
            doc.add(paragraph2);
            doc.add(paragraph3);

            /**
             * 目录
             */
            if (ObjectUtil.isNotEmpty(catalogList)){
                Paragraph paragraph4 = new Paragraph("目录", font);
                paragraph4.setAlignment(PdfPCell.ALIGN_CENTER);
                //设置行间距
                paragraph4.setLeading(30f);
                doc.add(paragraph4);
            }

            /**
             * 目录内容
             */
            PdfPTable tbText2 = new PdfPTable(new float[] { 30f});
            Map<Integer, String> map = new HashMap<>();
            Integer i=0;
            Integer j=0;
            for (String catalog : catalogList) {

                map.put(i,catalog);
                tbText2.addCell(createCell(catalog == null ? " " :catalog, font,
                        PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_LEFT, 0,0,15));

                i++;
            }
            doc.add(tbText2);

            /**
             * 法律法规内容
             */

            for (String lawsDetail : lawsDetails) {
                Paragraph paragraph5 = new Paragraph(map.get(j), fontTwoTile);
                j++;
                paragraph5.setAlignment(PdfPCell.ALIGN_CENTER);
                doc.add(paragraph5);
                addTextParagraph(doc,lawsDetail,font);
            }

        }catch (Exception e){
            e.printStackTrace();
        }
        return doc;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

把浏览器中的页面数据下载为pdf 的相关文章

随机推荐

  • 高通平台(8917/8937/8953...) secure boot 软件配置

    以下以8917平台为例 其他平台类似 找到对应配置文件即可 1 新建临时目录 mkdir tmp cd tmp 2 复制openssl文件到临时目录 cp LA UM LINUX android vendor qcom proprietar
  • Pytorch(GPU)详细安装教程

    如果你也是为了安装Pytorch的话 然后在安装CUDA时出现上述错误时 那么就有必要往下看了 我电脑小白 自己摸索安装 一点一点搜索 然后在我不断努力下终于安装成功 最近也是在学习深度学习 把自己安装软件过程中遇到的问题很大家分享一下 在
  • Apollo CyberRT编译问题‘Socket closed‘

    Apollo 编译问题 Socket closed apollo CyberRT编译错误 错误原因 解决方法 apollo CyberRT编译错误 Server terminated abruptly error code 14 error
  • Oracle函数 获得一个UUID

    通过Oracle函数返回一个UUID create or replace function F GET UUID p length in INT return varchar2 is Result varchar2 200 说明 返回一个指
  • GitHub入门教程

    一 注册GitHub账号 GitHub官网https github com 注册之后 登录注册的邮箱验证后注册完成 二 下载Git 有Mac Windows Linux版本的 下载地址 https git scm com downloads
  • js 提示crypto is not defined

    在使用python 调用js的时候 Crypto enc UTF8 parse 引用这个函数的时候提示这个模块没有 没定义 随即 npm install crypto 但是又报错 cryptois not found 换了一些源也没用 最后
  • r语言聚类分析_R语言ggtree画圆形的树状图展示聚类分析的结果

    今天的主要内容是实现下面这幅图 做完聚类分析通常可以选择 树形图来展示聚类分析的结果 之前公众号也分享过一篇文章 如果样本数不是很多 可以选择矩形的树状图 但是样本数如果比较多 比如今天一位公众号的读者留言说他有160多个样本 这样 矩形的
  • 微信小程序------联动选择器

    2019独角兽企业重金招聘Python工程师标准 gt gt gt picker 从底部弹起的滚动选择器 现支持五种选择器 通过mode来区分 分别是普通选择器 多列选择器 时间选择器 日期选择器 省市区选择器 默认是普通选择器 先来看看效
  • VM12+CentOS6.5+hadoop2.7.3 搭建hadoop完全分布式集群

    参考 http blog csdn net gamer gyt article details 51991893 一 安装VM 12 x 下载地址 链接 http pan baidu com s 1c2KA3gW密码 3r67 二 安装Ce
  • 移动端 - 搜索组件(suggest篇)

    这一篇博客是和 search input篇 衔接的 需要的可以看上文 移动端 搜索组件 search list篇 这里我们需要去封装这么一个组件 先说一下大致的方向 1 根据父组件传入的关键字数据发送请求获取后端数据 进行模板渲染 2 处理
  • Kettle中调用用户自定义的jar包

    在使用kettle过程中 有些功能是kettle不提供的 这样就需要想办法 不过kettle中的java代码可以解决大部分问题 下边就展示使用java代码组件调用自己编写的jar包的过程 1 创建java jar包 package test
  • GL分数阶微积分

    目录 预备公式 将积分和导数统一 p lt 0表示积分 p gt 0表示导数 整数阶和分数阶混合运算 分数阶和分数阶混合运算 预备公式 z
  • javascript的window.location方法

    Response Write 或 Response Write 退后操作 Response Write
  • 备案域名绑定服务器后 提示需要备案_小程序开发需要多少钱?

    现在越来越多的企业想通过微信小程序来宣传产品 为什么小程序那么火爆呢 奥晶科技为您解答 其优点不言而喻 1 小程序建设的成本比APP建设成本低 2 小程序能紧跟市场发展潮流 随时更新功能 3 小程序用户广泛 依托微信的亿万用户 接入方便 用
  • Linux下gdb调试工具的使用

    gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具 gdb主要完成四个方面的功能 1 启动你的程序 可以按照你的自定义的要求随心所欲的运行程序 2 可让被调试的程序在你所指定的调试的断点处停住 断点可以是条件表达式 3 当程序
  • 在ubantu下cmake与make命令的简单使用

    ubantu下简单的使用cmake与make的使用 Step 1 新建一个可执行程序 首先确保你已经安装了cmake 和 g 如果没有安装 就 sudo apt get install cmake g 然后准备一个工作空间 并准备一些素材
  • 当大模型不是问题时,如何应对 LLM 的工程化落地挑战?

    几个月前 在 Thoughtworks 的内部 AIGC 研讨会里 我们一直达成了一系列一致观点 诸如于 如果没有 开源模型 降低企业应用 LLM 的成本 那么 LLM 会很快消亡 所以 我们相信开源 LLM LoRA 微调会成为企业的一种
  • Java AES加密解密报错 “java.security.InvalidKeyException: Illegal key size”

    项目中正常都会用到AES加密解密的问题 因为有的时候来不及设置公钥私钥 搞不对称加密 这种对称加密相对来说是比较方便的一个加密方式 与Base64比 AES相对来说破解难度要更高一些 同样你也可以往里面加盐 参与加密加强密码安全程度 但是问
  • java里的ClassNotFoundException

    1 Caused by java lang ClassNotFoundException org springframework security oauth2 common util RandomValueStringGenerator
  • 把浏览器中的页面数据下载为pdf

    把浏览器中的页面数据下载为pdf 页面样子 https img blog csdnimg cn 7c0f58887b6c40fe8a7112800e9a8c93 png 下载后效果 只是内容不一致而已 样式差不多 文章目录 把浏览器中的页面