V1 standalone complete

This commit is contained in:
Emma Short 2025-04-17 14:37:18 -06:00
commit 597c52eefe
5 changed files with 133 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.exe

36
README.md Normal file
View File

@ -0,0 +1,36 @@
# Emma's Simple Form Field Checker
Compares a PDF form to a list of CS class files to see if all field names are
present, excluding signature fields.
## Prereqs
Deno >=2.2 (not required if downloading .exe)
## Installation
### Deno install
`deno task install` -> installs as global command `checkfields`
### Compile
`deno task compile` -> compare-form-fields.exe -OR- Download .exe from release
> If you want it to be a global command, create an executables directory and add
> it to the PATH
## Usage
`checkfields <path to PDF> <comma-separated list of paths to CS class files>`
-OR- `checkfields` and follow prompts.
### Output
> All form fields present!
-OR-
> The following field names are not present in the CS code
> \<list of missing form fields\>

11
deno.json Normal file
View File

@ -0,0 +1,11 @@
{
"tasks": {
"dev": "deno run -A --watch main.ts",
"compile": "deno compile -o compare-form-fields.exe --target x86_64-pc-windows-msvc -R ./main.ts",
"install": "deno install -fgq --import-map ./deno.json -n checkfields -R ./main.ts"
},
"imports": {
"@std/assert": "jsr:@std/assert@1",
"pdf-lib": "npm:pdf-lib@^1.17.1"
}
}

54
deno.lock generated Normal file
View File

@ -0,0 +1,54 @@
{
"version": "4",
"specifiers": {
"jsr:@std/assert@1": "1.0.12",
"jsr:@std/internal@^1.0.6": "1.0.6",
"npm:pdf-lib@^1.17.1": "1.17.1"
},
"jsr": {
"@std/assert@1.0.12": {
"integrity": "08009f0926dda9cbd8bef3a35d3b6a4b964b0ab5c3e140a4e0351fbf34af5b9a",
"dependencies": [
"jsr:@std/internal"
]
},
"@std/internal@1.0.6": {
"integrity": "9533b128f230f73bd209408bb07a4b12f8d4255ab2a4d22a1fd6d87304aca9a4"
}
},
"npm": {
"@pdf-lib/standard-fonts@1.0.0": {
"integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==",
"dependencies": [
"pako"
]
},
"@pdf-lib/upng@1.0.1": {
"integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==",
"dependencies": [
"pako"
]
},
"pako@1.0.11": {
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"pdf-lib@1.17.1": {
"integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==",
"dependencies": [
"@pdf-lib/standard-fonts",
"@pdf-lib/upng",
"pako",
"tslib"
]
},
"tslib@1.14.1": {
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
}
},
"workspace": {
"dependencies": [
"jsr:@std/assert@1",
"npm:pdf-lib@^1.17.1"
]
}
}

31
main.ts Normal file
View File

@ -0,0 +1,31 @@
import {PDFDocument} from "pdf-lib";
let [pdfPath, csPath] = Deno.args;
while (!pdfPath || !pdfPath.endsWith('.pdf')) pdfPath = prompt("Please provide path to PDF file:") || "";
while (!csPath || !csPath.endsWith('.cs')) csPath = prompt("Please provide path to CS class file:") || "";
const pdfBytes = await Deno.readFile(pdfPath);
const pdfDoc = await PDFDocument.load(pdfBytes);
const form = pdfDoc.getForm();
const fields = form.getFields();
const csFiles = await Promise.all(csPath.split(",").map(c => Deno.readTextFile(c.trim())));
const fieldNames:string[] = fields.map(f => f.getName())
.filter(f => {
const rx = new RegExp(`(?<!//\s?)case ?"${f}"`)
return !csFiles.some(c => rx.test(c))
})
.filter(f => !f.toLowerCase().includes("signature"));
if (fieldNames.length) {
console.log("%cThe following field names are not present in the CS code", "color: red")
console.log(fieldNames)
alert("Your princess is in another castle...")
} else {
console.log("%cAll form fields present", 'color: lime')
alert("Ok!")
}