zmdms-utils 0.0.44 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/htmlToPdf.d.ts +40 -0
- package/dist/es/htmlToPdf.js +82 -0
- package/dist/es/pdf.d.ts +20 -13
- package/dist/es/pdf.js +135 -60
- package/dist/es/water.js +7 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +1 -1
- package/src/htmlToPdf.ts +120 -0
- package/src/index.ts +3 -0
- package/src/pdf.ts +165 -88
- package/src/water.ts +7 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { IImgToPdfConfig } from './pdf.js';
|
|
2
|
+
|
|
3
|
+
interface IConfig {
|
|
4
|
+
/** 容器,从哪个容器里面找需要转换的元素 */
|
|
5
|
+
container?: HTMLElement;
|
|
6
|
+
/**
|
|
7
|
+
* 需要转换的dom 可以是一个字符串
|
|
8
|
+
* 如果是字符串的话 那么就是通过querySelectorAll的形式查找
|
|
9
|
+
* 如果是一个dom实例
|
|
10
|
+
* 如果是多个dom实例
|
|
11
|
+
**/
|
|
12
|
+
pageDom?: string | HTMLElement | HTMLElement[];
|
|
13
|
+
/**
|
|
14
|
+
* 是否使用canvas直接转
|
|
15
|
+
*/
|
|
16
|
+
useCanvas?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 是否生成多份PDF
|
|
19
|
+
*/
|
|
20
|
+
isMultiple?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* pdf名称 默认取dom元素配置的 data-title属性
|
|
23
|
+
*/
|
|
24
|
+
pdfName?: string;
|
|
25
|
+
/**
|
|
26
|
+
* pdf相关配置
|
|
27
|
+
*/
|
|
28
|
+
pdfConfig?: IImgToPdfConfig["pdfConfig"];
|
|
29
|
+
/**
|
|
30
|
+
* 是否下载pdf
|
|
31
|
+
*/
|
|
32
|
+
isDownload?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 水印相关
|
|
35
|
+
*/
|
|
36
|
+
waterConfig?: IImgToPdfConfig["waterConfig"];
|
|
37
|
+
}
|
|
38
|
+
declare function htmlToPdf(config: IConfig): Promise<unknown>;
|
|
39
|
+
|
|
40
|
+
export { htmlToPdf };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { __awaiter, __generator } from './_virtual/_tslib.js';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import { imgToPdf } from './pdf.js';
|
|
4
|
+
import { domToCanvas } from './canvas.js';
|
|
5
|
+
|
|
6
|
+
function htmlToPdf(config) {
|
|
7
|
+
var _this = this;
|
|
8
|
+
var container = config.container, pageDom = config.pageDom, _a = config.useCanvas, useCanvas = _a === void 0 ? true : _a, isMultiple = config.isMultiple, pdfConfig = config.pdfConfig, pdfName = config.pdfName, isDownload = config.isDownload, waterConfig = config.waterConfig;
|
|
9
|
+
// 找到需要转换的dom
|
|
10
|
+
var domList;
|
|
11
|
+
if (typeof pageDom === "string") {
|
|
12
|
+
domList = container
|
|
13
|
+
? container.querySelectorAll(pageDom)
|
|
14
|
+
: document.body.querySelectorAll(pageDom);
|
|
15
|
+
domList = Array.from(domList);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
domList = Array.isArray(pageDom) ? pageDom : [pageDom];
|
|
19
|
+
}
|
|
20
|
+
if (domList.length === 0) {
|
|
21
|
+
return Promise.reject("没有可以导出的元素!");
|
|
22
|
+
}
|
|
23
|
+
if (!useCanvas) {
|
|
24
|
+
// 直接导出html 待实现
|
|
25
|
+
return Promise.resolve();
|
|
26
|
+
}
|
|
27
|
+
// 通过html => canvas => pdf 的形式导出
|
|
28
|
+
// 多份导出
|
|
29
|
+
if (isMultiple) {
|
|
30
|
+
var promiseArr_1 = [];
|
|
31
|
+
domList.forEach(function (domItem, index) {
|
|
32
|
+
var dataTitle = domItem.dataset.title || "".concat(dayjs().format("YYYY-MM-DD"), "-").concat(index + 1);
|
|
33
|
+
var item = domToCanvas(domItem).then(function (canvas) { return __awaiter(_this, void 0, void 0, function () {
|
|
34
|
+
var canvasWidth, canvasHeight, pdf;
|
|
35
|
+
return __generator(this, function (_a) {
|
|
36
|
+
switch (_a.label) {
|
|
37
|
+
case 0:
|
|
38
|
+
canvasWidth = canvas.width;
|
|
39
|
+
canvasHeight = canvas.height;
|
|
40
|
+
return [4 /*yield*/, imgToPdf({
|
|
41
|
+
images: {
|
|
42
|
+
image: canvas,
|
|
43
|
+
width: canvasWidth,
|
|
44
|
+
height: canvasHeight,
|
|
45
|
+
},
|
|
46
|
+
pdfConfig: pdfConfig,
|
|
47
|
+
pdfDownloadConfig: {
|
|
48
|
+
isDownload: isDownload,
|
|
49
|
+
pdfName: pdfName ? pdfName : dataTitle,
|
|
50
|
+
},
|
|
51
|
+
waterConfig: waterConfig,
|
|
52
|
+
})];
|
|
53
|
+
case 1:
|
|
54
|
+
pdf = _a.sent();
|
|
55
|
+
return [2 /*return*/, pdf];
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}); });
|
|
59
|
+
promiseArr_1.push(item);
|
|
60
|
+
});
|
|
61
|
+
return Promise.all(promiseArr_1);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// 创建canvas组
|
|
65
|
+
var promiseArr = domList.map(function (domItem, index) {
|
|
66
|
+
return domToCanvas(domItem);
|
|
67
|
+
});
|
|
68
|
+
var dataTitle = domList[0].dataset.title || "".concat(dayjs().format("YYYY-MM-DD"));
|
|
69
|
+
// 合并成一个pdf导出
|
|
70
|
+
return imgToPdf({
|
|
71
|
+
images: promiseArr,
|
|
72
|
+
pdfConfig: pdfConfig,
|
|
73
|
+
pdfDownloadConfig: {
|
|
74
|
+
isDownload: isDownload,
|
|
75
|
+
pdfName: pdfName ? pdfName : dataTitle,
|
|
76
|
+
},
|
|
77
|
+
waterConfig: waterConfig,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { htmlToPdf };
|
package/dist/es/pdf.d.ts
CHANGED
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import { RGBAData } from 'jspdf';
|
|
2
2
|
import { IWaterResult } from './water.js';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* 图片 转 pdf
|
|
6
|
-
*/
|
|
7
4
|
declare function imgToPdf(config: IImgToPdfConfig): Promise<unknown>;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
image:
|
|
5
|
+
type IImage = string | HTMLImageElement | HTMLCanvasElement | Uint8Array | RGBAData;
|
|
6
|
+
interface IIMageConfig {
|
|
7
|
+
image: IImage;
|
|
11
8
|
width: number;
|
|
12
9
|
height: number;
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
}
|
|
11
|
+
interface IImgToPdfConfig {
|
|
12
|
+
/** 图片 base64字符串 */
|
|
13
|
+
images: IIMageConfig | any[];
|
|
15
14
|
/** 生成的pdf左边距 */
|
|
16
15
|
leftPadding?: number;
|
|
16
|
+
pdfConfig?: IPdfConfig;
|
|
17
|
+
pdfDownloadConfig?: IPdfDownloadConfig;
|
|
18
|
+
/**
|
|
19
|
+
* 水印相关信息
|
|
20
|
+
*/
|
|
21
|
+
waterConfig?: IWaterResult;
|
|
22
|
+
}
|
|
23
|
+
interface IPdfConfig {
|
|
17
24
|
/** 导出pdf单位 */
|
|
18
25
|
unit?: "pt" | "mm";
|
|
19
26
|
/**
|
|
@@ -29,14 +36,14 @@ interface IImgToPdfConfig {
|
|
|
29
36
|
* 生成的pdf是否压缩
|
|
30
37
|
*/
|
|
31
38
|
compress?: boolean;
|
|
39
|
+
}
|
|
40
|
+
interface IPdfDownloadConfig {
|
|
32
41
|
/**
|
|
33
42
|
* 生成pdf的名称
|
|
34
43
|
*/
|
|
35
44
|
pdfName?: string;
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
*/
|
|
39
|
-
waterConfig?: IWaterResult;
|
|
45
|
+
/** 是否直接下载pdf */
|
|
46
|
+
isDownload?: boolean;
|
|
40
47
|
}
|
|
41
48
|
|
|
42
|
-
export { IImgToPdfConfig, imgToPdf };
|
|
49
|
+
export { IImgToPdfConfig, IPdfConfig, IPdfDownloadConfig, imgToPdf };
|
package/dist/es/pdf.js
CHANGED
|
@@ -1,69 +1,79 @@
|
|
|
1
|
+
import { __awaiter, __generator } from './_virtual/_tslib.js';
|
|
1
2
|
import { jsPDF } from 'jspdf';
|
|
3
|
+
import dayjs from 'dayjs';
|
|
2
4
|
|
|
3
|
-
/**
|
|
4
|
-
* 图片 转 pdf
|
|
5
|
-
*/
|
|
6
5
|
function imgToPdf(config) {
|
|
6
|
+
var images = config.images, _a = config.leftPadding, leftPadding = _a === void 0 ? 20 : _a, pdfConfig = config.pdfConfig, pdfDownloadConfig = config.pdfDownloadConfig, waterConfig = config.waterConfig;
|
|
7
|
+
var _b = pdfDownloadConfig || {}, isDownload = _b.isDownload, pdfName = _b.pdfName;
|
|
8
|
+
if (Array.isArray(images)) {
|
|
9
|
+
// 合并成一个pdf导出
|
|
10
|
+
// 解析pdf参数
|
|
11
|
+
var resultPdfConfig = parsePdfConfig(pdfConfig);
|
|
12
|
+
var _c = resultPdfConfig.format, pdfWidth_1 = _c[0], pdfHeight_1 = _c[1];
|
|
13
|
+
// 创建一个新的jsPDF实例
|
|
14
|
+
var pdf_1 = new jsPDF(resultPdfConfig);
|
|
15
|
+
return (function () {
|
|
16
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
17
|
+
var i, _i, images_1, canvasPromise, canvas, canvasWidth, canvasHeight;
|
|
18
|
+
return __generator(this, function (_a) {
|
|
19
|
+
switch (_a.label) {
|
|
20
|
+
case 0:
|
|
21
|
+
i = 0;
|
|
22
|
+
_i = 0, images_1 = images;
|
|
23
|
+
_a.label = 1;
|
|
24
|
+
case 1:
|
|
25
|
+
if (!(_i < images_1.length)) return [3 /*break*/, 4];
|
|
26
|
+
canvasPromise = images_1[_i];
|
|
27
|
+
i++;
|
|
28
|
+
return [4 /*yield*/, canvasPromise];
|
|
29
|
+
case 2:
|
|
30
|
+
canvas = _a.sent();
|
|
31
|
+
canvasWidth = canvas.width;
|
|
32
|
+
canvasHeight = canvas.height;
|
|
33
|
+
insertImgToPdf(pdf_1, pdfWidth_1, pdfHeight_1, {
|
|
34
|
+
imageConfig: {
|
|
35
|
+
image: canvas,
|
|
36
|
+
width: canvasWidth,
|
|
37
|
+
height: canvasHeight,
|
|
38
|
+
},
|
|
39
|
+
leftPadding: leftPadding,
|
|
40
|
+
waterConfig: waterConfig,
|
|
41
|
+
});
|
|
42
|
+
// 继续分页
|
|
43
|
+
if (i < images.length) {
|
|
44
|
+
pdf_1.addPage();
|
|
45
|
+
}
|
|
46
|
+
_a.label = 3;
|
|
47
|
+
case 3:
|
|
48
|
+
_i++;
|
|
49
|
+
return [3 /*break*/, 1];
|
|
50
|
+
case 4:
|
|
51
|
+
if (isDownload) {
|
|
52
|
+
pdf_1.save("".concat(pdfName || dayjs().format("YYYY-MM-DD"), ".pdf"));
|
|
53
|
+
}
|
|
54
|
+
return [2 /*return*/, Promise.resolve(pdf_1)];
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
})();
|
|
59
|
+
}
|
|
60
|
+
var image = images.image, width = images.width, height = images.height;
|
|
7
61
|
return new Promise(function (resolve, reject) {
|
|
8
|
-
var _a;
|
|
9
62
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
// 如果是横向的话,需要转换下宽高的位置
|
|
14
|
-
if (orientation_1 === "l") {
|
|
15
|
-
_a = [pdfHeight, pdfWidth], pdfWidth = _a[0], pdfHeight = _a[1];
|
|
16
|
-
}
|
|
17
|
-
var unit = config.unit || "pt";
|
|
18
|
-
// 缩放图片 以适应PDF页面宽度
|
|
19
|
-
var canvasWidth = width; // 图片原始宽度
|
|
20
|
-
var canvasHeight = height; // 图片原始高度
|
|
63
|
+
// 解析pdf参数
|
|
64
|
+
var resultPdfConfig = parsePdfConfig(pdfConfig);
|
|
65
|
+
var _a = resultPdfConfig.format, pdfWidth = _a[0], pdfHeight = _a[1];
|
|
21
66
|
// 创建一个新的jsPDF实例
|
|
22
|
-
var pdf = new jsPDF(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
67
|
+
var pdf = new jsPDF(resultPdfConfig);
|
|
68
|
+
insertImgToPdf(pdf, pdfWidth, pdfHeight, {
|
|
69
|
+
imageConfig: {
|
|
70
|
+
image: image,
|
|
71
|
+
width: width,
|
|
72
|
+
height: height,
|
|
73
|
+
},
|
|
74
|
+
leftPadding: leftPadding,
|
|
75
|
+
waterConfig: waterConfig,
|
|
29
76
|
});
|
|
30
|
-
// 一页pdf能显示的canvas高度
|
|
31
|
-
var pageHeight = (canvasWidth / pdfWidth) * pdfHeight;
|
|
32
|
-
// 将绘制图片的宽度 设置 成pdf的宽度 (减去偏移)
|
|
33
|
-
var imgWidth = pdfWidth - leftPadding;
|
|
34
|
-
// 等比例换算绘制图片高度
|
|
35
|
-
var imgHeight = (imgWidth / canvasWidth) * canvasHeight;
|
|
36
|
-
// 需要打印的图片总高度,初始状态和图片高度相等
|
|
37
|
-
var totalHeight = canvasHeight;
|
|
38
|
-
if (totalHeight < pageHeight) {
|
|
39
|
-
pdf.addImage(image, "JPEG", leftPadding, 0, imgWidth, imgHeight);
|
|
40
|
-
// 添加水印
|
|
41
|
-
if (waterConfig) {
|
|
42
|
-
addImageWater(pdf, waterConfig.image, {
|
|
43
|
-
width: waterConfig.width,
|
|
44
|
-
height: waterConfig.height,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
var position = 0;
|
|
50
|
-
while (totalHeight > 0) {
|
|
51
|
-
pdf.addImage(image, "JPEG", leftPadding, position, imgWidth, imgHeight);
|
|
52
|
-
// 添加水印
|
|
53
|
-
if (waterConfig) {
|
|
54
|
-
addImageWater(pdf, waterConfig.image, {
|
|
55
|
-
width: waterConfig.width,
|
|
56
|
-
height: waterConfig.height,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
totalHeight -= pageHeight;
|
|
60
|
-
//避免添加空白页
|
|
61
|
-
position -= pdfHeight;
|
|
62
|
-
if (totalHeight > 0) {
|
|
63
|
-
pdf.addPage();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
77
|
if (isDownload) {
|
|
68
78
|
pdf.save("".concat(pdfName, ".pdf"));
|
|
69
79
|
}
|
|
@@ -74,6 +84,7 @@ function imgToPdf(config) {
|
|
|
74
84
|
}
|
|
75
85
|
});
|
|
76
86
|
}
|
|
87
|
+
// 解析format 为数值
|
|
77
88
|
function parsePdfFormat(format) {
|
|
78
89
|
if (format === "a4") {
|
|
79
90
|
return [595.28, 841.89];
|
|
@@ -84,6 +95,70 @@ function parsePdfFormat(format) {
|
|
|
84
95
|
// 默认返回a4的数值
|
|
85
96
|
return [595.28, 841.89];
|
|
86
97
|
}
|
|
98
|
+
// 解析pdf实例化参数
|
|
99
|
+
function parsePdfConfig(pdfConfig) {
|
|
100
|
+
var _a;
|
|
101
|
+
var _b = pdfConfig || {}, _c = _b.compress, compress = _c === void 0 ? true : _c, _d = _b.orientation, orientation = _d === void 0 ? "p" : _d, _e = _b.format, format = _e === void 0 ? "a4" : _e, _f = _b.unit, unit = _f === void 0 ? "pt" : _f;
|
|
102
|
+
// 单位转换
|
|
103
|
+
var _g = parsePdfFormat(format), pdfWidth = _g[0], pdfHeight = _g[1];
|
|
104
|
+
// 如果是横向的话,需要转换下宽高的位置
|
|
105
|
+
if (orientation === "l") {
|
|
106
|
+
_a = [pdfHeight, pdfWidth], pdfWidth = _a[0], pdfHeight = _a[1];
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
// 方向 l:横向 p:纵向
|
|
110
|
+
orientation: orientation,
|
|
111
|
+
// 单位
|
|
112
|
+
unit: unit,
|
|
113
|
+
format: [pdfWidth, pdfHeight],
|
|
114
|
+
compress: compress,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// 将图片插入pdf中
|
|
118
|
+
function insertImgToPdf(pdf, pdfWidth, pdfHeight, config) {
|
|
119
|
+
var imageConfig = config.imageConfig, _a = config.leftPadding, leftPadding = _a === void 0 ? 20 : _a, waterConfig = config.waterConfig;
|
|
120
|
+
var image = imageConfig.image, width = imageConfig.width, height = imageConfig.height;
|
|
121
|
+
// 缩放图片 以适应PDF页面宽度
|
|
122
|
+
var canvasWidth = width; // 图片原始宽度
|
|
123
|
+
var canvasHeight = height; // 图片原始高度
|
|
124
|
+
// 一页pdf能显示的canvas高度
|
|
125
|
+
var pageHeight = (canvasWidth / pdfWidth) * pdfHeight;
|
|
126
|
+
// 将绘制图片的宽度 设置 成pdf的宽度 (减去偏移)
|
|
127
|
+
var imgWidth = pdfWidth - leftPadding;
|
|
128
|
+
// 等比例换算绘制图片高度
|
|
129
|
+
var imgHeight = (imgWidth / canvasWidth) * canvasHeight;
|
|
130
|
+
// 需要打印的图片总高度,初始状态和图片高度相等
|
|
131
|
+
var totalHeight = canvasHeight;
|
|
132
|
+
if (totalHeight < pageHeight) {
|
|
133
|
+
pdf.addImage(image, "JPEG", leftPadding, 0, imgWidth, imgHeight);
|
|
134
|
+
// 添加水印
|
|
135
|
+
if (waterConfig) {
|
|
136
|
+
addImageWater(pdf, waterConfig.image, {
|
|
137
|
+
width: waterConfig.width,
|
|
138
|
+
height: waterConfig.height,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
var position = 0;
|
|
144
|
+
while (totalHeight > 0) {
|
|
145
|
+
pdf.addImage(image, "JPEG", leftPadding, position, imgWidth, imgHeight);
|
|
146
|
+
// 添加水印
|
|
147
|
+
if (waterConfig) {
|
|
148
|
+
addImageWater(pdf, waterConfig.image, {
|
|
149
|
+
width: waterConfig.width,
|
|
150
|
+
height: waterConfig.height,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
totalHeight -= pageHeight;
|
|
154
|
+
//避免添加空白页
|
|
155
|
+
position -= pdfHeight;
|
|
156
|
+
if (totalHeight > 0) {
|
|
157
|
+
pdf.addPage();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
87
162
|
/**
|
|
88
163
|
* 给PDF添加图片水印
|
|
89
164
|
*/
|
|
@@ -98,4 +173,4 @@ function addImageWater(pdf, imgData, options) {
|
|
|
98
173
|
}
|
|
99
174
|
}
|
|
100
175
|
|
|
101
|
-
export { addImageWater, imgToPdf };
|
|
176
|
+
export { addImageWater, imgToPdf, insertImgToPdf, parsePdfConfig, parsePdfFormat };
|
package/dist/es/water.js
CHANGED
|
@@ -72,6 +72,13 @@ function getDefaultContent() {
|
|
|
72
72
|
if (typeof jwtInfo === "object" && jwtInfo != null) {
|
|
73
73
|
var username = jwtInfo.real_name || jwtInfo.realName || "";
|
|
74
74
|
var phone = jwtInfo.phone || "";
|
|
75
|
+
var phoneLen = phone.length;
|
|
76
|
+
if (phoneLen <= 4) {
|
|
77
|
+
phone = phone;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
phone = phone.slice(phoneLen - 4);
|
|
81
|
+
}
|
|
75
82
|
var time = dayjs().format("YYMMDD");
|
|
76
83
|
return ["".concat(username, " ").concat(phone), time];
|
|
77
84
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,5 +15,6 @@ export { BASIC_KEY, EMITTER_CCP_KEY, EMITTER_PCC_KEY, EMITTER_TYPE, TOKEN_KEY }
|
|
|
15
15
|
export { convert, html, match, pinyin } from 'pinyin-pro';
|
|
16
16
|
export { domToCanvas } from './es/canvas.js';
|
|
17
17
|
export { imgToPdf } from './es/pdf.js';
|
|
18
|
+
export { htmlToPdf } from './es/htmlToPdf.js';
|
|
18
19
|
export { htmlPrint, imgPrint, pdfPrint, windowPrint } from './es/print.js';
|
|
19
20
|
export { createWater, getDefaultContent, mergeWaterConfig } from './es/water.js';
|
package/dist/index.js
CHANGED
|
@@ -15,5 +15,6 @@ export { BASIC_KEY, EMITTER_CCP_KEY, EMITTER_PCC_KEY, EMITTER_TYPE, TOKEN_KEY }
|
|
|
15
15
|
export { convert, html, match, pinyin } from './es/node_modules/pinyin-pro/dist/index.js';
|
|
16
16
|
export { domToCanvas } from './es/canvas.js';
|
|
17
17
|
export { imgToPdf } from './es/pdf.js';
|
|
18
|
+
export { htmlToPdf } from './es/htmlToPdf.js';
|
|
18
19
|
export { htmlPrint, imgPrint, pdfPrint, windowPrint } from './es/print.js';
|
|
19
20
|
export { createWater, getDefaultContent, mergeWaterConfig } from './es/water.js';
|
package/package.json
CHANGED
package/src/htmlToPdf.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import { IImgToPdfConfig, imgToPdf } from "./pdf";
|
|
3
|
+
import { domToCanvas } from "./canvas";
|
|
4
|
+
|
|
5
|
+
interface IConfig {
|
|
6
|
+
/** 容器,从哪个容器里面找需要转换的元素 */
|
|
7
|
+
container?: HTMLElement;
|
|
8
|
+
/**
|
|
9
|
+
* 需要转换的dom 可以是一个字符串
|
|
10
|
+
* 如果是字符串的话 那么就是通过querySelectorAll的形式查找
|
|
11
|
+
* 如果是一个dom实例
|
|
12
|
+
* 如果是多个dom实例
|
|
13
|
+
**/
|
|
14
|
+
pageDom?: string | HTMLElement | HTMLElement[];
|
|
15
|
+
/**
|
|
16
|
+
* 是否使用canvas直接转
|
|
17
|
+
*/
|
|
18
|
+
useCanvas?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* 是否生成多份PDF
|
|
21
|
+
*/
|
|
22
|
+
isMultiple?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* pdf名称 默认取dom元素配置的 data-title属性
|
|
25
|
+
*/
|
|
26
|
+
pdfName?: string;
|
|
27
|
+
/**
|
|
28
|
+
* pdf相关配置
|
|
29
|
+
*/
|
|
30
|
+
pdfConfig?: IImgToPdfConfig["pdfConfig"];
|
|
31
|
+
/**
|
|
32
|
+
* 是否下载pdf
|
|
33
|
+
*/
|
|
34
|
+
isDownload?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* 水印相关
|
|
37
|
+
*/
|
|
38
|
+
waterConfig?: IImgToPdfConfig["waterConfig"];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function htmlToPdf(config: IConfig) {
|
|
42
|
+
const {
|
|
43
|
+
container,
|
|
44
|
+
pageDom,
|
|
45
|
+
useCanvas = true,
|
|
46
|
+
isMultiple,
|
|
47
|
+
pdfConfig,
|
|
48
|
+
pdfName,
|
|
49
|
+
isDownload,
|
|
50
|
+
waterConfig,
|
|
51
|
+
} = config;
|
|
52
|
+
// 找到需要转换的dom
|
|
53
|
+
let domList: any;
|
|
54
|
+
if (typeof pageDom === "string") {
|
|
55
|
+
domList = container
|
|
56
|
+
? container.querySelectorAll(pageDom)
|
|
57
|
+
: document.body.querySelectorAll(pageDom);
|
|
58
|
+
domList = Array.from(domList);
|
|
59
|
+
} else {
|
|
60
|
+
domList = Array.isArray(pageDom) ? pageDom : [pageDom];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (domList.length === 0) {
|
|
64
|
+
return Promise.reject("没有可以导出的元素!");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!useCanvas) {
|
|
68
|
+
// 直接导出html 待实现
|
|
69
|
+
return Promise.resolve();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 通过html => canvas => pdf 的形式导出
|
|
73
|
+
|
|
74
|
+
// 多份导出
|
|
75
|
+
if (isMultiple) {
|
|
76
|
+
let promiseArr: any = [];
|
|
77
|
+
domList.forEach((domItem: HTMLElement, index: number) => {
|
|
78
|
+
const dataTitle =
|
|
79
|
+
domItem.dataset.title || `${dayjs().format("YYYY-MM-DD")}-${index + 1}`;
|
|
80
|
+
const item = domToCanvas(domItem).then(async (canvas) => {
|
|
81
|
+
// 计算canvas的宽度和高度转换为PDF的宽度和高度
|
|
82
|
+
const canvasWidth = canvas.width;
|
|
83
|
+
const canvasHeight = canvas.height;
|
|
84
|
+
const pdf = await imgToPdf({
|
|
85
|
+
images: {
|
|
86
|
+
image: canvas,
|
|
87
|
+
width: canvasWidth,
|
|
88
|
+
height: canvasHeight,
|
|
89
|
+
},
|
|
90
|
+
pdfConfig,
|
|
91
|
+
pdfDownloadConfig: {
|
|
92
|
+
isDownload,
|
|
93
|
+
pdfName: pdfName ? pdfName : dataTitle,
|
|
94
|
+
},
|
|
95
|
+
waterConfig,
|
|
96
|
+
});
|
|
97
|
+
return pdf;
|
|
98
|
+
});
|
|
99
|
+
promiseArr.push(item);
|
|
100
|
+
});
|
|
101
|
+
return Promise.all(promiseArr);
|
|
102
|
+
} else {
|
|
103
|
+
// 创建canvas组
|
|
104
|
+
let promiseArr: any = domList.map((domItem: HTMLElement, index: number) => {
|
|
105
|
+
return domToCanvas(domItem);
|
|
106
|
+
});
|
|
107
|
+
const dataTitle =
|
|
108
|
+
domList[0].dataset.title || `${dayjs().format("YYYY-MM-DD")}`;
|
|
109
|
+
// 合并成一个pdf导出
|
|
110
|
+
return imgToPdf({
|
|
111
|
+
images: promiseArr,
|
|
112
|
+
pdfConfig,
|
|
113
|
+
pdfDownloadConfig: {
|
|
114
|
+
isDownload,
|
|
115
|
+
pdfName: pdfName ? pdfName : dataTitle,
|
|
116
|
+
},
|
|
117
|
+
waterConfig,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
package/src/index.ts
CHANGED
package/src/pdf.ts
CHANGED
|
@@ -1,89 +1,68 @@
|
|
|
1
1
|
import { RGBAData, jsPDF } from "jspdf";
|
|
2
|
+
import dayjs from "dayjs";
|
|
2
3
|
import { IWaterResult } from "./water";
|
|
3
4
|
|
|
4
|
-
/**
|
|
5
|
-
* 图片 转 pdf
|
|
6
|
-
*/
|
|
7
5
|
export function imgToPdf(config: IImgToPdfConfig) {
|
|
6
|
+
const {
|
|
7
|
+
images,
|
|
8
|
+
leftPadding = 20,
|
|
9
|
+
pdfConfig,
|
|
10
|
+
pdfDownloadConfig,
|
|
11
|
+
waterConfig,
|
|
12
|
+
} = config;
|
|
13
|
+
const { isDownload, pdfName } = pdfDownloadConfig || {};
|
|
14
|
+
if (Array.isArray(images)) {
|
|
15
|
+
// 合并成一个pdf导出
|
|
16
|
+
// 解析pdf参数
|
|
17
|
+
const resultPdfConfig = parsePdfConfig(pdfConfig);
|
|
18
|
+
const [pdfWidth, pdfHeight] = resultPdfConfig.format;
|
|
19
|
+
// 创建一个新的jsPDF实例
|
|
20
|
+
const pdf = new jsPDF(resultPdfConfig);
|
|
21
|
+
return (async function () {
|
|
22
|
+
let i = 0;
|
|
23
|
+
for (const canvasPromise of images) {
|
|
24
|
+
i++;
|
|
25
|
+
const canvas = await canvasPromise;
|
|
26
|
+
const canvasWidth = canvas.width;
|
|
27
|
+
const canvasHeight = canvas.height;
|
|
28
|
+
insertImgToPdf(pdf, pdfWidth, pdfHeight, {
|
|
29
|
+
imageConfig: {
|
|
30
|
+
image: canvas,
|
|
31
|
+
width: canvasWidth,
|
|
32
|
+
height: canvasHeight,
|
|
33
|
+
},
|
|
34
|
+
leftPadding,
|
|
35
|
+
waterConfig,
|
|
36
|
+
});
|
|
37
|
+
// 继续分页
|
|
38
|
+
if (i < images.length) {
|
|
39
|
+
pdf.addPage();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (isDownload) {
|
|
43
|
+
pdf.save(`${pdfName || dayjs().format("YYYY-MM-DD")}.pdf`);
|
|
44
|
+
}
|
|
45
|
+
return Promise.resolve(pdf);
|
|
46
|
+
})();
|
|
47
|
+
}
|
|
48
|
+
const { image, width, height } = images;
|
|
8
49
|
return new Promise((resolve, reject) => {
|
|
9
50
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
height,
|
|
14
|
-
leftPadding = 20,
|
|
15
|
-
compress = true,
|
|
16
|
-
orientation = "p",
|
|
17
|
-
format = "a4",
|
|
18
|
-
pdfName,
|
|
19
|
-
waterConfig,
|
|
20
|
-
isDownload,
|
|
21
|
-
} = config;
|
|
22
|
-
|
|
23
|
-
// 单位转换
|
|
24
|
-
let [pdfWidth, pdfHeight] = parsePdfFormat(format);
|
|
25
|
-
// 如果是横向的话,需要转换下宽高的位置
|
|
26
|
-
if (orientation === "l") {
|
|
27
|
-
[pdfWidth, pdfHeight] = [pdfHeight, pdfWidth];
|
|
28
|
-
}
|
|
29
|
-
const unit = config.unit || "pt";
|
|
30
|
-
|
|
31
|
-
// 缩放图片 以适应PDF页面宽度
|
|
32
|
-
const canvasWidth = width; // 图片原始宽度
|
|
33
|
-
const canvasHeight = height; // 图片原始高度
|
|
34
|
-
|
|
51
|
+
// 解析pdf参数
|
|
52
|
+
const resultPdfConfig = parsePdfConfig(pdfConfig);
|
|
53
|
+
const [pdfWidth, pdfHeight] = resultPdfConfig.format;
|
|
35
54
|
// 创建一个新的jsPDF实例
|
|
36
|
-
const pdf = new jsPDF(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
55
|
+
const pdf = new jsPDF(resultPdfConfig);
|
|
56
|
+
|
|
57
|
+
insertImgToPdf(pdf, pdfWidth, pdfHeight, {
|
|
58
|
+
imageConfig: {
|
|
59
|
+
image,
|
|
60
|
+
width,
|
|
61
|
+
height,
|
|
62
|
+
},
|
|
63
|
+
leftPadding,
|
|
64
|
+
waterConfig,
|
|
43
65
|
});
|
|
44
|
-
// 一页pdf能显示的canvas高度
|
|
45
|
-
let pageHeight = (canvasWidth / pdfWidth) * pdfHeight;
|
|
46
|
-
// 将绘制图片的宽度 设置 成pdf的宽度 (减去偏移)
|
|
47
|
-
let imgWidth = pdfWidth - leftPadding;
|
|
48
|
-
// 等比例换算绘制图片高度
|
|
49
|
-
let imgHeight = (imgWidth / canvasWidth) * canvasHeight;
|
|
50
|
-
// 需要打印的图片总高度,初始状态和图片高度相等
|
|
51
|
-
let totalHeight = canvasHeight;
|
|
52
|
-
if (totalHeight < pageHeight) {
|
|
53
|
-
pdf.addImage(image, "JPEG", leftPadding, 0, imgWidth, imgHeight);
|
|
54
|
-
// 添加水印
|
|
55
|
-
if (waterConfig) {
|
|
56
|
-
addImageWater(pdf, waterConfig.image, {
|
|
57
|
-
width: waterConfig.width,
|
|
58
|
-
height: waterConfig.height,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
} else {
|
|
62
|
-
let position = 0;
|
|
63
|
-
while (totalHeight > 0) {
|
|
64
|
-
pdf.addImage(
|
|
65
|
-
image,
|
|
66
|
-
"JPEG",
|
|
67
|
-
leftPadding,
|
|
68
|
-
position,
|
|
69
|
-
imgWidth,
|
|
70
|
-
imgHeight
|
|
71
|
-
);
|
|
72
|
-
// 添加水印
|
|
73
|
-
if (waterConfig) {
|
|
74
|
-
addImageWater(pdf, waterConfig.image, {
|
|
75
|
-
width: waterConfig.width,
|
|
76
|
-
height: waterConfig.height,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
totalHeight -= pageHeight;
|
|
80
|
-
//避免添加空白页
|
|
81
|
-
position -= pdfHeight;
|
|
82
|
-
if (totalHeight > 0) {
|
|
83
|
-
pdf.addPage();
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
66
|
if (isDownload) {
|
|
88
67
|
pdf.save(`${pdfName}.pdf`);
|
|
89
68
|
}
|
|
@@ -93,7 +72,8 @@ export function imgToPdf(config: IImgToPdfConfig) {
|
|
|
93
72
|
}
|
|
94
73
|
});
|
|
95
74
|
}
|
|
96
|
-
|
|
75
|
+
// 解析format 为数值
|
|
76
|
+
export function parsePdfFormat(format: IPdfConfig["format"]) {
|
|
97
77
|
if (format === "a4") {
|
|
98
78
|
return [595.28, 841.89];
|
|
99
79
|
}
|
|
@@ -103,6 +83,84 @@ function parsePdfFormat(format: IImgToPdfConfig["format"]) {
|
|
|
103
83
|
// 默认返回a4的数值
|
|
104
84
|
return [595.28, 841.89];
|
|
105
85
|
}
|
|
86
|
+
// 解析pdf实例化参数
|
|
87
|
+
export function parsePdfConfig(pdfConfig?: IPdfConfig) {
|
|
88
|
+
const {
|
|
89
|
+
compress = true,
|
|
90
|
+
orientation = "p",
|
|
91
|
+
format = "a4",
|
|
92
|
+
unit = "pt",
|
|
93
|
+
} = pdfConfig || {};
|
|
94
|
+
// 单位转换
|
|
95
|
+
let [pdfWidth, pdfHeight] = parsePdfFormat(format);
|
|
96
|
+
// 如果是横向的话,需要转换下宽高的位置
|
|
97
|
+
if (orientation === "l") {
|
|
98
|
+
[pdfWidth, pdfHeight] = [pdfHeight, pdfWidth];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
// 方向 l:横向 p:纵向
|
|
103
|
+
orientation,
|
|
104
|
+
// 单位
|
|
105
|
+
unit,
|
|
106
|
+
format: [pdfWidth, pdfHeight],
|
|
107
|
+
compress,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// 将图片插入pdf中
|
|
111
|
+
export function insertImgToPdf(
|
|
112
|
+
pdf: any,
|
|
113
|
+
pdfWidth: number,
|
|
114
|
+
pdfHeight: number,
|
|
115
|
+
config: {
|
|
116
|
+
imageConfig: IIMageConfig;
|
|
117
|
+
leftPadding?: number;
|
|
118
|
+
waterConfig?: IWaterResult;
|
|
119
|
+
}
|
|
120
|
+
) {
|
|
121
|
+
const { imageConfig, leftPadding = 20, waterConfig } = config;
|
|
122
|
+
const { image, width, height } = imageConfig;
|
|
123
|
+
// 缩放图片 以适应PDF页面宽度
|
|
124
|
+
const canvasWidth = width; // 图片原始宽度
|
|
125
|
+
const canvasHeight = height; // 图片原始高度
|
|
126
|
+
|
|
127
|
+
// 一页pdf能显示的canvas高度
|
|
128
|
+
let pageHeight = (canvasWidth / pdfWidth) * pdfHeight;
|
|
129
|
+
// 将绘制图片的宽度 设置 成pdf的宽度 (减去偏移)
|
|
130
|
+
let imgWidth = pdfWidth - leftPadding;
|
|
131
|
+
// 等比例换算绘制图片高度
|
|
132
|
+
let imgHeight = (imgWidth / canvasWidth) * canvasHeight;
|
|
133
|
+
// 需要打印的图片总高度,初始状态和图片高度相等
|
|
134
|
+
let totalHeight = canvasHeight;
|
|
135
|
+
if (totalHeight < pageHeight) {
|
|
136
|
+
pdf.addImage(image, "JPEG", leftPadding, 0, imgWidth, imgHeight);
|
|
137
|
+
// 添加水印
|
|
138
|
+
if (waterConfig) {
|
|
139
|
+
addImageWater(pdf, waterConfig.image, {
|
|
140
|
+
width: waterConfig.width,
|
|
141
|
+
height: waterConfig.height,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
} else {
|
|
145
|
+
let position = 0;
|
|
146
|
+
while (totalHeight > 0) {
|
|
147
|
+
pdf.addImage(image, "JPEG", leftPadding, position, imgWidth, imgHeight);
|
|
148
|
+
// 添加水印
|
|
149
|
+
if (waterConfig) {
|
|
150
|
+
addImageWater(pdf, waterConfig.image, {
|
|
151
|
+
width: waterConfig.width,
|
|
152
|
+
height: waterConfig.height,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
totalHeight -= pageHeight;
|
|
156
|
+
//避免添加空白页
|
|
157
|
+
position -= pdfHeight;
|
|
158
|
+
if (totalHeight > 0) {
|
|
159
|
+
pdf.addPage();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
106
164
|
|
|
107
165
|
/**
|
|
108
166
|
* 给PDF添加图片水印
|
|
@@ -122,15 +180,32 @@ export function addImageWater(
|
|
|
122
180
|
}
|
|
123
181
|
}
|
|
124
182
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
183
|
+
type IImage =
|
|
184
|
+
| string
|
|
185
|
+
| HTMLImageElement
|
|
186
|
+
| HTMLCanvasElement
|
|
187
|
+
| Uint8Array
|
|
188
|
+
| RGBAData;
|
|
189
|
+
interface IIMageConfig {
|
|
190
|
+
image: IImage;
|
|
128
191
|
width: number;
|
|
129
192
|
height: number;
|
|
130
|
-
|
|
131
|
-
|
|
193
|
+
}
|
|
194
|
+
export interface IImgToPdfConfig {
|
|
195
|
+
/** 图片 base64字符串 */
|
|
196
|
+
images: IIMageConfig | any[];
|
|
132
197
|
/** 生成的pdf左边距 */
|
|
133
198
|
leftPadding?: number;
|
|
199
|
+
pdfConfig?: IPdfConfig;
|
|
200
|
+
pdfDownloadConfig?: IPdfDownloadConfig;
|
|
201
|
+
/**
|
|
202
|
+
* 水印相关信息
|
|
203
|
+
*/
|
|
204
|
+
waterConfig?: IWaterResult;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// pdf配置
|
|
208
|
+
export interface IPdfConfig {
|
|
134
209
|
/** 导出pdf单位 */
|
|
135
210
|
unit?: "pt" | "mm";
|
|
136
211
|
/**
|
|
@@ -146,12 +221,14 @@ export interface IImgToPdfConfig {
|
|
|
146
221
|
* 生成的pdf是否压缩
|
|
147
222
|
*/
|
|
148
223
|
compress?: boolean;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// pdf下载相关配置
|
|
227
|
+
export interface IPdfDownloadConfig {
|
|
149
228
|
/**
|
|
150
229
|
* 生成pdf的名称
|
|
151
230
|
*/
|
|
152
231
|
pdfName?: string;
|
|
153
|
-
/**
|
|
154
|
-
|
|
155
|
-
*/
|
|
156
|
-
waterConfig?: IWaterResult;
|
|
232
|
+
/** 是否直接下载pdf */
|
|
233
|
+
isDownload?: boolean;
|
|
157
234
|
}
|
package/src/water.ts
CHANGED
|
@@ -78,7 +78,13 @@ export function getDefaultContent() {
|
|
|
78
78
|
const jwtInfo: any = parseToken();
|
|
79
79
|
if (typeof jwtInfo === "object" && jwtInfo != null) {
|
|
80
80
|
const username = jwtInfo.real_name || jwtInfo.realName || "";
|
|
81
|
-
|
|
81
|
+
let phone = jwtInfo.phone || "";
|
|
82
|
+
const phoneLen = phone.length;
|
|
83
|
+
if (phoneLen <= 4) {
|
|
84
|
+
phone = phone;
|
|
85
|
+
} else {
|
|
86
|
+
phone = phone.slice(phoneLen - 4);
|
|
87
|
+
}
|
|
82
88
|
const time = dayjs().format("YYMMDD");
|
|
83
89
|
return [`${username} ${phone}`, time];
|
|
84
90
|
}
|