unknown преди 1 седмица
родител
ревизия
63937d6d41
променени са 3 файла, в които са добавени 265 реда и са изтрити 87 реда
  1. 90 70
      package-lock.json
  2. 2 0
      package.json
  3. 173 17
      src/components/UploadFile/src/useUpload.ts

+ 90 - 70
package-lock.json

@@ -58,6 +58,8 @@
         "min-dash": "^4.1.1",
         "mitt": "^3.0.1",
         "nprogress": "^0.2.0",
+        "pdf-lib": "^1.17.1",
+        "pdfjs-dist": "^4.8.69",
         "pinia": "^2.1.7",
         "pinia-plugin-persistedstate": "^3.2.1",
         "pinyin": "^4.0.0-alpha.2",
@@ -414,7 +416,6 @@
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz",
       "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.24.7",
@@ -2227,6 +2228,7 @@
       "resolved": "https://registry.npmmirror.com/@bpmn-io/cm-theme/-/cm-theme-0.1.0-alpha.2.tgz",
       "integrity": "sha512-ZILgiYzxk3KMvxplUXmdRFQo45/JehDPg5k9tWfehmzUOSE13ssyLPil8uCloMQnb3yyzyOWTjb/wzKXTHlFQw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/language": "^6.3.1",
         "@codemirror/view": "^6.5.1",
@@ -2261,6 +2263,7 @@
       "resolved": "https://registry.npmmirror.com/@bpmn-io/feel-editor/-/feel-editor-1.10.0.tgz",
       "integrity": "sha512-Unc4CSyMgDg5c2C3E3ehEbJZfyo5W9Zrq74C8cp7mjFbb3if6rTBaw3ZCZeiC06zsm881sI5P8zWHFdIhKo/vA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@bpmn-io/feel-lint": "^1.4.0",
         "@codemirror/autocomplete": "^6.16.2",
@@ -2282,6 +2285,7 @@
       "resolved": "https://registry.npmmirror.com/@bpmn-io/feel-lint/-/feel-lint-1.4.0.tgz",
       "integrity": "sha512-1bsdR/9vPD7RQVqWWPk0X0tpjLsYTDrCxIzOVtN/h32o4nPGl0dZBU5m07qaFUGD4wG3eOH4Qim1wexHG8YkBw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/language": "^6.10.8",
         "lezer-feel": "^1.7.0"
@@ -2314,6 +2318,7 @@
       "resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz",
       "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/language": "^6.0.0",
         "@codemirror/state": "^6.0.0",
@@ -2326,6 +2331,7 @@
       "resolved": "https://registry.npmmirror.com/@codemirror/commands/-/commands-6.8.0.tgz",
       "integrity": "sha512-q8VPEFaEP4ikSlt6ZxjB3zW72+7osfAYW9i8Zu943uqbKuz6utc1+F170hyLUCUltXORjQXRyYQNfkckzA/bPQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/language": "^6.0.0",
         "@codemirror/state": "^6.4.0",
@@ -2338,6 +2344,7 @@
       "resolved": "https://registry.npmmirror.com/@codemirror/language/-/language-6.10.8.tgz",
       "integrity": "sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/state": "^6.0.0",
         "@codemirror/view": "^6.23.0",
@@ -2352,6 +2359,7 @@
       "resolved": "https://registry.npmmirror.com/@codemirror/lint/-/lint-6.8.4.tgz",
       "integrity": "sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/state": "^6.0.0",
         "@codemirror/view": "^6.35.0",
@@ -2363,6 +2371,7 @@
       "resolved": "https://registry.npmmirror.com/@codemirror/state/-/state-6.5.2.tgz",
       "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@marijn/find-cluster-break": "^1.0.0"
       }
@@ -2372,6 +2381,7 @@
       "resolved": "https://registry.npmmirror.com/@codemirror/view/-/view-6.36.2.tgz",
       "integrity": "sha512-DZ6ONbs8qdJK0fdN7AB82CgI6tYXf4HWk1wSVa0+9bhVznCuuvhQtX8bFBoy3dv8rZSQqUd8GvhVAcielcidrA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/state": "^6.5.0",
         "style-mod": "^4.1.0",
@@ -2772,7 +2782,6 @@
           "url": "https://opencollective.com/csstools"
         }
       ],
-      "peer": true,
       "engines": {
         "node": "^14 || ^16 || >=18"
       },
@@ -2795,7 +2804,6 @@
           "url": "https://opencollective.com/csstools"
         }
       ],
-      "peer": true,
       "engines": {
         "node": "^14 || ^16 || >=18"
       }
@@ -3917,13 +3925,15 @@
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-1.2.3.tgz",
       "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/@lezer/highlight": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/@lezer/highlight/-/highlight-1.2.1.tgz",
       "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@lezer/common": "^1.0.0"
       }
@@ -3933,6 +3943,7 @@
       "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-1.4.2.tgz",
       "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@lezer/common": "^1.0.0"
       }
@@ -3942,6 +3953,7 @@
       "resolved": "https://registry.npmmirror.com/@lezer/markdown/-/markdown-1.4.1.tgz",
       "integrity": "sha512-Za5okfyWoNaX6sSZ2dm94XegaFXbkQ9UjKJ8hAoZX88XDpbu6DoR63IuSl+dqj1VkVQBQGsdr0JnTcMsogQDdw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@lezer/common": "^1.0.0",
         "@lezer/highlight": "^1.0.0",
@@ -3953,6 +3965,7 @@
       "resolved": "https://registry.npmmirror.com/@marijn/buildtool/-/buildtool-0.1.6.tgz",
       "integrity": "sha512-rcA2wljsM24MFAwx2U5vSBrt7IdIaPh4WPRfJPS8PuCUlbuQ8Pmky4c/ec00v3YFu90rZSbkVLnPuCeb/mUEng==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@types/mocha": "^9.1.1",
         "acorn": "^8.10.0",
@@ -3984,6 +3997,7 @@
       "resolved": "https://registry.npmmirror.com/rollup-plugin-dts/-/rollup-plugin-dts-5.3.1.tgz",
       "integrity": "sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "magic-string": "^0.30.2"
       },
@@ -4005,7 +4019,8 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz",
       "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/@microsoft/fetch-event-source": {
       "version": "2.0.1",
@@ -4049,6 +4064,24 @@
       "resolved": "https://registry.npmmirror.com/@one-ini/wasm/-/wasm-0.1.1.tgz",
       "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw=="
     },
+    "node_modules/@pdf-lib/standard-fonts": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz",
+      "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "^1.0.6"
+      }
+    },
+    "node_modules/@pdf-lib/upng": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/@pdf-lib/upng/-/upng-1.0.1.tgz",
+      "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "^1.0.10"
+      }
+    },
     "node_modules/@pkgjs/parseargs": {
       "version": "0.11.0",
       "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -4869,7 +4902,6 @@
       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
       "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
@@ -4913,7 +4945,6 @@
       "version": "4.17.12",
       "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
       "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
-      "peer": true,
       "dependencies": {
         "@types/lodash": "*"
       }
@@ -4922,14 +4953,14 @@
       "version": "9.1.1",
       "resolved": "https://registry.npmmirror.com/@types/mocha/-/mocha-9.1.1.tgz",
       "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/@types/node": {
       "version": "20.14.6",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz",
       "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "undici-types": "~5.26.4"
       }
@@ -5038,7 +5069,6 @@
       "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.1.tgz",
       "integrity": "sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@typescript-eslint/scope-manager": "7.13.1",
         "@typescript-eslint/types": "7.13.1",
@@ -5992,7 +6022,6 @@
       "version": "2.3.4",
       "resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz",
       "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
-      "peer": true,
       "dependencies": {
         "@transloadit/prettier-bytes": "0.0.7",
         "@uppy/store-default": "^2.1.1",
@@ -6021,7 +6050,6 @@
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
       "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
-      "peer": true,
       "dependencies": {
         "@uppy/companion-client": "^2.2.2",
         "@uppy/utils": "^4.1.2",
@@ -6513,7 +6541,6 @@
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
       "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
-      "peer": true,
       "dependencies": {
         "is-url": "^1.2.4"
       },
@@ -6544,7 +6571,6 @@
       "version": "1.1.19",
       "resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz",
       "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
-      "peer": true,
       "dependencies": {
         "@types/event-emitter": "^0.3.3",
         "event-emitter": "^0.3.5",
@@ -6574,7 +6600,6 @@
       "version": "5.1.23",
       "resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz",
       "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
-      "peer": true,
       "dependencies": {
         "@uppy/core": "^2.1.1",
         "@uppy/xhr-upload": "^2.0.3",
@@ -6690,7 +6715,6 @@
       "version": "8.12.0",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
       "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
-      "peer": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -6711,6 +6735,7 @@
       "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz",
       "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "acorn": "^8.11.0"
       },
@@ -7535,7 +7560,6 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
-      "peer": true,
       "dependencies": {
         "caniuse-lite": "^1.0.30001629",
         "electron-to-chromium": "^1.4.796",
@@ -7716,8 +7740,7 @@
     "node_modules/camunda-bpmn-moddle": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/camunda-bpmn-moddle/-/camunda-bpmn-moddle-7.0.1.tgz",
-      "integrity": "sha512-Br8Diu6roMpziHdpl66Dhnm0DTnCFMrSD9zwLV08LpD52QA0UsXxU87XfHf08HjuB7ly0Hd1bvajZRpf9hbmYQ==",
-      "peer": true
+      "integrity": "sha512-Br8Diu6roMpziHdpl66Dhnm0DTnCFMrSD9zwLV08LpD52QA0UsXxU87XfHf08HjuB7ly0Hd1bvajZRpf9hbmYQ=="
     },
     "node_modules/caniuse-lite": {
       "version": "1.0.30001636",
@@ -7938,7 +7961,8 @@
       "version": "2.5.1",
       "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
       "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/cli-cursor": {
       "version": "4.0.0",
@@ -8330,7 +8354,6 @@
       "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
       "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "env-paths": "^2.2.1",
         "import-fresh": "^3.3.0",
@@ -8397,7 +8420,8 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz",
       "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/cropperjs": {
       "version": "1.6.2",
@@ -8914,7 +8938,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz",
       "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
@@ -9248,7 +9271,6 @@
       "version": "12.8.1",
       "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-12.8.1.tgz",
       "integrity": "sha512-LF9BiwjbOPpZd0ez5VSlYRbdbEA59YQX43bWvNDp1rLMv0xwZ5yIg4oaYDK82nIQ0kH1tjvoQRpNevMTCgQVyw==",
-      "peer": true,
       "dependencies": {
         "@bpmn-io/diagram-js-ui": "^0.2.2",
         "clsx": "^2.0.0",
@@ -9352,7 +9374,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
       "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
-      "peer": true,
       "dependencies": {
         "ssr-window": "^3.0.0-alpha.1"
       }
@@ -9929,7 +9950,6 @@
       "version": "8.57.0",
       "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
       "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
-      "peer": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
@@ -9985,7 +10005,6 @@
       "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
       "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
       "dev": true,
-      "peer": true,
       "bin": {
         "eslint-config-prettier": "bin/cli.js"
       },
@@ -10656,6 +10675,7 @@
       "resolved": "https://registry.npmmirror.com/feelers/-/feelers-1.4.0.tgz",
       "integrity": "sha512-CGa/7ILuqoqTaeYeoKsg/4tzu2es9sEEJTmSjdu0lousZBw4V9gcYhHYFNmbrSrKmbAVfOzj6/DsymGJWFIOeg==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@bpmn-io/cm-theme": "^0.1.0-alpha.2",
         "@bpmn-io/feel-lint": "^1.2.0",
@@ -10687,6 +10707,7 @@
       "resolved": "https://registry.npmmirror.com/domify/-/domify-2.0.0.tgz",
       "integrity": "sha512-rmvrrmWQPD/X1A/nPBfIVg4r05792QdG9Z4Prk6oQG0F9zBMDkr0GKAdds1wjb2dq1rTz/ywc4ZxpZbgz0tttg==",
       "dev": true,
+      "peer": true,
       "engines": {
         "node": ">=18"
       },
@@ -10699,6 +10720,7 @@
       "resolved": "https://registry.npmmirror.com/min-dom/-/min-dom-5.1.1.tgz",
       "integrity": "sha512-GaKUlguMAofd3OJsB0OkP17i5kucKqErgVCJxPawO9l5NwIPnr28SAr99zzlzMCWWljISBYrnZVWdE2Q92YGFQ==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "domify": "^2.0.0",
         "min-dash": "^4.2.1"
@@ -10709,6 +10731,7 @@
       "resolved": "https://registry.npmmirror.com/feelin/-/feelin-3.2.0.tgz",
       "integrity": "sha512-GFDbHsTYk7YXO1tyw1dOjb7IODeAZvNIosdGZThUwPx5XcD/XhO0hnPZXsIbAzSsIdrgGlTEEdby9fZ2gixysA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@lezer/lr": "^1.4.2",
         "lezer-feel": "^1.4.0",
@@ -10821,6 +10844,7 @@
       "resolved": "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.6.4.tgz",
       "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "tabbable": "^6.2.0"
       }
@@ -12014,8 +12038,7 @@
     "node_modules/is-hotkey": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz",
-      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==",
-      "peer": true
+      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
     },
     "node_modules/is-negative-zero": {
       "version": "2.0.3",
@@ -12653,6 +12676,7 @@
       "resolved": "https://registry.npmmirror.com/lang-feel/-/lang-feel-2.3.0.tgz",
       "integrity": "sha512-cotBfyBP710udy3Tm7s4NyNZPSSLXkVV/rrfmM4NVbuzB9WGL7CbMWUzfSn6GZ+qFnh8/xbkeDHfAvPM90oENA==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@codemirror/autocomplete": "^6.18.4",
         "@codemirror/language": "^6.10.8",
@@ -12722,6 +12746,7 @@
       "resolved": "https://registry.npmmirror.com/lezer-feel/-/lezer-feel-1.7.0.tgz",
       "integrity": "sha512-UC8h3Nu4llRPISEUhv+Ne7bNkdxjf4+/DcU4KfO8zKxycWxev8d2BoVnGlG17zbQDtQJBD39ZQvWtjCeTFm69g==",
       "dev": true,
+      "peer": true,
       "dependencies": {
         "@lezer/highlight": "^1.2.1",
         "@lezer/lr": "^1.4.2",
@@ -12950,15 +12975,13 @@
     "node_modules/lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "peer": true
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "node_modules/lodash-es": {
       "version": "4.17.21",
       "resolved": "https://repo.huaweicloud.com/repository/npm/lodash-es/-/lodash-es-4.17.21.tgz",
       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
-      "license": "MIT",
-      "peer": true
+      "license": "MIT"
     },
     "node_modules/lodash-unified": {
       "version": "1.0.3",
@@ -12973,20 +12996,17 @@
     "node_modules/lodash.camelcase": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
-      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
-      "peer": true
+      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
     },
     "node_modules/lodash.clonedeep": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
-      "peer": true
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
     },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "peer": true
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
     },
     "node_modules/lodash.defaults": {
       "version": "4.2.0",
@@ -13015,8 +13035,7 @@
     "node_modules/lodash.foreach": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
-      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==",
-      "peer": true
+      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
     },
     "node_modules/lodash.groupby": {
       "version": "4.6.0",
@@ -13033,8 +13052,7 @@
     "node_modules/lodash.isequal": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
-      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
-      "peer": true
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
     },
     "node_modules/lodash.isfunction": {
       "version": "3.0.9",
@@ -13091,14 +13109,12 @@
     "node_modules/lodash.throttle": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
-      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
-      "peer": true
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
     },
     "node_modules/lodash.toarray": {
       "version": "4.4.0",
       "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
-      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==",
-      "peer": true
+      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
     },
     "node_modules/lodash.truncate": {
       "version": "4.4.2",
@@ -13360,6 +13376,7 @@
       "resolved": "https://registry.npmmirror.com/luxon/-/luxon-3.5.0.tgz",
       "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
       "dev": true,
+      "peer": true,
       "engines": {
         "node": ">=12"
       }
@@ -13423,7 +13440,6 @@
       "version": "0.16.0",
       "resolved": "https://registry.npmmirror.com/markmap-common/-/markmap-common-0.16.0.tgz",
       "integrity": "sha512-q3nlNDMKuWXTm3VwZFY9V5zteL/+iBLZanUK5vS+e26bUbzTSG5VtAzsyJbmgJm1WhwmIIAxbXEnp6JdvtTduA==",
-      "peer": true,
       "dependencies": {
         "@babel/runtime": "^7.22.6",
         "@gera2ld/jsx-dom": "^2.2.2",
@@ -13839,7 +13855,6 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
-      "peer": true,
       "bin": {
         "nanoid": "bin/nanoid.cjs"
       },
@@ -14456,10 +14471,29 @@
       "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
       "dev": true
     },
+    "node_modules/pdf-lib": {
+      "version": "1.17.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/pdf-lib/-/pdf-lib-1.17.1.tgz",
+      "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==",
+      "license": "MIT",
+      "dependencies": {
+        "@pdf-lib/standard-fonts": "^1.0.0",
+        "@pdf-lib/upng": "^1.0.1",
+        "pako": "^1.0.11",
+        "tslib": "^1.11.1"
+      }
+    },
+    "node_modules/pdf-lib/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "license": "0BSD"
+    },
     "node_modules/pdfjs-dist": {
       "version": "4.8.69",
-      "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz",
       "integrity": "sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==",
+      "license": "Apache-2.0",
       "engines": {
         "node": ">=18"
       },
@@ -14513,7 +14547,6 @@
       "version": "2.1.7",
       "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz",
       "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
-      "peer": true,
       "dependencies": {
         "@vue/devtools-api": "^6.5.0",
         "vue-demi": ">=0.14.5"
@@ -14650,7 +14683,6 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
-      "peer": true,
       "dependencies": {
         "nanoid": "^3.3.8",
         "picocolors": "^1.1.1",
@@ -14743,7 +14775,6 @@
       "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
       "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -15008,7 +15039,6 @@
       "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
       "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
       "dev": true,
-      "peer": true,
       "bin": {
         "prettier": "bin/prettier.cjs"
       },
@@ -15863,7 +15893,6 @@
       "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz",
       "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@types/estree": "1.0.5"
       },
@@ -16164,7 +16193,6 @@
       "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz",
       "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",
         "immutable": "^4.0.0",
@@ -16218,7 +16246,6 @@
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/segmentit/-/segmentit-2.0.3.tgz",
       "integrity": "sha512-7mn2XL3OdTUQ+AhHz7SbgyxLTaQRzTWQNVwiK+UlTO8aePGbSwvKUzTwE4238+OUY9MoR6ksAg35zl8sfTunQQ==",
-      "peer": true,
       "dependencies": {
         "preval.macro": "^4.0.0"
       }
@@ -16418,7 +16445,6 @@
       "version": "0.72.8",
       "resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz",
       "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
-      "peer": true,
       "dependencies": {
         "immer": "^9.0.6",
         "is-plain-object": "^5.0.0",
@@ -16480,7 +16506,6 @@
       "version": "3.6.2",
       "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.6.2.tgz",
       "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==",
-      "peer": true,
       "engines": {
         "node": ">=12.17.0"
       }
@@ -16928,7 +16953,8 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmmirror.com/style-mod/-/style-mod-4.1.2.tgz",
       "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/stylelint": {
       "version": "16.6.1",
@@ -16945,7 +16971,6 @@
           "url": "https://github.com/sponsors/stylelint"
         }
       ],
-      "peer": true,
       "dependencies": {
         "@csstools/css-parser-algorithms": "^2.6.3",
         "@csstools/css-tokenizer": "^2.3.1",
@@ -17525,7 +17550,8 @@
       "version": "6.2.0",
       "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.2.0.tgz",
       "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/table": {
       "version": "6.8.2",
@@ -17592,7 +17618,6 @@
       "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz",
       "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@jridgewell/source-map": "^0.3.3",
         "acorn": "^8.8.2",
@@ -17969,7 +17994,6 @@
       "version": "5.3.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
       "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
-      "peer": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -18528,7 +18552,6 @@
       "version": "7.21.6",
       "resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.6.tgz",
       "integrity": "sha512-m41TbODrUCToVfK1aljVd296CwDQnCRewpIm5tTXMuV87YYSGw1H+VDOaV45HlpcWSsTWWLF++InDgGJfthfUw==",
-      "peer": true,
       "dependencies": {
         "@babel/runtime": "^7.12.5",
         "@videojs/http-streaming": "2.16.3",
@@ -18563,7 +18586,6 @@
       "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz",
       "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "esbuild": "^0.19.3",
         "postcss": "^8.4.35",
@@ -18807,7 +18829,6 @@
       "version": "3.5.12",
       "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.12.tgz",
       "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
-      "peer": true,
       "dependencies": {
         "@vue/compiler-dom": "3.5.12",
         "@vue/compiler-sfc": "3.5.12",
@@ -18829,7 +18850,6 @@
       "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
       "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
       "hasInstallScript": true,
-      "peer": true,
       "bin": {
         "vue-demi-fix": "bin/vue-demi-fix.js",
         "vue-demi-switch": "bin/vue-demi-switch.js"
@@ -18939,7 +18959,6 @@
       "version": "9.10.2",
       "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.10.2.tgz",
       "integrity": "sha512-ECJ8RIFd+3c1d3m1pctQ6ywG5Yj8Efy1oYoAKQ9neRdkLbuKLVeW4gaY5HPkD/9ssf1pOnUrmIFjx2/gkGxmEw==",
-      "peer": true,
       "dependencies": {
         "@intlify/core-base": "9.10.2",
         "@intlify/shared": "9.10.2",
@@ -19067,7 +19086,8 @@
       "version": "2.2.8",
       "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
       "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
-      "dev": true
+      "dev": true,
+      "peer": true
     },
     "node_modules/wangeditor": {
       "version": "4.7.15",

+ 2 - 0
package.json

@@ -76,6 +76,8 @@
     "min-dash": "^4.1.1",
     "mitt": "^3.0.1",
     "nprogress": "^0.2.0",
+    "pdf-lib": "^1.17.1",
+    "pdfjs-dist": "^4.8.69",
     "pinia": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
     "pinyin": "^4.0.0-alpha.2",

+ 173 - 17
src/components/UploadFile/src/useUpload.ts

@@ -1,5 +1,4 @@
 import * as FileApi from '@/api/infra/file'
-import CryptoJS from 'crypto-js'
 import { UploadRawFile, UploadRequestOptions } from 'element-plus/es/components/upload/src/upload'
 import axios from 'axios'
 
@@ -102,6 +101,164 @@ export const fillFileListMetaInfo = async (list: FileItem[]): Promise<void> => {
   await Promise.all(list.map((item) => fillFileMetaInfo(item)))
 }
 
+/**
+ * 图片压缩选项
+ */
+interface CompressOptions {
+  /** 触发压缩的文件大小阈值(字节),默认 5MB */
+  maxSize?: number
+  /** 图片最大宽度,默认 1920 */
+  maxWidth?: number
+  /** 图片最大高度,默认 1920 */
+  maxHeight?: number
+  /** 图片压缩质量 0-1,默认 0.8 */
+  quality?: number
+}
+
+/**
+ * 压缩图片文件
+ */
+const compressImage = (file: File, options: CompressOptions = {}): Promise<File> => {
+  return new Promise((resolve, reject) => {
+    const { maxWidth = 1920, maxHeight = 1920, quality = 0.8 } = options
+    const reader = new FileReader()
+    reader.onload = (e) => {
+      const img = new Image()
+      img.onload = () => {
+        let { width, height } = img
+        if (width > maxWidth || height > maxHeight) {
+          const ratio = Math.min(maxWidth / width, maxHeight / height)
+          width = Math.floor(width * ratio)
+          height = Math.floor(height * ratio)
+        }
+        const canvas = document.createElement('canvas')
+        canvas.width = width
+        canvas.height = height
+        const ctx = canvas.getContext('2d')
+        if (!ctx) {
+          resolve(file)
+          return
+        }
+        ctx.drawImage(img, 0, 0, width, height)
+        const outputType = file.type === 'image/png' ? 'image/jpeg' : file.type || 'image/jpeg'
+        canvas.toBlob(
+          (blob) => {
+            if (!blob) {
+              resolve(file)
+              return
+            }
+            const compressed = new File([blob], file.name, { type: outputType })
+            resolve(compressed.size < file.size ? compressed : file)
+          },
+          outputType,
+          quality
+        )
+      }
+      img.onerror = () => resolve(file)
+      img.src = e.target?.result as string
+    }
+    reader.onerror = () => resolve(file)
+    reader.readAsDataURL(file)
+  })
+}
+
+/**
+ * 将 File 转为 ArrayBuffer
+ */
+const fileToArrayBuffer = (file: File): Promise<ArrayBuffer> => {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader()
+    reader.onload = (e) => resolve(e.target?.result as ArrayBuffer)
+    reader.onerror = reject
+    reader.readAsArrayBuffer(file)
+  })
+}
+
+/**
+ * 压缩 PDF 文件(逐页渲染为图片,压缩后重新生成 PDF)
+ * 依赖 pdf-lib 和 pdfjs-dist,请手动安装:pnpm add pdf-lib pdfjs-dist
+ */
+const compressPdf = async (file: File, options: CompressOptions = {}): Promise<File> => {
+  const { maxWidth = 2400, maxHeight = 2400, quality = 0.9 } = options
+  const [{ PDFDocument }, pdfjsLib] = await Promise.all([
+    import('pdf-lib'),
+    import('pdfjs-dist')
+  ])
+
+  // 配置 pdfjs worker,使用 node_modules 中的 worker 文件,确保版本匹配
+  const pdfjs: any = pdfjsLib
+  if (!pdfjs.GlobalWorkerOptions.workerSrc) {
+    pdfjs.GlobalWorkerOptions.workerSrc = new URL(
+      'pdfjs-dist/build/pdf.worker.mjs',
+      import.meta.url
+    ).href
+  }
+
+  const arrayBuffer = await fileToArrayBuffer(file)
+  const pdfDocument = await pdfjs.getDocument({ data: arrayBuffer }).promise
+  const newPdf = await PDFDocument.create()
+
+  for (let i = 1; i <= pdfDocument.numPages; i++) {
+    const page = await pdfDocument.getPage(i)
+    // 基础 scale 2.0,文字更清晰;再根据最大尺寸等比缩放
+    const baseScale = 1.2
+    const baseViewport = page.getViewport({ scale: baseScale })
+
+    let renderWidth = baseViewport.width
+    let renderHeight = baseViewport.height
+    if (renderWidth > maxWidth || renderHeight > maxHeight) {
+      const ratio = Math.min(maxWidth / renderWidth, maxHeight / renderHeight)
+      renderWidth = Math.floor(renderWidth * ratio)
+      renderHeight = Math.floor(renderHeight * ratio)
+    }
+
+    const canvas = document.createElement('canvas')
+    const ctx = canvas.getContext('2d')
+    if (!ctx) continue
+    canvas.width = renderWidth
+    canvas.height = renderHeight
+
+    // 用正确的 scale 渲染,铺满整个 canvas
+    const renderScale = renderWidth / baseViewport.width * baseScale
+    const renderViewport = page.getViewport({ scale: renderScale })
+    await page.render({ canvasContext: ctx, viewport: renderViewport }).promise
+
+    const imageData = canvas.toDataURL('image/jpeg', quality)
+    const imageBytes = Uint8Array.from(atob(imageData.split(',')[1]), (c) => c.charCodeAt(0))
+    const embeddedImage = await newPdf.embedJpg(imageBytes)
+
+    // 新 PDF 页面使用原始页面尺寸(点),图片铺满页面
+    const originalViewport = page.getViewport({ scale: 1 })
+    const newPage = newPdf.addPage([originalViewport.width, originalViewport.height])
+    newPage.drawImage(embeddedImage, {
+      x: 0,
+      y: 0,
+      width: originalViewport.width,
+      height: originalViewport.height
+    })
+  }
+
+  const newPdfBytes = await newPdf.save()
+  const compressed = new File([newPdfBytes], file.name, { type: 'application/pdf' })
+  return compressed.size < file.size ? compressed : file
+}
+
+/**
+ * 根据文件类型压缩文件(超过阈值时)
+ */
+const compressFile = async (file: File, options: CompressOptions = {}): Promise<File> => {
+  const { maxSize = 5 * 1024 * 1024 } = options
+  if (file.size <= maxSize) return file
+
+  if (file.type.startsWith('image/')) {
+    return compressImage(file, options)
+  }
+  if (file.type === 'application/pdf') {
+    return compressPdf(file, options)
+  }
+  return file
+}
+
 export const useUpload = (menu: string = '', elder: any = { elderId: '', elderName: '' }) => {
   // 后端上传地址
   const uploadUrl = getUploadUrl()
@@ -111,23 +268,26 @@ export const useUpload = (menu: string = '', elder: any = { elderId: '', elderNa
   const uploadTimeout = 5 * 60 * 1000
   // 重写ElUpload上传方法
   const httpRequest = async (options: UploadRequestOptions) => {
+    // 上传前压缩:图片/PDF 大于 5MB 时压缩
+    const file = await compressFile(options.file, { maxSize: 5 * 1024 * 1024 })
+
     // 模式一:前端上传
     if (isClientUpload) {
       // 1.1 生成文件名称
-      const fileName = await generateFileName(options.file)
+      const fileName = generateFileName(file)
       // 1.2 获取文件预签名地址
       const presignedInfo = await FileApi.getFilePresignedUrl(fileName)
       // 1.3 上传文件(不能使用 ElUpload 的 ajaxUpload 方法的原因:其使用的是 FormData 上传,Minio 不支持)
       return axios
-        .put(presignedInfo.uploadUrl, options.file, {
+        .put(presignedInfo.uploadUrl, file, {
           headers: {
-            'Content-Type': options.file.type
+            'Content-Type': file.type
           },
           timeout: uploadTimeout
         })
         .then(() => {
           // 1.4. 记录文件信息到后端(异步)
-          createFile(presignedInfo, fileName, options.file)
+          createFile(presignedInfo, fileName, file)
           // 通知成功,数据格式保持与后端上传的返回结果一致
           return { data: presignedInfo.url }
         })
@@ -136,7 +296,7 @@ export const useUpload = (menu: string = '', elder: any = { elderId: '', elderNa
       // 重写 el-upload httpRequest 文件上传成功会走成功的钩子,失败走失败的钩子
       return new Promise((resolve, reject) => {
         FileApi.updateFile({
-          file: options.file,
+          file,
           operation: menu,
           elderName: elder.elderName,
           elderId: elder.elderId
@@ -145,12 +305,12 @@ export const useUpload = (menu: string = '', elder: any = { elderId: '', elderNa
             if (res.code === 0) {
               resolve({
                 ...res,
-                fileName: options.file.name
+                fileName: file.name
               })
             } else {
               reject({
                 ...res,
-                fileName: options.file.name
+                fileName: file.name
               })
             }
           })
@@ -187,18 +347,14 @@ function createFile(vo: FileApi.FilePresignedUrlRespVO, name: string, file: Uplo
 }
 
 /**
- * 生成文件名称(使用算法SHA256
+ * 生成文件名称(时间戳 + 随机数,避免读取大文件内容
  * @param file 要上传的文件
  */
-async function generateFileName(file: UploadRawFile) {
-  // 读取文件内容
-  const data = await file.arrayBuffer()
-  const wordArray = CryptoJS.lib.WordArray.create(data)
-  // 计算SHA256
-  const sha256 = CryptoJS.SHA256(wordArray).toString()
-  // 拼接后缀
+function generateFileName(file: UploadRawFile) {
+  const timestamp = Date.now()
+  const random = Math.random().toString(36).substring(2, 8)
   const ext = file.name.substring(file.name.lastIndexOf('.'))
-  return `${sha256}${ext}`
+  return `${timestamp}-${random}${ext}`
 }
 
 /**