Skip to content

Commit 1b82da5

Browse files
committed
feat(new tool): PDF Encrypt
PDF Encrypter
1 parent 23b4dc8 commit 1b82da5

File tree

8 files changed

+1583
-149
lines changed

8 files changed

+1583
-149
lines changed

.eslintrc.cjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
module.exports = {
55
root: true,
66
extends: ['@antfu', './.eslintrc-auto-import.json', '@unocss'],
7+
8+
ignorePatterns: ['src/libs/*'],
79

810
rules: {
911
'curly': ['error', 'all'],

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
"@tiptap/pm": "2.1.6",
4242
"@tiptap/starter-kit": "2.1.6",
4343
"@tiptap/vue-3": "2.0.3",
44-
"@types/figlet": "^1.5.8",
4544
"@types/emscripten": "^1.39.10",
45+
"@types/figlet": "^1.5.8",
4646
"@vicons/material": "^0.12.0",
4747
"@vicons/tabler": "^0.12.0",
4848
"@vueuse/core": "^10.3.0",
@@ -65,6 +65,7 @@
6565
"highlight.js": "^11.7.0",
6666
"iarna-toml-esm": "^3.0.5",
6767
"ibantools": "^4.3.3",
68+
"js-base64": "^3.7.7",
6869
"json5": "^2.2.3",
6970
"jwt-decode": "^3.1.2",
7071
"libphonenumber-js": "^1.10.28",

pnpm-lock.yaml

Lines changed: 20 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/composable/downloadBase64.ts

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import { extension as getExtensionFromMime } from 'mime-types';
1+
import { extension as getExtensionFromMimeType, extension as getMimeTypeFromExtension } from 'mime-types';
22
import type { Ref } from 'vue';
33
import _ from 'lodash';
44

5-
export { getMimeTypeFromBase64, useDownloadFileFromBase64 };
5+
export {
6+
getMimeTypeFromBase64,
7+
getMimeTypeFromExtension, getExtensionFromMimeType,
8+
useDownloadFileFromBase64, useDownloadFileFromBase64Refs,
9+
};
610

711
const commonMimeTypesSignatures = {
812
'JVBERi0': 'application/pdf',
@@ -36,30 +40,55 @@ function getFileExtensionFromMimeType({
3640
defaultExtension?: string
3741
}) {
3842
if (mimeType) {
39-
return getExtensionFromMime(mimeType) ?? defaultExtension;
43+
return getExtensionFromMimeType(mimeType) ?? defaultExtension;
4044
}
4145

4246
return defaultExtension;
4347
}
4448

45-
function useDownloadFileFromBase64({ source, filename }: { source: Ref<string>; filename?: string }) {
46-
return {
47-
download() {
48-
if (source.value === '') {
49-
throw new Error('Base64 string is empty');
50-
}
49+
function downloadFromBase64({ sourceValue, filename, extension, fileMimeType }:
50+
{ sourceValue: string; filename?: string; extension?: string; fileMimeType?: string }) {
51+
if (sourceValue === '') {
52+
throw new Error('Base64 string is empty');
53+
}
54+
55+
const defaultExtension = extension ?? 'txt';
56+
const { mimeType } = getMimeTypeFromBase64({ base64String: sourceValue });
57+
let base64String = sourceValue;
58+
if (!mimeType) {
59+
const targetMimeType = fileMimeType ?? getMimeTypeFromExtension(defaultExtension);
60+
base64String = `data:${targetMimeType};base64,${sourceValue}`;
61+
}
62+
63+
const cleanExtension = extension ?? getFileExtensionFromMimeType(
64+
{ mimeType, defaultExtension });
65+
let cleanFileName = filename ?? `file.${cleanExtension}`;
66+
if (extension && !cleanFileName.endsWith(`.${extension}`)) {
67+
cleanFileName = `${cleanFileName}.${cleanExtension}`;
68+
}
5169

52-
const { mimeType } = getMimeTypeFromBase64({ base64String: source.value });
53-
const base64String = mimeType
54-
? source.value
55-
: `data:text/plain;base64,${source.value}`;
70+
const a = document.createElement('a');
71+
a.href = base64String;
72+
a.download = cleanFileName;
73+
a.click();
74+
}
5675

57-
const cleanFileName = filename ?? `file.${getFileExtensionFromMimeType({ mimeType })}`;
76+
function useDownloadFileFromBase64(
77+
{ source, filename, extension, fileMimeType }:
78+
{ source: Ref<string>; filename?: string; extension?: string; fileMimeType?: string }) {
79+
return {
80+
download() {
81+
downloadFromBase64({ sourceValue: source.value, filename, extension, fileMimeType });
82+
},
83+
};
84+
}
5885

59-
const a = document.createElement('a');
60-
a.href = base64String;
61-
a.download = cleanFileName;
62-
a.click();
86+
function useDownloadFileFromBase64Refs(
87+
{ source, filename, extension }:
88+
{ source: Ref<string>; filename?: Ref<string>; extension?: Ref<string> }) {
89+
return {
90+
download() {
91+
downloadFromBase64({ sourceValue: source.value, filename: filename?.value, extension: extension?.value });
6392
},
6493
};
6594
}

0 commit comments

Comments
 (0)