Skip to content

Commit 849c34f

Browse files
committed
feat(new tool): PDF Linearizer
Make a Linearized/FastWeb PDF from a PDF
1 parent 8d710d1 commit 849c34f

File tree

10 files changed

+195
-163
lines changed

10 files changed

+195
-163
lines changed

components.d.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,27 +127,20 @@ declare module '@vue/runtime-core' {
127127
MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
128128
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
129129
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
130-
NCode: typeof import('naive-ui')['NCode']
131130
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
132131
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
133-
NDivider: typeof import('naive-ui')['NDivider']
134132
NEllipsis: typeof import('naive-ui')['NEllipsis']
135-
NFormItem: typeof import('naive-ui')['NFormItem']
136-
NGi: typeof import('naive-ui')['NGi']
137-
NGrid: typeof import('naive-ui')['NGrid']
138133
NH1: typeof import('naive-ui')['NH1']
139134
NH3: typeof import('naive-ui')['NH3']
140135
NIcon: typeof import('naive-ui')['NIcon']
141-
NInputNumber: typeof import('naive-ui')['NInputNumber']
142-
NLabel: typeof import('naive-ui')['NLabel']
143136
NLayout: typeof import('naive-ui')['NLayout']
144137
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
145138
NMenu: typeof import('naive-ui')['NMenu']
146-
NScrollbar: typeof import('naive-ui')['NScrollbar']
147139
NSpin: typeof import('naive-ui')['NSpin']
148140
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
149141
OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default']
150142
PasswordStrengthAnalyser: typeof import('./src/tools/password-strength-analyser/password-strength-analyser.vue')['default']
143+
PdfLinearize: typeof import('./src/tools/pdf-linearize/pdf-linearize.vue')['default']
151144
PdfSignatureChecker: typeof import('./src/tools/pdf-signature-checker/pdf-signature-checker.vue')['default']
152145
PdfSignatureDetails: typeof import('./src/tools/pdf-signature-checker/components/pdf-signature-details.vue')['default']
153146
PercentageCalculator: typeof import('./src/tools/percentage-calculator/percentage-calculator.vue')['default']

package.json

Lines changed: 3 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",
@@ -80,6 +81,7 @@
8081
"pdf-signature-reader": "^1.4.2",
8182
"pinia": "^2.0.34",
8283
"plausible-tracker": "^0.3.8",
84+
"qpdf-wasm-esm-embedded": "^1.1.1",
8385
"qrcode": "^1.5.1",
8486
"sql-formatter": "^13.0.0",
8587
"ua-parser-js": "^1.0.35",

pnpm-lock.yaml

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

public/qpdf.wasm

-1.21 MB
Binary file not shown.

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
}

src/libs/qpdf/qpdf.d.ts

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)