타사 라이브러리를 사용하여 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.