| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- <template>
- <div class="export-pdf-dialog">
- <div class="thumbnails-view">
- <div class="thumbnails" ref="pdfThumbnailsRef">
- <ThumbnailSlide
- class="thumbnail"
- :slide="currentSlide"
- :size="1600"
- v-if="rangeType === 'current'"
- />
- <template v-else>
- <ThumbnailSlide
- class="thumbnail"
- :class="{ 'break-page': (index + 1) % count === 0 }"
- v-for="(slide, index) in slides"
- :key="slide.id"
- :slide="slide"
- :size="1600"
- />
- </template>
- </div>
- </div>
- <div class="configs" :style="{ width: lang.lang === 'en' ? '475px' : '350px' }">
- <div class="row">
- <div class="title">{{ lang.ssExpRange }}</div>
- <RadioGroup
- class="config-item"
- v-model:value="rangeType"
- >
- <RadioButton style="width: 50%;" value="all">{{ lang.ssShowAll }}</RadioButton>
- <RadioButton style="width: 50%;" value="current">{{ lang.ssCurPage }}</RadioButton>
- </RadioGroup>
- </div>
- <div class="row">
- <div class="title">{{ lang.ssPerPage }}</div>
- <Select
- class="config-item"
- v-model:value="count"
- :options="[
- { label: '1', value: 1 },
- { label: '2', value: 2 },
- { label: '3', value: 3 },
- ]"
- />
- </div>
- <div class="row">
- <div class="title">{{ lang.ssEdgePad }}</div>
- <div class="config-item">
- <Switch v-model:value="padding" />
- </div>
- </div>
- <div class="tip">
- {{ lang.ssPrintBgTip }}
- </div>
- </div>
- <div class="btns">
- <Button class="btn export" type="primary" @click="expPDF()">{{ lang.ssPrintPdf }}</Button>
- <Button class="btn close" @click="emit('close')">{{ lang.ssClose }}</Button>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { ref, useTemplateRef } from 'vue'
- import { storeToRefs } from 'pinia'
- import { useSlidesStore } from '@/store'
- import { print } from '@/utils/print'
- import { lang } from '@/main'
- import ThumbnailSlide from '@/views/components/ThumbnailSlide/index.vue'
- import Switch from '@/components/Switch.vue'
- import Button from '@/components/Button.vue'
- import RadioButton from '@/components/RadioButton.vue'
- import RadioGroup from '@/components/RadioGroup.vue'
- import Select from '@/components/Select.vue'
- const emit = defineEmits<{
- (event: 'close'): void
- }>()
- const { slides, currentSlide, viewportRatio } = storeToRefs(useSlidesStore())
- const pdfThumbnailsRef = useTemplateRef<HTMLElement>('pdfThumbnailsRef')
- const rangeType = ref<'all' | 'current'>('all')
- const count = ref(1)
- const padding = ref(true)
- const expPDF = () => {
- if (!pdfThumbnailsRef.value) return
- const pageSize = {
- width: 1600,
- height: rangeType.value === 'all' ? 1600 * viewportRatio.value * count.value : 1600 * viewportRatio.value,
- margin: padding.value ? 50 : 0,
- }
- print(pdfThumbnailsRef.value, pageSize)
- }
- </script>
- <style lang="scss" scoped>
- .export-pdf-dialog {
- height: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- position: relative;
- overflow: hidden;
- }
- .thumbnails-view {
- @include absolute-0();
- &::after {
- content: '';
- background-color: #fff;
- @include absolute-0();
- }
- }
- .thumbnail {
- &.break-page {
- break-after: page;
- }
- }
- .configs {
- width: 300px;
- height: calc(100% - 80px);
- display: flex;
- flex-direction: column;
- justify-content: center;
- z-index: 1;
- .row {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-bottom: 25px;
- }
- .title {
- width: 100px;
- }
- .config-item {
- flex: 1;
- }
- .tip {
- font-size: 12px;
- color: #aaa;
- line-height: 1.8;
- margin-top: 25px;
- }
- }
- .btns {
- width: 300px;
- height: 80px;
- display: flex;
- justify-content: center;
- align-items: center;
- z-index: 1;
- .export {
- flex: 1;
- }
- .close {
- width: 100px;
- margin-left: 10px;
- }
- }
- </style>
|