base_ui/components/other/ButtonWordExport.vue

213 lines
5.3 KiB
Vue
Raw Permalink Normal View History

2025-02-01 09:34:55 +00:00
<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>