使用第三方库通过VueJS打印元素


14

我正在处理HTML表并html-to-paper在vue.js中使用该表将其打印到打印机,我正在做的工作是单击添加以创建新行,然后单击打印,我试图打印该表,但它没有任何仅显示空白单元格的数据

代码应用程序

    <template>
  <div id="app">
    <button type="button" @click="btnOnClick">Add</button>

    <div id="printMe">
      <table class="table table-striped table-hover table-bordered mainTable" id="Table">
    <thead>
      <tr>

        <th class="itemName">Item Name</th>
        <th>Quantity</th>
        <th>Selling Price</th>
        <th>Amount</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(tableData, k) in tableDatas" :key="k">

        <td>
          <input class="form-control" readonly v-model="tableData.itemname" />
        </td>
        <td>
          <input class="form-control text-right" type="text" min="0" step=".01" v-model="tableData.quantity" v-on:keyup="calculateQty(tableData)" />
        </td>
        <td>
          <input class="form-control text-right" type="text" min="0" step=".01" v-model="tableData.sellingprice" v-on:keyup="calculateSPrice(tableData)" />
        </td>
        <td>
          <input readonly class="form-control text-right" type="text" min="0" step=".01" v-model="tableData.amount" />
        </td>
      </tr>
    </tbody>
  </table>
    </div>
    <button @click="print">Print</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableDatas: []
    }

  },
  methods: {
    btnOnClick(v) {
      this.tableDatas.push({
        itemname: "item",
        quantity: 1,
        sellingprice: 55,
        amount: 55
      });
    },
     print() {
      this.$htmlToPaper('printMe');
    }
  }
};
</script>

<style>
</style>

main.js

 import Vue from "vue";
import App from "./App.vue";
import VueHtmlToPaper from "vue-html-to-paper";

Vue.config.productionTip = false;
Vue.use(VueHtmlToPaper);

new Vue({
  render: h => h(App)
}).$mount("#app");

这是codesandbox中的工作代码

请检查运行代码

根据赏金编辑

我必须用'html-to-paper'做到这一点,但问题是我无法为要打印的元素提供样式 @media print

  • 答案ux.engineer很好,但由于安全问题而导致浏览器问题crome和firefox将其阻止

请检查代码沙箱,例如,这是我的完整代码,我试图提供样式但没有发生

  • html-to-print插件使用window.open,因此当我单击打印时,它不会将样式带到新页面。
  • 这就是为什么我不采用媒体样式的原因,如何在window.open上覆盖我的样式

我正在使用print-nb,但是由于某种安全原因,它无法在浏览器上运行这就是使用print-nb时所说的


manish thakur,请查看我的新答案(赏金宽限期将在4个小时内结束,如果没有授予,它将浪费

Answers:


9

不幸的是,您不能通过此mycurelabs / vue-html-to-paper mixin软件包利用Vue的数据绑定,如软件包作者在此处所述

但是,通过将此处使用的包切换到Power-kxLee / vue-print-nb指令,我创建了一种解决方法。

这是一个工作示例:https : //codesandbox.io/s/zen-sunset-2szqr

PS。有时,在相似的软件包之间进行选择可能很棘手。应该评估存储库的使用情况和活动​​状态,例如:首页使用,监视和开始,然后检查“打开/关闭”问题和“活动/关闭”拉取请求,然后转到“见解”以检查Pulse(1个月),然后代码频率。

在这两者之间,我会选择vue-print-nb,因为它更受欢迎且被积极使用。同样因为我更喜欢使用指令而不是mixin

就其他答案而言,为此目的继续使用vue-html-to-paper将需要这种骇人听闻的解决方案...该指令可直接使用。

https://github.com/mycurelabs/vue-html-to-paper

https://github.com/Power-kxLee/vue-print-nb


1
我不知道这种打印包装的比较方式,但是如果可以更换包装,我认为这比使用占位符的解决方法更好。
arkuuu

@ ux.engineer,因为我发现您的想法非常简单和干净,在打印表格时,我怀疑(问题)在这里,它正在打印整页,inputs里面不好,我想删除输入内容像普通字段一样,我也可以管理高度,因为我使用的USB Printer是没有a4的纸张。
manish thakur

@manishthakur,您可以将全局CSS样式与针对打印的媒体查询一起使用,这是一个工作示例:codesandbox.io/s/ecstatic-fire-zo2b2
ux.engineer

好的,这是可以工作的,因此我可以定义CS,这里的问题是假设那里有四行,但是打印机正在打印全长打印机,我正在使用USB打印机来打印账单,请向我清除此内容
manish thakur


6

正如其他人提到的那样,这对于您使用的包是不可能的,因为v-model在打印时不存在来自的绑定数据。因此,您需要在html中静态获取此数据。资源

一种解决方法是使用输入占位符:

添加对表的引用

<tbody ref="tablebody">

这使您可以在方法中选择此元素。现在更改打印方法:

print() {
  const inputs = this.$refs.tablebody.getElementsByTagName("input");
  for (let input of inputs) {
    input.placeholder = input.value;
  }
  this.$htmlToPaper("printMe");
  for (let input of inputs) {
    input.placeholder = "";
  }
}

然后也许用css设置占位符的样式,因为默认情况下它看起来是灰色的。

我首先尝试以某种方式重设输入的值,例如input.value = input.value,但不幸的是,此方法不起作用。

在这里更新了代码


1
一个聪明的解决方案,尽管有点笨拙。但是,如果有人想坚持使用这种特定的Vue mixin来打印这样的动态值,则似乎很有必要。但是在这一点上,我会寻找替代软件包。
ux.engineer

@arkuuu请随时检查我的编辑部分。
manish thakur

@manishthakur我读了,但我不知道。也许您可以将打印CSS规则放在单独的CSS文件中,并styles像其他样式表一样使用vue-html-to-paper选项。
arkuuu

1
我已经尝试过了,但是什么都没有改变,仍然没有采用样式
Manish thakur

0

根据您对这个问题的新悬赏,为坚持使用vue-html-to-paper,这是一个更新的代码示例,用于将外部样式表加载到打印窗口

它首先从外部CDN加载Bootstrap样式,然后从公共目录加载本地CSS文件。此本地样式表只有一种样式,!important用于将输入的背景颜色替换为绿色。

如果应用了打印选项背景图形,则Windows上的Chrome会将绿色背景样式应用于输入。Windows上的Firefox具有不同的打印选项面板,该面板没有这样的设置。

但是,两者都至少部分地应用了Bootstrap样式,因此样式表已加载并正在运行。

此输入背景样式问题旨在证明浏览器在处理打印样式方面的差异,这是此问题范围之外的更广泛的主题。

PS。我不确定vue-print-nb软件包中存在哪种安全问题,但也许可以解决。您应该在他们的Github存储库中以一个最少的错误再现示例打开一个问题。

如果该vue-print-nb解决方案的问题稍后得到解决并且将我的答案更新,则将该答案添加为单独的条目。


嘿,我正在检查它在尝试删除样式时并不能完美地显示样式,input fields 但是正在全部使用中。
manish thakur

尚不清楚您要尝试使用哪些样式...如上所述,由于存在限制,样式无法以与浏览器中相同的方式打印。甚至在浏览器/平台之间也有所不同。但是Bootstrap样式表确实适用,不是吗?和我的替代,这样就加载了样式?
ux.engineer

不,我要删除输入字段,但不能删除,因为我想删除输入字段并将其显示为Basich表,并且要打印一些样式,即字体大小和对齐方式,但它没有显示,我在隐藏专栏上还有所有印刷品
收录

嘿,您能猜出问题是什么,print-nb因为这是最好的解决方法,但我不知道为什么浏览器不允许使用CSS
manish thakur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.