타사 라이브러리를 사용하여 VueJS로 요소 인쇄


14

HTML 테이블 작업을 html-to-paper하고 vue.js에서 프린터로 테이블을 인쇄하고 있습니다. 추가 행을 추가하고 새 행을 만든 다음 인쇄를 클릭하면 테이블을 인쇄하려고하지만 테이블을 인쇄하지 않습니다. 빈 셀만 표시하는 모든 데이터

코드 App.vue

    <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은 괜찮지 만 브라우저 문제를 일으키는 크롬 및 파이어 폭스는 보안 문제로 인해 차단합니다.

예를 들어 코드 샌드 박스 를 확인 하십시오. 여기에는 전체 코드가 있습니다. 스타일을 지정하려고하지만 일어나지 않습니다.

  • html-to-print나는 그것이 새로운 페이지에 스타일을 복용하지 않는 인쇄를 클릭하고 때 플러그인 사용은 그래서는 window.open.
  • 그것이 미디어 스타일을 취하지 않는 이유에 갇혀있는 곳입니다. 창에서 내 스타일을 재정의하는 방법은 무엇입니까?

print-nb를 사용 하고 있었지만 보안상의 이유로 브라우저에서 작동하지 않습니다.이것은 print-nb를 사용하는 동안 말하는 것입니다.


manish thakur 새로운 답변을 확인하시기 바랍니다 (유예 유예 기간은 4 시간 후에 종료되며, 수여되지 않을 경우 낭비됩니다)
— ux.engineer

답변:


9

불행하게도이 바인딩 뷰의 데이터를 활용 할 수 mycurelabs / VUE - HTML - 투 - 종이 믹스 인 패키지 , 패키지 작성자가 여기에 명시된 바와 같이 .

그러나 여기에 사용 된 패키지를 Power-kxLee / vue-print-nb 지시문 으로 전환하여 해결 방법을 만들었습니다 .

실제 예는 다음과 같습니다. https://codesandbox.io/s/zen-sunset-2szqr

추신. 비슷한 패키지 중에서 선택하는 것은 때때로 까다로울 수 있습니다. 첫 페이지에서 사용한,보기 및 시작과 같은 리포지토리의 사용 및 활동 통계를 평가 한 다음 열기 / 닫힌 문제 및 활성 / 닫힌 풀 요청을 확인한 다음 통계로 이동하여 펄스 (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 '12

@ ux.engineer 아이디어가 매우 간단하고 깨끗하다는 것을 알았으므로 테이블을 인쇄 할 때 inputs내부가 좋지 않은 전체 페이지를 인쇄하는 경우 여기에 의심 (문제)이 있습니다. 입력을 제거하고 싶습니다. 일반 필드와 마찬가지로 높이를 관리 할 수 USB Printer있습니까? 사용하고 있기 때문에 a4 시트가 없습니다.
— manish thakur

@manishthakur 당신은 미디어 인쇄를 대상으로 쿼리 글로벌 CSS 스타일을 사용할 수 있습니다, 여기에 동작하는 예제입니다 : codesandbox.io/s/ecstatic-fire-zo2b2
— ux.engineer

좋아,이 작업으로 CSS를 정의 할 수 있습니다. 문제는 여기에 4 개의 행이 있다고 가정하지만 프린터는 전체 길이의 프린터를 인쇄하고 있습니다. 사용자는 청구서를 인쇄하는 USB 프린터를 사용하고 있습니다.
— manish thakur

@manishthakur 방법은 다음과 같습니다 .codesandbox.io / s / charming - sound - 7h1bg- 여기 설명 된@page CSS 규칙 사용 ( developer.mozilla.org/en-US/docs/Web/CSS/@page ) stackoverflow.com/questions / 44064707 /…
— ux.engineer

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 믹스 인을 사용하려는 경우 필요합니다. 그러나이 시점에서 대체 패키지를 찾습니다.
— ux.engineer

@arkuuu 자유로울 때마다 편집 부분을 확인하십시오.
— manish thakur

@manishthakur 나는 그것을 읽었지만 전혀 모른다. 인쇄 CSS 규칙을 별도의 CSS 파일에 넣고 styles다른 스타일 시트와 마찬가지로 vue-html-to-paper 옵션을 사용할 수 있습니다.
— arkuuu

1
여전히 스타일을 복용하지 않는, 그 시도했지만 아무것도 변경되지 않습니다
— 마니을 딴

0

질문에 대한 새로운 현상금에 따라를 사용 하기 위해 외부 스타일 시트를 인쇄 창에로드vue-html-to-paper 하는 업데이트 된 코드 예제가 있습니다 .

먼저 외부 CDN에서 Bootstrap 스타일을로드 한 다음 공용 디렉토리에서 로컬 CSS 파일을로드합니다. 이 로컬 스타일 시트에는 !important입력 배경색 대체를 녹색으로 대체하기 위한 스타일이 하나만 있습니다.

인쇄 옵션 배경 그래픽 이 적용된 경우 Windows의 Chrome은 녹색 배경 스타일을 입력 에 적용합니다. Windows의 Firefox에는 다른 인쇄 옵션 패널이 있으며 이러한 설정은 없습니다.

그러나 둘 다 부트 스트랩 스타일을 적어도 부분적으로 적용하므로 스타일 시트가로드되어 재생 중입니다.

이 입력 배경 스타일 문제는 브라우저가 인쇄 스타일을 처리하는 방법의 차이점을 보여주기위한 것이며이 질문의 범위를 벗어난 광범위한 주제입니다.

추신. vue-print-nb패키지에 어떤 종류의 보안 문제가 있는지 확실하지 않지만 해결 될 수 있습니다. 최소한의 버그 재현 예제로 Github 저장소에서 문제를 열어야합니다.

해당 vue-print-nb솔루션의 문제가 나중에 해결되고 내 답변이 업데이트 되는 경우이 답변을 별도의 항목으로 추가하십시오 .


이봐, 내가 제거하려고 할 때 스타일을 완벽하게 취하고 input fields 있지는 않지만 모든 스타일을 취하고 있는지 확인하고 있습니다.
— manish thakur

어떤 스타일을 적용하려고하는지 확실하지 않습니다 ... 앞서 말한 것처럼 스타일은 브라우저에서와 같은 방식으로 인쇄되지 않으며 제한이 있습니다. 심지어 브라우저 / 플랫폼에 따라 다릅니다. 그러나 부트 스트랩 스타일 시트 가 적용 되지 않습니까? 그리고 재정의, 스타일이로드됩니까?
— ux.engineer

아니오 입력 필드를 제거하고 있지만 입력 필드를 제거하고 인쇄에 제공하려는 일부 스타일 (예 : 글꼴 크기 및 정렬)을 기본 테이블로 표시하려고하므로 제거하지 않습니다. 칼럼도 있지만 인쇄에 그들 모두 복용
— 타쿠 마니

Hey 문제가 무엇인지 짐작할 수 있습니까? print-nb그러나 브라우저가 CSS를 허용하지 않는 이유를 모르겠습니다
— manish thakur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.