Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
W
web-project
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
海康威视
web-project
Commits
9c3466ac
Commit
9c3466ac
authored
Aug 04, 2024
by
朱超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
明日报表更新
parent
14e0abfd
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
107 additions
and
1 deletion
+107
-1
package.json
package.json
+2
-0
toPDF.js
src/utils/toPDF.js
+89
-0
ForecastPage.vue
src/views/Report/ForecastPage.vue
+16
-1
No files found.
package.json
View file @
9c3466ac
...
...
@@ -16,8 +16,10 @@
"
echarts
"
:
"
^5.5.0
"
,
"
element-plus
"
:
"
^2.7.5
"
,
"
file-saver
"
:
"
^2.0.5
"
,
"
html2canvas
"
:
"
^1.4.1
"
,
"
jquery
"
:
"
^3.7.1
"
,
"
jsencrypt
"
:
"
^3.3.2
"
,
"
jspdf
"
:
"
^2.5.1
"
,
"
less
"
:
"
^4.2.0
"
,
"
mitt
"
:
"
^3.0.1
"
,
"
node-sass
"
:
"
^9.0.0
"
,
...
...
src/utils/toPDF.js
0 → 100644
View file @
9c3466ac
import
html2Canvas
from
'html2canvas'
import
JsPDF
from
'jspdf'
var
noTableHeight
=
0
//table外的元素高度
export
const
htmlPdf
=
(
title
,
html
,
fileList
,
type
)
=>
{
// type传有效值pdf则为横版
if
(
fileList
)
{
const
pageHeight
=
Math
.
floor
(
277
*
html
.
scrollWidth
/
190
)
+
20
//计算pdf高度
for
(
let
i
=
0
;
i
<
fileList
.
length
;
i
++
)
{
//循环获取的元素
const
multiple
=
Math
.
ceil
((
fileList
[
i
].
offsetTop
+
fileList
[
i
].
offsetHeight
)
/
pageHeight
)
//元素的高度
if
(
isSplit
(
fileList
,
i
,
multiple
*
pageHeight
))
{
//计算是否超出一页
var
_H
=
''
//向pdf插入空白块的内容高度
if
(
fileList
[
i
].
localName
!==
'tr'
)
{
//判断是不是表格里的内容
_H
=
multiple
*
pageHeight
-
(
fileList
[
i
].
offsetTop
+
fileList
[
i
].
offsetHeight
)
}
else
{
_H
=
multiple
*
pageHeight
-
(
fileList
[
i
].
offsetTop
+
fileList
[
i
].
offsetHeight
+
noTableHeight
)
+
20
}
var
newNode
=
getFooterElement
(
_H
)
//向pdf插入空白块的内容
const
divParent
=
fileList
[
i
].
parentNode
// 获取该div的父节点
const
next
=
fileList
[
i
].
nextSibling
// 获取div的下一个兄弟节点
// 判断兄弟节点是否存在
if
(
next
)
{
// 存在则将新节点插入到div的下一个兄弟节点之前,即div之后
divParent
.
insertBefore
(
newNode
,
next
)
}
else
{
// 否则向节点添加最后一个子节点
divParent
.
appendChild
(
newNode
)
}
}
}
}
html2Canvas
(
html
,
{
allowTaint
:
false
,
taintTest
:
false
,
logging
:
false
,
useCORS
:
true
,
dpi
:
window
.
devicePixelRatio
*
1
,
scale
:
1
// 按比例增加分辨率
}).
then
(
canvas
=>
{
var
pdf
=
new
JsPDF
(
'p'
,
'mm'
,
'a4'
)
// A4纸,纵向
var
ctx
=
canvas
.
getContext
(
'2d'
)
var
a4w
=
type
?
277
:
190
;
var
a4h
=
type
?
190
:
277
// A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
var
imgHeight
=
Math
.
floor
(
a4h
*
canvas
.
width
/
a4w
)
// 按A4显示比例换算一页图像的像素高度
var
renderedHeight
=
0
while
(
renderedHeight
<
canvas
.
height
)
{
var
page
=
document
.
createElement
(
'canvas'
)
page
.
width
=
canvas
.
width
page
.
height
=
Math
.
min
(
imgHeight
,
canvas
.
height
-
renderedHeight
)
// 可能内容不足一页
// 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
page
.
getContext
(
'2d'
).
putImageData
(
ctx
.
getImageData
(
0
,
renderedHeight
,
canvas
.
width
,
Math
.
min
(
imgHeight
,
canvas
.
height
-
renderedHeight
)),
0
,
0
)
pdf
.
addImage
(
page
.
toDataURL
(
'image/jpeg'
,
1.0
),
'JPEG'
,
10
,
10
,
a4w
,
Math
.
min
(
a4h
,
a4w
*
page
.
height
/
page
.
width
))
// 添加图像到页面,保留10mm边距
renderedHeight
+=
imgHeight
if
(
renderedHeight
<
canvas
.
height
)
{
pdf
.
addPage
()
// 如果后面还有内容,添加一个空页
}
// delete page;
}
// 保存文件
pdf
.
save
(
title
+
'.pdf'
)
})
}
// pdf截断需要一个空白位置来补充
const
getFooterElement
=
(
remainingHeight
,
fillingHeight
=
0
)
=>
{
const
newNode
=
document
.
createElement
(
'div'
)
newNode
.
style
.
background
=
'#ffffff'
newNode
.
style
.
width
=
'calc(100% + 8px)'
newNode
.
style
.
marginLeft
=
'-4px'
newNode
.
style
.
marginBottom
=
'0px'
newNode
.
classList
.
add
(
'divRemove'
)
newNode
.
style
.
height
=
(
remainingHeight
+
fillingHeight
)
+
'px'
return
newNode
}
const
isSplit
=
(
nodes
,
index
,
pageHeight
)
=>
{
// 判断是不是tr 如果不是高度存起来
// 表格里的内容要特殊处理
// tr.offsetTop 是tr到table表格的高度
// 所以计算高速时候要把表格外的高度加起来
// 生成的pdf没有表格了这里可以不做处理 直接计算就行
if
(
nodes
[
index
].
localName
!==
'tr'
)
{
//判断元素是不是tr
noTableHeight
+=
nodes
[
index
].
clientHeight
}
if
(
nodes
[
index
].
localName
!==
'tr'
)
{
return
nodes
[
index
].
offsetTop
+
nodes
[
index
].
offsetHeight
<
pageHeight
&&
nodes
[
index
+
1
]
&&
nodes
[
index
+
1
].
offsetTop
+
nodes
[
index
+
1
].
offsetHeight
>
pageHeight
}
else
{
return
nodes
[
index
].
offsetTop
+
nodes
[
index
].
offsetHeight
+
noTableHeight
<
pageHeight
&&
nodes
[
index
+
1
]
&&
nodes
[
index
+
1
].
offsetTop
+
nodes
[
index
+
1
].
offsetHeight
+
noTableHeight
>
pageHeight
}
}
\ No newline at end of file
src/views/Report/ForecastPage.vue
View file @
9c3466ac
...
...
@@ -29,6 +29,7 @@
style=
"min-width: 70px"
@
click=
"postHeatForecastFun"
class=
"printHidden"
v-show=
"printHidden"
>
历史查询
</el-button
>
</th>
...
...
@@ -53,6 +54,7 @@
type=
"primary"
style=
"min-width: 70px"
class=
"printHidden"
v-show=
"printHidden"
@
click=
"postPrintHeatForecastFun"
>
打印查询
</el-button
>
...
...
@@ -243,7 +245,7 @@
</tr>
</table>
<div>
<div
class=
"btngrounp printHidden"
>
<div
class=
"btngrounp printHidden"
v-show=
"printHidden"
>
<el-button
type=
"primary"
v-print=
"printObj"
...
...
@@ -265,6 +267,7 @@
<el-button
type=
"primary"
style=
"margin: 15px 0 0 10px"
@
click=
"handleExport"
>
导出PDF
</el-button
>
<router-link
to=
"/RealAnalysis"
...
...
@@ -460,6 +463,7 @@ import { saveAs } from "file-saver";
import
XLSX
from
"xlsx-js-style"
;
import
{
postHeatForecast
,
postPrintHeatForecast
}
from
"../../api/report"
;
import
print
from
"vue3-print-nb"
;
import
{
htmlPdf
}
from
"../../utils/toPDF"
;
const
temp
=
ref
([]);
//24小时室外预测值
const
weather
=
ref
([]);
//当日气象信息
const
predTemp
=
ref
([]);
//24小时室外体感预测值
...
...
@@ -469,6 +473,7 @@ const enertyInfo = reactive({
printTime
:
null
,
queryTime
:
"2024-1-1 09:00:00"
,
});
const
printHidden
=
ref
(
true
);
const
vPrint
=
print
;
const
printObj
=
{
id
:
"printBlock"
,
...
...
@@ -476,6 +481,16 @@ const printObj = {
extraHead
:
'<meta http-equiv="Content-Language"content="zh-cn"/>'
,
zIndex
:
20002
,
};
const
handleExport
=
(
name
)
=>
{
printHidden
.
value
=
false
;
setTimeout
(
function
()
{
var
fileName
=
"明日预测报表"
;
const
fileList
=
document
.
getElementsByClassName
(
"contentBlockInn"
);
htmlPdf
(
fileName
,
document
.
querySelector
(
"#printBlock"
),
fileList
);
ElMessage
.
success
(
"导出成功!请稍后。。。"
);
printHidden
.
value
=
true
;
},
100
);
};
function
exportTableToExcel
()
{
const
workbook
=
XLSX
.
utils
.
book_new
();
var
ws
=
XLSX
.
utils
.
table_to_sheet
(
document
.
getElementById
(
"exlBlock"
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment