当前位置: 首页 > 知识库问答 >
问题:

前端 - downPdf是导出图片的方法,俩个页面这个页面导不出,搞不懂为啥?

乐正远航
2023-04-27
<template>
  <div class="fillcontain">
    <div >
      <el-form :inline="true" ref="add_data" :model="search_data">
        <el-button @click="downPdf">点击</el-button>
        <el-form-item label="地址:">
          <el-input
            v-model="search_data.address"
            placeholder="请输入"
          ></el-input>
        </el-form-item>
        <el-form-item label="状态:">
          <el-select v-model="search_data.status">
            <el-option
              v-for="(formteam, index) in format_status_list"
              :key="index"
              :label="formteam"
              :value="formteam"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="租户:">
          <el-input
            v-model="search_data.userlist_name"
            placeholder="请输入"
          ></el-input>
        </el-form-item>
        <el-form-item class="btnSearch">
          <el-button
            type="primary "
            size="small"
            icon="el-icon-search"
            @click="handleSearch()"
            >筛选</el-button
          >
          <el-button
            type="primary "
            size="small"
            icon="el-icon-search"
            @click="reset()"
            >重置</el-button
          >
        </el-form-item>
      </el-form>
    </div>
    <div class="table_container">
      <el-table
        :data="tableData"
        style="width: 100%"
        max-height="450"
        border
        :row-class-name="tableRowClassName"
      >
        <el-table-column type="index" label="序号" align="center">
        </el-table-column>
        <el-table-column prop="address" label="地址" align="center">
        </el-table-column>
        <el-table-column prop="price" label="价格" align="center">
        </el-table-column>
        <el-table-column prop="status" label="状态" align="center">
        </el-table-column>
        <el-table-column prop="userlist_name" label="租户" align="center">
        </el-table-column>
        <el-table-column label="操作" prop="operation" align="center">
          <template slot-scope="scope">
            <el-button
              size="small"
              type="primary"
              v-if="scope.row.status == '已出租' ? false : true"
              @click="confirm(scope.row)"
              >确认租赁</el-button
            >
            <el-button
              size="small"
              type="primary"
              @click="handleView(scope.$index, scope.row)"
              >查看详情</el-button
            >
          </template>
        </el-table-column>
      </el-table>
    </div>
    <HouseViewDialog
      :dialog3="dialog3"
      @update="getProfile"
      :formData="Data"
    ></HouseViewDialog>
    <el-dialog title="提示" :visible.sync="dialogVisible" width="90%">
      <div class="contract" id="article-content">
    <el-button @click="downPdf"></el-button>
        <h1>合同</h1>
        <h3 style="font-weight:600,line-height:40px">订立合同双方</h3>
        <p>出租方:{{ form.username }},以下简称甲方</p>
        <p>承租方:{{ name }},以下简称乙方</p>
        <p>
          根据《中华人民共和国》及有关规定,为明确甲、乙双方的权利义务关系,经双方协商一致,签订本合同。
        </p>
        <p>第一条 甲方将自有的坐落在{{ address }}出租给乙方使用。</p>
        <p>第二条 乙方有下列情形之一的,甲方可以终止合同,收回房屋:</p
        <div class="datastyle">
          <span>出租方:{{ form.username }}</span
          ><span>日期:{{ date }}</span>
        </div>
        <P>承租方:</P>
        <vue-esign
          ref="esign"
          :width="300"
          :height="100"
          :isCrop="isCrop"
          style="border: 1px dashed"
          :lineWidth="lineWidth"
          :lineColor="lineColor"
          :bgColor.sync="bgColor"
        />
        <p>请在此签名</p>
      </div>
      <button @click="handleReset">清空画板</button>
      <span slot="footer" class="dialog-footer">
        <el-button @click="canceldia()">取 消</el-button>
        <el-button type="primary" @click="exportContract"
          >导出合同</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>

<script>
import { gethouse, getOwnerName } from "../api/house.js";
import HouseViewDialog from "../components/HouseViewDialog";
import html2canvas from "html2canvas";
import jsPDF from "jspdf";
export default {
  name: "personalhouseList",
  components: {
    HouseViewDialog,
  },
  data() {
    return {
      lineWidth: 6,
      lineColor: "#000000",
      bgColor: "",
      resultImg: "",
      isCrop: false,
      //筛选条件数据
      search_data: {
        address: "",
        status: "",
        userlist_name: "",
      },
      Data: {
        dialogVisible: false,
        detail: "",
      },
      dialogVisible: false,
      dialog3: {
        show: false,
        title: "",
      },
      tableData: [],
      allTableData: [],
      format_status_list: ["未出租", "已出租"],
      form: { username: "" },
      houseName: "",
      username: "",
      price: "",
      canvas: "",
      ctx: null,
      name: "",
      address: "",
      date: "",
    };
  },
  created() {
    //this.initPage()
    this.handleSearch();
  },
  methods: {
    handleReset() {
      this.$refs.esign.reset();
    },
    handleGenerate() {
      this.$refs.esign
        .generate()
        .then((res) => {
            this.downPdf()
        })
        .catch((err) => {
          this.$message.warning("请先签字后导出合同"); // 画布没有签字时会执行这里 'Not Signned'
        });
    },
    tableRowClassName({ row, rowIndex }) {
      if (row["status"] == "未出租") {
        return "warning-row";
      }
    },

    exportContract(){
        this.handleGenerate()
    },
    downPdf() {
      document.documentElement.scrollTop = 0;
      let canvas = document.createElement("canvas"); // 生成canvas上下文
      let context = canvas.getContext("2d");
      let _articleHtml = document.getElementById("article-content");
      let _w = _articleHtml.clientWidth; //获取需要导出pdf区域的宽度和高度
      let _h = _articleHtml.clientHeight;
      let scale = 3;
      if (_w > _h) {
        _h = _w;
      }
      canvas.width = _w * scale;
      canvas.height = _h * scale;
      context.scale(scale, scale);
      let opts = {
        scale: 1,
        width: _w, //dom 原始宽度
        height: _h,
        canvas: canvas,
        useCORS: true, //允许canvas画布内可以跨域请求外部链接图片, 允许跨域请求。
      };
      // 以上部分都是为了强化清晰度的,放大canvas画布
      html2canvas(_articleHtml, opts).then((canvas) => {
        this.createPdfAll(canvas, scale);
      });
    },
    createPdfAll(canvas, scale) {
      let contentWidth = canvas.width / scale;
      let contentHeight = canvas.height / scale;
      let pdf = new jsPDF("", "pt", [contentWidth, contentHeight]); //自定义宽高
      let pageData = canvas.toDataURL("image/jpeg", 1.0); //转换图片为dataURL
      pdf.addImage(pageData, "JPEG", 0, 0, contentWidth, contentHeight); //添加图像到页面
      pdf.save(`合同.pdf`);
    },
    confirm(data) {
      var date = new Date();
      var year = date.getFullYear();
      var month = date.getMonth() + 1;
      var day = date.getDate();
      this.date = year + "年" + month + "月" + day + "日";
      getOwnerName({ userid: data.ownerid }).then((res) => {
        this.address = data.address;
        this.name = this.$store.getters.user;
        this.form.username = res.data[0].name;
        this.dialogVisible = true;
      });
    },

    handleSearch() {
      console.log(this.search_data);
      gethouse(this.search_data).then((res) => {
        if (res.code == 200) {
          this.tableData = res.data;
          console.log(this.tableData);
        } else {
          this.$message({
            message: "获取房屋信息列表失败",
            type: "warning",
          });
        }
      });
    },
    canceldia() {
      this.dialogVisible = false;
      this.handleReset();
    },
    reset() {
      this.search_data = {
        address: "",
        status: "",
        userlist_name: "",
      };
      this.handleSearch();
    },
    handleView(index, row) {
      this.Data = JSON.parse(JSON.stringify(row));
      this.dialog3 = {
        show: true,
        title: "房屋详情",
      };
    },

    handleCurrentChange(page) {
      // 当前页
      let sortnum = this.paginations.page_size * (page - 1);
      let table = this.allTableData.filter((item, index) => {
        return index >= sortnum;
      });
      // 设置默认分页数据
      this.tableData = table.filter((item, index) => {
        return index < this.paginations.page_size;
      });
    },
    handleSizeChange(page_size) {
      // 切换size
      this.paginations.page_index = 1;
      this.paginations.page_size = page_size;
      this.tableData = this.allTableData.filter((item, index) => {
        return index < page_size;
      });
    },
    setPaginations() {
      // 总页数
      this.paginations.total = this.allTableData.length;
      this.paginations.page_index = 1;
      this.paginations.page_size = 5;
      // 设置默认分页数据
      this.tableData = this.allTableData.filter((item, index) => {
        return index < this.paginations.page_size;
      });
    },
  },
};
</script>

<style scoed>
.fillcontain {
  width: 100%;
  height: 100%;
  padding: 16px;
  box-sizing: border-box;
}
.btnRight {
  float: right;
}
.pagination {
  text-align: right;
  margin-top: 10px;
}
.contract h1 {
  font-size: 30px;
  padding-bottom: 10px;
  text-align: center;
  border-bottom: 1px solid black;
}
.contract p {
  line-height: 30px;
}
.contract h3 {
  font-weight: 600;
}

.warning-row {
  color: green !important;
}
.datastyle {
  display: flex;
  justify-content: flex-start;
}
.datastyle span {
  display: inline-block;
  padding-right: 150px;
}
</style>

共有1个答案

祖新觉
2023-04-27

首先看下控制台有没有报错,如果有报错按照对应的错误排查
如果没有报错按照调用的方法,在方法里面加个debugger调试,看执行的参数获取情况,看哪个参数没有获取到还是空的

 类似资料:
  • 我使用的是PrimeFaces 6.1。我正在尝试使用dataExporter组件导出带有页脚的dataTable。页脚正确导出为CSV和XLS格式,但对于PDF,它只是拒绝包含它。尝试同时使用p:column的footerText和f:facet footer,得到了相同的行为。 我还尝试切换到PrimeFaces扩展导出器,它最终在PDF导出中包含了页脚,但也包含了一些我不知道如何排除的表格列

  • Examples Static export next export可以输出一个 Next.js 应用作为静态资源应用而不依靠 Node.js 服务。 这个输出的应用几乎支持 Next.js 的所有功能,包括动态路由,预获取,预加载以及动态导入。 next export将把所有有可能渲染出的 HTML 都生成。这是基于映射对象的pathname关键字关联到页面对象。这个映射叫做exportPath

  • 本文向大家介绍一个JSP页面导致的tomcat内存溢出的解决方法,包括了一个JSP页面导致的tomcat内存溢出的解决方法的使用技巧和注意事项,需要的朋友参考一下 今天新能测试组的同事找我看一个奇怪的现象。一个tomcat应用,里面只有一个单纯的jsp页面,而且这个jsp页面没有任何java代码(想用这个jsp页面测试在她的服务器上的一个tomcat的最大QPS)。但是用loadrunner压测了

  • 我正在尝试改变我的引导网站中与类“navbar-brand”链接的颜色。无论我如何构造css选择器,我似乎都无法改变文本颜色。但是,我知道css正在加载,因为我可以更改navbar的背景颜色。下面是缩短的代码: 我的index.html: 我的main.css: 最终结果:一个深蓝色条,带有默认navbar附带的灰色文本。谢谢你的帮助。 编辑:这里类似的问题对我没有帮助。我能够改变navbar-n

  • 本文向大家介绍写一个方法将html页面生成为图片相关面试题,主要包含被问及写一个方法将html页面生成为图片时的应答技巧和注意事项,需要的朋友参考一下 打开控制台, 打开控制台,输入 想要哪种截图,任君选择。

  • 问题内容: 我需要将任意PDF文档的页面导出为jpeg / png / etc格式的一系列单个图像。我需要用Java做到这一点。 尽管我确实了解iText,PDFBox和其他各种Java pdf库,但我希望找到一些工作示例或操作方法的指针。 谢谢。 问题答案: 这是一种实现方法,它结合了Web上的一些代码片段。 如何将PDF绘制到图像中? https://pdf- renderer.dev.jav