213 lines
5.3 KiB
Vue
213 lines
5.3 KiB
Vue
|
<template>
|
||
|
<div class="export-word">
|
||
|
<div class="button-word">
|
||
|
<button class="btn" @click="exportFileDocx" v-tooltip="tooltip">
|
||
|
<svg class="icon icon-docx-file">
|
||
|
<use xlink:href="#icon-docx-file"></use>
|
||
|
</svg>
|
||
|
</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import {
|
||
|
Document,
|
||
|
Paragraph,
|
||
|
Packer,
|
||
|
TextRun,
|
||
|
ImageRun,
|
||
|
ExternalHyperlink,
|
||
|
Footer,
|
||
|
} from "docx";
|
||
|
import { saveAs } from "file-saver";
|
||
|
import QRCode from "qrcode";
|
||
|
|
||
|
export default {
|
||
|
props: {
|
||
|
texts: {
|
||
|
type: Array,
|
||
|
required: true,
|
||
|
},
|
||
|
fileName: {
|
||
|
type: String,
|
||
|
default: "sample.docx",
|
||
|
},
|
||
|
font: {
|
||
|
type: String,
|
||
|
default: "Tahoma",
|
||
|
},
|
||
|
fontSize: {
|
||
|
type: Number,
|
||
|
default: 18,
|
||
|
},
|
||
|
tooltip: {
|
||
|
type: String,
|
||
|
default: "دانلود فایل ورد",
|
||
|
},
|
||
|
wordTitle: {
|
||
|
type: String,
|
||
|
default: "سامانه قانون یار",
|
||
|
},
|
||
|
wordTitleLink: {
|
||
|
type: String,
|
||
|
default: location.origin,
|
||
|
},
|
||
|
QRCodeLink: {
|
||
|
type: String,
|
||
|
default: location.origin,
|
||
|
},
|
||
|
qrCodeWidth: {
|
||
|
type: Number,
|
||
|
default: 100,
|
||
|
},
|
||
|
qrCodeHeight: {
|
||
|
type: Number,
|
||
|
default: 100,
|
||
|
},
|
||
|
wordSubTitle: {
|
||
|
type: String,
|
||
|
default: "",
|
||
|
},
|
||
|
},
|
||
|
methods: {
|
||
|
async exportFileDocx() {
|
||
|
const qrCodeDataUrl = await QRCode.toDataURL(this.QRCodeLink);
|
||
|
const doc = new Document({
|
||
|
sections: [
|
||
|
{
|
||
|
// footers: {
|
||
|
// default: new Footer({
|
||
|
// children: [
|
||
|
// new Paragraph({
|
||
|
// alignment: AlignmentType.CENTER,
|
||
|
// spacing: {
|
||
|
// after: 200,
|
||
|
// },
|
||
|
// children: [
|
||
|
// new TextRun({
|
||
|
// text: "قانون یار",
|
||
|
// color: "CCCCCC",
|
||
|
// bold: true,
|
||
|
// size: 100,
|
||
|
// allCaps: true,
|
||
|
// font: this.font,
|
||
|
// }),
|
||
|
// ],
|
||
|
// }),
|
||
|
// ],
|
||
|
// }),
|
||
|
// },
|
||
|
children: [
|
||
|
new Paragraph({
|
||
|
alignment: "center",
|
||
|
spacing: {
|
||
|
after: 200,
|
||
|
},
|
||
|
children: [
|
||
|
new ExternalHyperlink({
|
||
|
children: [
|
||
|
new TextRun({
|
||
|
text: this.wordTitle,
|
||
|
font: this.font,
|
||
|
size: 28,
|
||
|
color: "#008000",
|
||
|
bold: true,
|
||
|
}),
|
||
|
],
|
||
|
link: this.wordTitleLink,
|
||
|
}),
|
||
|
],
|
||
|
}),
|
||
|
|
||
|
new Paragraph({
|
||
|
alignment: "left",
|
||
|
children: [
|
||
|
new ImageRun({
|
||
|
data: qrCodeDataUrl,
|
||
|
transformation: {
|
||
|
width: this.qrCodeWidth,
|
||
|
height: this.qrCodeHeight,
|
||
|
},
|
||
|
}),
|
||
|
],
|
||
|
}),
|
||
|
|
||
|
new Paragraph({
|
||
|
alignment: "right",
|
||
|
spacing: {
|
||
|
before: 100,
|
||
|
after: 300,
|
||
|
},
|
||
|
children: [
|
||
|
new TextRun({
|
||
|
text: this.wordSubTitle,
|
||
|
font: this.font,
|
||
|
size: 24,
|
||
|
bold: true,
|
||
|
color: "#000000",
|
||
|
}),
|
||
|
],
|
||
|
}),
|
||
|
new Paragraph({
|
||
|
alignment: "right",
|
||
|
children: [
|
||
|
new ExternalHyperlink({
|
||
|
children: [
|
||
|
new TextRun({
|
||
|
text: this.QRCodeLink,
|
||
|
font: this.font,
|
||
|
size: 20,
|
||
|
color: "#0000FF",
|
||
|
underline: true,
|
||
|
}),
|
||
|
],
|
||
|
link: this.QRCodeLink,
|
||
|
}),
|
||
|
],
|
||
|
}),
|
||
|
new Paragraph({
|
||
|
border: {
|
||
|
bottom: {
|
||
|
style: "single",
|
||
|
size: 4,
|
||
|
color: "000000",
|
||
|
},
|
||
|
},
|
||
|
spacing: {
|
||
|
before: 200,
|
||
|
after: 200,
|
||
|
},
|
||
|
}),
|
||
|
|
||
|
...this.texts.map((text) => {
|
||
|
return new Paragraph({
|
||
|
alignment: "right",
|
||
|
spacing: {
|
||
|
after: 200,
|
||
|
line: 480,
|
||
|
},
|
||
|
children: [
|
||
|
new TextRun({
|
||
|
text: text,
|
||
|
font: this.font,
|
||
|
size: this.fontSize,
|
||
|
}),
|
||
|
],
|
||
|
});
|
||
|
}),
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
});
|
||
|
|
||
|
Packer.toBlob(doc).then((blob) => {
|
||
|
saveAs(blob, this.fileName);
|
||
|
});
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss" scoped></style>
|