| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091 |
- <template>
- <a-card>
- <div style="display: flex;flex-direction: column">
- <div class="pagetop" v-if="templateName">
- <div class="templateName">{{ templateName }}</div>
- <div class="tip">注意相同模板名称保存时将会覆盖更新</div>
- </div>
- <a-space style="margin-bottom: 10px">
- <a-button-group>
- <template v-for="(value,type) in paperTypes">
- <a-button :type="curPaperType === type ? 'primary' : 'info'" @click="setPaper(type,value)" :key="type">
- {{ type }}
- </a-button>
- </template>
- <a-popover v-model="paperPopVisible" title="设置纸张宽高(mm)" trigger="click">
- <div slot="content">
- <a-input-group compact style="margin: 10px 10px">
- <a-input type="number" v-model="paperWidth" style=" width: 100px; text-align: center"
- placeholder="宽(mm)"/>
- <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff"
- placeholder="~" disabled
- />
- <a-input type="number" v-model="paperHeight" style="width: 100px; text-align: center; border-left: 0"
- placeholder="高(mm)"/>
- </a-input-group>
- <a-button type="primary" style="width: 100%" @click="otherPaper">确定</a-button>
- </div>
- <a-button :type="'other'==curPaperType?'primary':''">自定义纸张</a-button>
- </a-popover>
- </a-button-group>
- <a-button type="text" icon="zoom-out" @click="changeScale(false)"></a-button>
- <a-input-number
- :value="scaleValue"
- :min="scaleMin"
- :max="scaleMax"
- :step="0.1"
- disabled
- style="width: 70px;"
- :formatter="value => `${(value * 100).toFixed(0)}%`"
- :parser="value => value.replace('%', '')"
- />
- <a-button type="text" icon="zoom-in" @click="changeScale(true)"></a-button>
- <a-button type="primary" icon="redo" @click="rotatePaper()">旋转</a-button>
- <a-button type="primary" icon="eye" @click="preView">
- 预览
- </a-button>
- <a-button type="primary" icon="printer" @click="print">
- 直接打印
- </a-button>
- <a-button type="primary" @click="onlyPrint">
- Api单独打印
- </a-button>
- <a-button type="primary" @click="onlyPrint2">
- Api单独直接打印
- </a-button>
- <a-button type="primary" @click="showName=true">
- 保存模版
- </a-button>
- <a-popconfirm
- title="是否确认清空?"
- okType="danger"
- okText="确定清空"
- @confirm="clearPaper"
- >
- <a-icon slot="icon" type="question-circle-o" style="color: red"/>
- <a-button type="danger">
- 清空
- <a-icon type="close"/>
- </a-button>
- </a-popconfirm>
- <json-view :template="template"/>
- </a-space>
- <!-- <a-space style="margin-bottom: 10px">
- <a-button type="primary" @click="exportPdf('')">
- 导出获取pdf(Blob)
- </a-button>
- <a-button type="primary" @click="exportPdf('arraybuffer')">
- 导出获取pdf(ArrayBuffer)
- </a-button>
- <a-button type="primary" @click="exportPdf('dataurl')">
- 导出获取pdf(DataUrl)
- </a-button>
- <a-button type="primary" @click="exportPdf('bloburl')">
- 导出获取pdf(BlobUrl)
- </a-button>
- <a-button type="primary" @click="exportPdf('dataurlstring')">
- 导出获取pdf(DataUrlString)
- </a-button>
- <a-button type="primary" @click="exportPdf('pdfobjectnewwindow')">
- 导出查看pdf(PdfObjectNewWindow)
- </a-button>
- </a-space> -->
- <!-- <a-space style="margin-bottom: 10px">
- <a-button type="primary" @click="ippPrintAttr">
- ipp获取 打印机 参数情况
- </a-button>
- <a-button type="primary" @click="ippPrintTest">
- ipp打印测试
- </a-button>
- <a-button type="primary" @click="ippRequestTest">
- ipp请求 获取 打印机 参数情况
- </a-button>
- <a-button type="primary" @click="ippRequestPrint">
- ipp请求 打印测试
- </a-button>
- </a-space> -->
- <a-space style="margin-bottom: 10px">
- <a-textarea style="width:30vw" v-model="jsonIn" @pressEnter="updateJson"
- placeholder="复制json模板到此后 点击右侧更新"
- allow-clear/>
- <a-button type="primary" @click="updateJson">
- 更新json模板
- </a-button>
- <a-button type="primary" @click="exportJson">
- 导出json模板到 textArea
- </a-button>
- <a-textarea style="width:30vw" v-model="jsonOut" placeholder="点击左侧导出json" allow-clear/>
- </a-space>
- <a-space style="margin-bottom: 10px">
- <a-button type="primary" @click="getSelectEls">
- 获取选中元素
- </a-button>
- <a-button type="primary" @click="updateFontSize">
- 选中元素字体12pt
- </a-button>
- <a-button type="primary" @click="updateFontWeight">
- 选中元素字体Bolder
- </a-button>
- <a-button type="primary" @click="setElsSpace(true)"> 水平间距10
- </a-button>
- <a-button type="primary" @click="setElsSpace(false)"> 垂直间距10
- </a-button>
- <a-radio-group>
- <a-radio-button @click="setElsAlign('left')" title="左对齐">
- <span class="glyphicon glyphicon-object-align-left"></span>
- </a-radio-button>
- <a-radio-button @click="setElsAlign('vertical')" title="居中">
- <span class="glyphicon glyphicon-object-align-vertical"></span>
- </a-radio-button>
- <a-radio-button @click="setElsAlign('right')" title="右对齐">
- <span class="glyphicon glyphicon-object-align-right"></span>
- </a-radio-button>
- <a-radio-button @click="setElsAlign('top')" title="顶部对齐">
- <span class="glyphicon glyphicon-object-align-top"></span>
- </a-radio-button>
- <a-radio-button @click="setElsAlign('horizontal')" title="垂直居中">
- <span class="glyphicon glyphicon-object-align-horizontal"></span>
- </a-radio-button>
- <a-radio-button @click="setElsAlign('bottom')" title="底部对齐">
- <span class="glyphicon glyphicon-object-align-bottom"></span>
- </a-radio-button>
- <a-radio-button @click="setElsAlign('distributeHor')" title="横向分散">
- <span class="glyphicon glyphicon-resize-horizontal"></span>
- </a-radio-button>
- <a-radio-button @click="setElsAlign('distributeVer')" title="纵向分散">
- <span class="glyphicon glyphicon-resize-vertical"></span>
- </a-radio-button>
- </a-radio-group>
- </a-space>
- </div>
- <a-row :gutter="[8,0]">
- <a-col :span="4">
- <a-card style="height: 100vh">
- <a-row>
- <a-col :span="24" class="rect-printElement-types hiprintEpContainer">
- <a-row class="drag_item_title">拖拽组件列表</a-row>
- <a-row style="height: 100px;">
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.text" style>
- <span class="glyphicon glyphicon-text-width" aria-hidden="true"></span>
- <p class="glyphicon-class">文本</p>
- </a>
- </div>
- </a-col>
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.image" style>
- <span class="glyphicon glyphicon-picture" aria-hidden="true"></span>
- <p class="glyphicon-class">图片</p>
- </a>
- </div>
- </a-col>
- </a-row>
- <a-row style="height: 100px;">
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.longText">
- <span class="glyphicon glyphicon-subscript" aria-hidden="true"></span>
- <p class="glyphicon-class">长文</p>
- </a>
- </div>
- </a-col>
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.table" style>
- <span class="glyphicon glyphicon-th" aria-hidden="true"></span>
- <p class="glyphicon-class">表格</p>
- </a>
- </div>
- </a-col>
- </a-row>
- <a-row style="height: 100px;">
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.emptyTable" style>
- <span class="glyphicon glyphicon-th" aria-hidden="true"></span>
- <p class="glyphicon-class">空白表格</p>
- </a>
- </div>
- </a-col>
- </a-row>
- <a-row style="height: 100px;">
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.html" style="">
- <span class="glyphicon glyphicon-header" aria-hidden="true"></span>
- <p class="glyphicon-class">html</p>
- </a>
- </div>
- </a-col>
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.customText" style>
- <span class="glyphicon glyphicon-text-width" aria-hidden="true"></span>
- <p class="glyphicon-class">自定义</p>
- </a>
- </div>
- </a-col>
- </a-row>
- <a-row class="drag_item_title">辅助</a-row>
- <a-row style="height: 100px;">
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.hline" style>
- <span class="glyphicon glyphicon-resize-horizontal" aria-hidden="true"></span>
- <p class="glyphicon-class">横线</p>
- </a>
- </div>
- </a-col>
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.vline" style>
- <span class="glyphicon glyphicon-resize-vertical" aria-hidden="true"></span>
- <p class="glyphicon-class">竖线</p>
- </a>
- </div>
- </a-col>
- </a-row>
- <a-row style="height: 100px;">
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.rect">
- <span class="glyphicon glyphicon-unchecked" aria-hidden="true"></span>
- <p class="glyphicon-class">矩形</p>
- </a>
- </div>
- </a-col>
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.oval">
- <span class="glyphicon glyphicon-record" aria-hidden="true"></span>
- <p class="glyphicon-class">椭圆</p>
- </a>
- </div>
- </a-col>
- </a-row>
- <a-row v-if="currVerInfo.verVal >= 55.3" style="height: 100px;">
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.barcode">
- <span class="glyphicon glyphicon-barcode" aria-hidden="true"></span>
- <p class="glyphicon-class">条形码</p>
- </a>
- </div>
- </a-col>
- <a-col :span="12" class="drag_item_box">
- <div>
- <a class="ep-draggable-item" tid="defaultModule.qrcode">
- <span class="glyphicon glyphicon-qrcode" aria-hidden="true"></span>
- <p class="glyphicon-class">二维码</p>
- </a>
- </div>
- </a-col>
- </a-row>
- </a-col>
- </a-row>
- </a-card>
- </a-col>
- <a-col :span="15">
- <a-card class="card-design">
- <div id="hiprint-printTemplate" class="hiprint-printTemplate"></div>
- </a-card>
- </a-col>
- <a-col :span="5" class="params_setting_container">
- <a-card>
- <a-row class="hinnn-layout-sider">
- <div id="PrintElementOptionSetting"></div>
- </a-row>
- </a-card>
- </a-col>
- </a-row>
- <!-- 预览 -->
- <print-preview ref="preView"/>
- <a-modal v-model="showName" title="模板名称" @ok="saveTemplate" @cancel="cancelCaveTemplate" okText="确定" cancelText="取消" :confirmLoading="loading">
- <a-input v-model="templateName" placeholder="请输入模板名称" />
- </a-modal>
- </a-card>
- </template>
- <script defer>
- // import {defaultElementTypeProvider, hiprint} from '../../index'
- import { saveAndEdit,selectById } from '@/api/printdesign/printdesign'
- import * as vuePluginHiprint from '../../../index'
- // import panel from './panel'
- import printData from './print-data'
- import printPreview from './preview'
- import jsonView from "../json-view.vue";
- import fontSize from "./font-size.js";
- import scale from "./scale.js";
- import { decodeVer } from '@/utils'
- // disAutoConnect();
- var hiprint, defaultElementTypeProvider, panel;
- let hiprintTemplate;
- export default {
- name: "printDesign",
- components: {printPreview, jsonView},
- data() {
- return {
- showName:false,
- templateName:'',
- loading:false,
- panelsData:null,
- template: null,
- curPaper: {
- type: 'A4',
- width: 210,
- height: 296.6
- },
- paperTypes: {
- 'A3': {
- width: 420,
- height: 296.6
- },
- 'A4': {
- width: 210,
- height: 296.6
- },
- 'A5': {
- width: 210,
- height: 147.6
- },
- 'B3': {
- width: 500,
- height: 352.6
- },
- 'B4': {
- width: 250,
- height: 352.6
- },
- 'B5': {
- width: 250,
- height: 175.6
- }
- },
- // 自定义纸张
- paperPopVisible: false,
- paperWidth: '220',
- paperHeight: '80',
- // 缩放
- scaleValue: 1,
- scaleMax: 5,
- scaleMin: 0.5,
- // 导入导出json
- jsonIn: '',
- jsonOut: '',
- }
- },
- computed: {
- curPaperType() {
- let type = 'other'
- let types = this.paperTypes
- for (const key in types) {
- let item = types[key]
- let {width, height} = this.curPaper
- if (item.width === width && item.height === height) {
- type = key
- }
- }
- return type
- },
- /**
- * @description: 当前版本信息,用于 demo 页面根据版本控制功能
- * @return {Object}
- */
- currVerInfo() {
- if (this.$parent.version && this.$parent.version != "development") {
- return decodeVer(this.$parent.version)
- } else if (hiprint?.version) {
- return decodeVer(hiprint.version)
- } else {
- return {
- verVal: 9999
- }
- }
- }
- },
- mounted() {
- const templateId = this.$route.query.id;
- if(templateId){
- this.getTemplate(templateId)
- }else{
- this.templateName = '';
- }
- this.getPanel()
- // 存在一个固定版本号,并且不是开发版本
- if (this.$parent.version && this.$parent.version != "development") {
- // 加载对应版本的 hiprint
- this.getVersion(this.$parent.version)
- }
- // 不存在固定版本,加载当前代码中的 hiprint
- else {
- hiprint = vuePluginHiprint.hiprint
- defaultElementTypeProvider = vuePluginHiprint.defaultElementTypeProvider
- this.init()
- }
- },
- methods: {
- /**
- * @description: 加载 panel
- */
- getPanel() {
- // 加载所有 panel
- const panels = require.context('./', true, /panel.*\.js$/)
- // 对所有 panel 进行版本解析
- var panelInfos = panels.keys().map(key => ({
- ...decodeVer(key.replace(/(\.\/panel-?)|(\.js)/g, '')),
- key
- }))
- // 存在一个固定版本号,并且不是开发版本
- if (this.$parent.version && this.$parent.version != "development") {
- // 解析对应版本信息
- var currVerInfo = decodeVer(this.$parent.version)
- // 查找小于等于当前版本的 panel
- var newVers = panelInfos.filter(({verVal}) => verVal <= currVerInfo.verVal)
- // 对版本号进行倒叙
- .sort((acc, curr) => curr.verVal - acc.verVal)
- // 获取最大版本号面板 json
- panel = panels(newVers[0].key).default
- }
- // 不存在固定版本,加载默认面板 json
- else {
- panel = panels('./panel.js').default
- }
- },
- setPanel(){
- // console.log('panelsData',this.panelsData);
- panel = this.panelsData;
- this.init()
- },
- /**
- * @description: 加载版本
- * @param {string} version 版本号
- */
- getVersion(version) {
- const script = document.createElement("script");
- script.setAttribute("type", "text/javascript");
- script.setAttribute(
- "src",
- `https://cdn.jsdelivr.net/npm/vue-plugin-hiprint@${version}/dist/vue-plugin-hiprint.js`
- );
- script.addEventListener("load", () => {
- hiprint = window['vue-plugin-hiprint'].hiprint
- defaultElementTypeProvider = window['vue-plugin-hiprint'].defaultElementTypeProvider
- this.init()
- })
- document.body.append(script)
- },
- init() {
- hiprint.init({
- providers: [new defaultElementTypeProvider()],
- lang: this.$parent.lang
- });
- // 还原配置
- hiprint.setConfig()
- // 替换配置
- hiprint.setConfig({
- optionItems: [
- fontSize,
- scale,
- function () {
- function t() {
- this.name = "zIndex";
- }
- return t.prototype.css = function (t, e) {
- if (t && t.length) {
- if (e) return t.css('z-index', e);
- }
- return null;
- }, t.prototype.createTarget = function () {
- return this.target = $('<div class="hiprint-option-item">\n <div class="hiprint-option-item-label">\n 元素层级2\n </div>\n <div class="hiprint-option-item-field">\n <input type="number" class="auto-submit"/>\n </div>\n </div>'), this.target;
- }, t.prototype.getValue = function () {
- var t = this.target.find("input").val();
- if (t) return parseInt(t.toString());
- }, t.prototype.setValue = function (t) {
- this.target.find("input").val(t);
- }, t.prototype.destroy = function () {
- this.target.remove();
- }, t;
- }(),
- ],
- movingDistance: 2.5,
- text: {
- tabs: [
- // 隐藏部分
- {
- // name: '测试', // tab名称 可忽略
- options: [] // 必须包含 options
- },// 当修改第二个 tabs 时,必须把他之前的 tabs 都列举出来.
- {
- name: '样式', options: [
- {
- name: 'scale',
- after: 'transform', // 自定义参数,插入在 transform 之后
- hidden: false
- },
- ]
- }
- ],
- supportOptions: [
- {
- name: 'styler',
- hidden: true
- },
- {
- name: 'scale', // 自定义参数,supportOptions 必须得添加
- after: 'transform', // 自定义参数,插入在 transform 之后
- hidden: false
- },
- {
- name: 'formatter',
- hidden: true
- },
- ]
- },
- image: {
- tabs: [
- {
- // 整体替换
- replace: true,
- name: '基本', options: [
- {
- name: 'field',
- hidden: false
- },
- {
- name: 'src',
- hidden: false
- },
- {
- name: 'fit',
- hidden: false
- }
- ]
- },
- ],
- }
- })
- // eslint-disable-next-line no-undef
- hiprint.PrintElementTypeManager.buildByHtml($('.ep-draggable-item'));
- $('#hiprint-printTemplate').empty()
- let that = this;
- this.template = hiprintTemplate = new hiprint.PrintTemplate({
- template: panel,
- // 图片选择功能
- onImageChooseClick: (target) => {
- // 测试 3秒后修改图片地址值
- setTimeout(() => {
- // target.refresh(url,options,callback)
- // callback(el, width, height) // 原元素,宽,高
- // target.refresh(url,false,(el,width,height)=>{
- // el.options.width = width;
- // el.designTarget.css('width', width + "pt");
- // el.designTarget.children('.resize-panel').trigger($.Event('click'));
- // })
- target.refresh("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAIIAQMAAAB99EudAAAABlBMVEUmf8vG2O41LStnAAABD0lEQVR42u3XQQqCQBSAYcWFS4/QUTpaHa2jdISWLUJjjMpclJoPGvq+1WsYfiJCZ4oCAAAAAAAAAAAAAAAAAHin6pL9c6H/fOzHbRrP0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0u/SY9LS0tLS0tLS0tLS0n+edm+UlpaWlpaWlpaWlpaW/tl0Ndyzbno7/+tPTJdd1wal69dNa6abx+Lq6TSeYtK7BX/Diek0XULSZZrakPRtV0i6Hu/KIt30q4fM0pvBqvR9mvsQkZaW9gyJT+f5lsnzjR54xAk8mAUeJyMPwYFH98ALx5Jr0kRLLndT7b64UX9QR/0eAAAAAAAAAAAAAAAAAAD/4gpryzr/bja4QgAAAABJRU5ErkJggg==", {
- // auto: true, // 根据图片宽高自动等比(宽>高?width:height)
- // width: true, // 按宽调整高
- // height: true, // 按高调整宽
- real: true // 根据图片实际尺寸调整(转pt)
- })
- }, 3000)
- // target.getValue()
- // target.refresh(url)
- },
- // 自定义可选字体
- // 或者使用 hiprintTemplate.setFontList([])
- // 或元素中 options.fontList: []
- fontList: [
- {title: '微软雅黑', value: 'Microsoft YaHei'},
- {title: '黑体', value: 'STHeitiSC-Light'},
- {title: '思源黑体', value: 'SourceHanSansCN-Normal'},
- {title: '王羲之书法体', value: '王羲之书法体'},
- {title: '宋体', value: 'SimSun'},
- {title: '华为楷体', value: 'STKaiti'},
- {title: 'cursive', value: 'cursive'},
- ],
- dataMode: 1, // 1:getJson 其他:getJsonTid 默认1
- history: true, // 是否需要 撤销重做功能
- onDataChanged: (type, json) => {
- console.log(type); // 新增、移动、删除、修改(参数调整)、大小、旋转
- console.log(json); // 返回 template
- },
- onUpdateError: (e) => {
- console.log(e);
- },
- settingContainer: '#PrintElementOptionSetting',
- paginationContainer: '.hiprint-printPagination'
- });
- hiprintTemplate.design('#hiprint-printTemplate', {grid: true});
- // 获取当前放大比例, 当zoom时传true 才会有
- this.scaleValue = hiprintTemplate.editingPanel.scale || 1;
- },
- /**
- * 设置纸张大小
- * @param type [A3, A4, A5, B3, B4, B5, other]
- * @param value {width,height} mm
- */
- setPaper(type, value) {
- try {
- if (Object.keys(this.paperTypes).includes(type)) {
- this.curPaper = {type: type, width: value.width, height: value.height}
- hiprintTemplate.setPaper(value.width, value.height)
- } else {
- this.curPaper = {type: 'other', width: value.width, height: value.height}
- hiprintTemplate.setPaper(value.width, value.height)
- }
- } catch (error) {
- this.$message.error(`操作失败: ${error}`)
- }
- },
- otherPaper() {
- let value = {}
- value.width = this.paperWidth
- value.height = this.paperHeight
- this.paperPopVisible = false
- this.setPaper('other', value)
- },
- changeScale(big) {
- let scaleValue = this.scaleValue;
- if (big) {
- scaleValue += 0.1;
- if (scaleValue > this.scaleMax) scaleValue = 5;
- } else {
- scaleValue -= 0.1;
- if (scaleValue < this.scaleMin) scaleValue = 0.5;
- }
- if (hiprintTemplate) {
- // scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大
- hiprintTemplate.zoom(scaleValue);
- this.scaleValue = scaleValue;
- }
- },
- rotatePaper() {
- if (hiprintTemplate) {
- hiprintTemplate.rotatePaper()
- }
- },
- preView() {
- // 测试, 点预览更新拖拽元素
- hiprint.updateElementType('defaultModule.text', (type) => {
- type.title = '这是更新后的元素';
- return type
- })
- // 测试, 通过socket刷新打印机列表; 默认只有连接的时候才会获取到最新的打印机列表
- hiprint.refreshPrinterList((list) => {
- console.log('refreshPrinterList')
- console.log(list)
- });
- // 测试, 获取IP、IPV6、MAC地址、DNS
- // 参数格式:
- // 1. 类型(ip、ipv6、mac、dns、all、interface、vboxnet)
- // 2. 回调 data => {addr, e} addr: 返回的数据 e:错误信息
- // 3. 其他参数 ...args
- hiprint.getAddress('ip', (data) => {
- console.log('ip')
- console.log(data)
- })
- hiprint.getAddress('ipv6', (data) => {
- console.log('ipv6')
- console.log(data)
- })
- hiprint.getAddress('mac', (data) => {
- console.log('mac')
- console.log(data)
- })
- hiprint.getAddress('dns', (data) => {
- console.log('dns')
- console.log(data)
- })
- hiprint.getAddress('all', (data) => {
- console.log('all')
- console.log(data)
- })
- // 各个平台不一样, 用法见: https://www.npmjs.com/package/address
- hiprint.getAddress('interface', (data) => {
- console.log('interface')
- console.log(data)
- }, 'IPv4', 'eth1')
- this.$refs.preView.show(hiprintTemplate, printData)
- },
- onlyPrint() {
- let hiprintTemplate = this.$print(undefined, panel, printData, {}, {
- styleHandler: () => {
- let css = '<link href="http://hiprint.io/Content/hiprint/css/print-lock.css" media="print" rel="stylesheet">';
- return css
- }
- })
- console.log(hiprintTemplate);
- },
- onlyPrint2() {
- let that = this;
- if (window.hiwebSocket.opened) {
- let hiprintTemplate = this.$print2(undefined, panel, printData, {
- printer: '', title: 'Api单独打印',
- styleHandler: () => {
- // let css = '<link href="http://hiprint.io/Content/hiprint/css/print-lock.css" media="print" rel="stylesheet">';
- let css = '<style>.hiprint-printElement-text{color:red !important;}</style>'
- return css
- }
- })
- let key = 'Api单独直接打印';
- hiprintTemplate.on('printSuccess', function () {
- that.$notification.success({
- key: key,
- placement: 'topRight',
- message: key + ' 打印成功',
- description: 'Api单独直接打印回调',
- });
- });
- return;
- }
- this.$error({
- title: "客户端未连接",
- content: (h) => (
- <div>
- 连接【{hiwebSocket.host}】失败!
- <br />
- 请确保目标服务器已
- <a
- href="https://gitee.com/CcSimple/electron-hiprint/releases"
- target="_blank"
- >
- 下载
- </a>
- 并
- <a href="hiprint://" target="_blank">
- 运行
- </a>
- 打印服务!
- </div>
- ),
- });
- },
- print() {
- if (window.hiwebSocket.opened) {
- const printerList = hiprintTemplate.getPrinterList();
- console.log(printerList)
- hiprintTemplate.print2(printData, {printer: '', title: 'hiprint测试打印'});
- return
- }
- this.$error({
- title: "客户端未连接",
- content: (h) => (
- <div>
- 连接【{hiwebSocket.host}】失败!
- <br />
- 请确保目标服务器已
- <a
- href="https://gitee.com/CcSimple/electron-hiprint/releases"
- target="_blank"
- >
- 下载
- </a>
- 并
- <a href="hiprint://" target="_blank">
- 运行
- </a>
- 打印服务!
- </div>
- ),
- });
- },
- clearPaper() {
- try {
- hiprintTemplate.clear();
- } catch (error) {
- this.$message.error(`操作失败: ${error}`);
- }
- },
- exportPdf(type) {
- hiprintTemplate.toPdf(printData, '测试导出pdf', {isDownload: false, type: type}).then((res) => {
- console.log('type:', type);
- console.log(res);
- });
- },
- ippPrintAttr() {
- // 不知道打印机 ipp 情况, 可通过 '客户端' 获取一下
- const printerList = hiprintTemplate.getPrinterList();
- console.log(printerList)
- if (!printerList.length) return;
- let p = printerList[0];
- console.log(p)
- // 系统不同, 参数可能不同
- let url = p.options['printer-uri-supported'];
- // 测试 获取 ipp打印 支持参数
- hiprint.ippPrint({
- url: url,
- // 打印机参数: {version,uri,charset,language}
- opt: {},
- action: 'Get-Printer-Attributes', // 获取打印机支持参数
- // ipp参数
- message: null,
- }, (res) => {
- // 执行的ipp 任务回调 / 错误回调
- console.log(res)
- }, (printer) => {
- // ipp连接成功 回调 打印机信息
- console.log(printer)
- })
- },
- ippPrintTest() {
- // 不知道打印机 ipp 情况, 可通过 '客户端' 获取一下
- const printerList = hiprintTemplate.getPrinterList();
- console.log(printerList)
- if (!printerList.length) return;
- let p = printerList[0];
- console.log(p)
- // 系统不同, 参数可能不同
- let url = p.options['printer-uri-supported'];
- // 测试 打印文本
- hiprint.ippPrint({
- url: url,
- // 打印机参数: {version,uri,charset,language}
- opt: {},
- action: 'Print-Job',
- // ipp参数
- message: {
- "operation-attributes-tag": {
- "requesting-user-name": "hiPrint", // 用户名
- "job-name": "ipp Test Job", // 任务名
- "document-format": "text/plain" // 文档类型
- },
- // data 需为 Buffer (客户端简单处理了string 转 Buffer), 支持设置 encoding
- // data 需为 Buffer (客户端简单处理了string 转 Buffer), 支持设置 encoding
- // data 需为 Buffer (客户端简单处理了string 转 Buffer), 支持设置 encoding
- // 其他 Uint8Array/ArrayBuffer 默认仅 使用 Buffer.from(data)
- // 其他 Uint8Array/ArrayBuffer 默认仅 使用 Buffer.from(data)
- // 其他 Uint8Array/ArrayBuffer 默认仅 使用 Buffer.from(data)
- // 其他 Uint8Array/ArrayBuffer 默认仅 使用 Buffer.from(data)
- data: 'test test test test test test test',
- encoding: 'utf-8' // 默认可不传
- }
- }, (res) => {
- // 执行的ipp 任务回调 / 错误回调
- console.log(res)
- }, (printer) => {
- // ipp连接成功 回调 打印机信息
- console.log(printer)
- })
- },
- // 自定义 ipp 请求
- ippRequestTest() {
- const printerList = hiprintTemplate.getPrinterList();
- console.log(printerList)
- if (!printerList.length) return;
- let p = printerList[0];
- console.log(p)
- // 系统不同, 参数可能不同
- let url = p.options['printer-uri-supported'];
- // 详见: https://www.npmjs.com/package/ipp
- hiprint.ippRequest({
- url: url,
- // 传入的数据 ipp.serialize 后 未做任何处理 打印内容 需要 Buffer
- // 传入的数据 ipp.serialize 后 未做任何处理 打印内容 需要 Buffer
- // 传入的数据 ipp.serialize 后 未做任何处理 打印内容 需要 Buffer
- data: {
- "operation": "Get-Printer-Attributes",
- "operation-attributes-tag": {
- // 测试发现 Request下列3个必须要有
- "attributes-charset": "utf-8",
- "attributes-natural-language": "zh-cn",
- "printer-uri": url
- }
- }
- }, (res) => {
- // 执行的ipp 任务回调 / 错误回调
- console.log(res)
- })
- },
- ippRequestPrint() {
- const printerList = hiprintTemplate.getPrinterList();
- console.log(printerList)
- if (!printerList.length) return;
- let p = printerList[0];
- console.log(p)
- // 系统不同, 参数可能不同
- let url = p.options['printer-uri-supported'];
- let str = "ippRequestPrint ippRequestPrint ippRequestPrint";
- let array = new Uint8Array(str.length);
- for (var i = 0; i < str.length; i++) {
- array[i] = str.charCodeAt(i);
- }
- let testData = array.buffer;
- // 详见: https://www.npmjs.com/package/ipp
- hiprint.ippRequest({
- url: url,
- // 传入的数据 ipp.serialize 后 未做任何处理 打印内容 需要 Buffer
- // 传入的数据 ipp.serialize 后 未做任何处理 打印内容 需要 Buffer
- // 传入的数据 ipp.serialize 后 未做任何处理 打印内容 需要 Buffer
- data: {
- "operation": "Print-Job",
- "operation-attributes-tag": {
- // 测试发现 Request下列3个必须要有
- "attributes-charset": "utf-8",
- "attributes-natural-language": "zh-cn",
- "printer-uri": url,
- "requesting-user-name": "hiPrint", // 用户名
- "job-name": "ipp Request Job", // 任务名
- "document-format": "text/plain" // 文档类型
- },
- data: testData
- }
- }, (res) => {
- // 执行的ipp 任务回调 / 错误回调
- console.log(res)
- })
- },
- updateJson() {
- if (hiprintTemplate) {
- try {
- hiprintTemplate.update(JSON.parse(this.jsonIn))
- } catch (e) {
- this.$message.error(`更新失败: ${e}`)
- }
- }
- },
- exportJson() {
- if (hiprintTemplate) {
- this.jsonOut = JSON.stringify(hiprintTemplate.getJson() || {})
- console.log('this.jsonOut',this.jsonOut);
- }
- },
- setElsAlign(e) {
- hiprintTemplate.setElsAlign(e)
- },
- setElsSpace(h) {
- hiprintTemplate.setElsSpace(10, h)
- },
- getSelectEls() {
- let els = hiprintTemplate.getSelectEls();
- console.log(els)
- },
- updateFontSize() {
- hiprintTemplate.updateOption('fontSize', 12);
- },
- updateFontWeight() {
- hiprintTemplate.updateOption('fontWeight', 'bolder');
- },
- // 新增的
- getTemplate(templateId){
- selectById(templateId).then(res=>{
- this.templateName = res.data.name;
- this.jsonIn=res.data.content;
- this.panelsData=res.data.contentJson;
- this.setPanel();
- this.updateJson();
- }).catch(err=>{
- console.log('getTemplate err',err);
- })
- },
- cancelCaveTemplate(){
- this.showName=false;
- // this.templateName = '';
- },
- saveTemplate(){
- if (hiprintTemplate) {
- // console.log('hiprintTemplate=====',hiprintTemplate);
- this.loading = true;
- let josnData = JSON.stringify(hiprintTemplate.getJson() || {})
- // console.log('josnData',josnData);
- let params = {
- name:this.templateName,
- contentJson:josnData
- }
- saveAndEdit(params).then(res => {
- if (res.code === 200) {
- this.$message.success("操作成功!");
- this.cancelCaveTemplate();
- }
- }).catch(error => {
- console.log('saveTemplate error',error)
- }).finally(() => {
- this.loading = false;
- })
- }
- }
- }
- }
- </script>
- <style lang="less" scoped>
- // 拖拽
- .drag_item_box {
- height: 100%;
- padding: 6px;
- }
- .drag_item_box > div {
- height: 100%;
- width: 100%;
- background-color: #fff;
- display: flex;
- justify-content: center;
- align-items: center;
- }
- .drag_item_box > div > a {
- text-align: center;
- text-decoration-line: none;
- }
- .drag_item_box > div > a > span {
- font-size: 28px;
- }
- .drag_item_box > div > a > p {
- margin: 0;
- }
- .drag_item_title {
- font-size: 16px;
- padding: 12px 6px 0 6px;
- font-weight: bold;
- }
- // 默认图片
- /deep/ .hiprint-printElement-image-content {
- img {
- content: url("~@/assets/logo.png");
- }
- }
- // 辅助线样式
- /deep/ .toplineOfPosition {
- border: 0;
- border-top: 1px dashed purple;
- }
- /deep/ .bottomlineOfPosition {
- border: 0;
- border-top: 1px dashed purple;
- }
- /deep/ .leftlineOfPosition {
- border: 0;
- border-left: 1px dashed purple;
- }
- /deep/ .rightlineOfPosition {
- border: 0;
- border-left: 1px dashed purple;
- }
- // 设计容器
- .card-design {
- overflow: hidden;
- overflow-x: auto;
- overflow-y: auto;
- }
- .pagetop{
- text-align: center;
- margin-bottom: 20px;
- .templateName{font-size: 18px;font-weight: 500;margin-bottom: 10px;}
- .tip{font-size: 14px;color:crimson;}
- }
- </style>
|