Variable PDF Record Audit

User guide and recovery

Guide version 1.0.1

Open the application

Start with the finished PDF

Open the public app using the link above, or follow the ZIP recovery instructions below. Select files from outside the served app folder. The app checks extractable number text. Continue your usual visual and print proofing and use a separate workflow for OCR.

Supported: single-sided four-up tickets, two exact ASCII three-digit number fields on the body and its matching stub. Not supported: OCR/image-only numbers, arbitrary N-up, duplex, QR or print approval.

Text-based PDF · up to 100 MiB / 250 pages

UTF-8 · up to 1 MiB / 1,000 tickets · two selected columns

In range mode, specify an inclusive range within 000–999 that contains a positive even number of entries. The limit is 500 tickets.

Tested environments

Evidence from release 1.0.0

EnvironmentObserved results
Debian 13.6 Linux
Firefox 153.0 · Chromium 156.0.8078.79
Local automated tests passed auditing, downloading both JSON and HTML reports, importing the saved JSON and opening the saved HTML.
Debian 13.6 Linux
Firefox 153.0
Native browser operation, range sample
In the normal browser flow over public HTTPS, auditing and saving both reports passed. The saved JSON was imported into the app and the saved HTML opened in a browser.
Debian 13.6 Linux
Chromium 156.0.8078.79
Managed cloud, CSV sample with a declared range
Auditing passed. In the managed cloud Chromium environment, the JSON and HTML download buttons produced no files. The cause is unconfirmed. Readback could not run in that session.
Windows, macOS and other unlisted environmentsUnverified.

If the managed Chromium environment does not save reports, repeat the sample in Firefox 153.0 on Debian 13.6 Linux with downloads allowed. Confirm that both files exist before relying on the workflow.

Try the supplied eight-ticket sample

Save normal.pdf, stub-swap.pdf, source.csv, layout.json and expected.json from the links below. First open normal.pdf in the application, then import layout.json. Choose range mode, enter 000 and 015, and keep all four final-page cells selected. The sample has eight tickets on two pages. Check all pages and review all three axes. In CSV mode, choose source.csv, comma, header enabled and columns 1 and 2; with range inventory enabled, enter 000–015 again. The normal file should match its number records. The stub-swap file deliberately exchanges stubs and should report a same-ticket mismatch. Visual quality remains unverified in both files. expected.json explains the independently fixed sample expectations; it is not an application profile or saved audit report.

Sample files

Before buying, run each of the two sample PDFs in both range and CSV modes. Save both JSON and HTML after each run. Check that the files exist, import the saved JSON with “Read a saved JSON report” and open the saved HTML in a browser. Compare the status, counts and any mismatched ticket locations with the app and the sample expectations.

1. Choose the files and expectation

Range mode needs only a PDF and declared range. CSV mode additionally needs your existing two-number CSV: it does not require a newly printed ticket ID. Choose the delimiter explicitly and mark whether the first row is a header. Enter the two distinct number columns using the 1-based column numbers shown in the UI. CSV must be UTF-8, optionally with a BOM; comma, semicolon and tab delimiters and quoted fields are supported. Empty rows/values, extra spaces, full-width digits and other invalid values are errors, not silently corrected data. Enable leading-zero padding only when you intentionally want 1–3 ASCII digits in the CSV normalized to three digits. Raw CSV values remain in the report.

Declared range and matching stubs

Each number must occur once on a body and once on its own stub. Original CSV pairs are not supplied or verified.

ASCII integers from 0 to 999; a positive even count. The PDF must contain exact three-digit values, including leading zeros.

Existing CSV pairs and matching stubs

Compare the unordered pairs and their multiplicities with your existing CSV. Row, ticket and left/right order do not matter.

Without a declared range, CSV uniqueness and coverage are unverified. A CSV and PDF can share the same error.

Only CSV values are padded. Raw values are kept. A PDF value of 7 never becomes 007 automatically.

2. Define four tickets and their number fields

A layout has four non-overlapping ticket boundaries in any arrangement, not only a 2 × 2 grid. Each boundary contains four non-overlapping number fields: body 1, body 2, stub 1 and stub 2. Select one region from the region selector, then drag its rectangle on the preview. To work with a keyboard, select the region and edit left, top, width and height as percentages of the rotated page viewport. A starting layout is a convenience, not automatic detection or proof that your fields are correct. Confirm every boundary and field before checking.

All pages before the final page use all four cells. On the final page, select exactly the cells that actually contain tickets; a partial final page can contain one, two or three tickets. The selected count must agree with the expected ticket count and page count. Do not mark unread or failed tickets as empty to hide them. Number text inside the declared number fields of an empty cell is still checked and diagnosed. Mixed layouts, covers and duplex pages are not silently skipped.

The preview helps place fields and locate differences. It does not verify visual quality.

3. Check every page

Start the full-page check only after confirming files, mode, range/CSV options and regions. Read progress and the expected, processed and unprocessed ticket counts. A stopped or resource-failed job retains its unprocessed count and is never a complete match. Stop the check when necessary, resolve the input or resource problem, and rerun the entire job. A record match requires all required comparisons to finish; visual quality never becomes verified.

Read the three result axes separately

Source CSV inventory, PDF number records and visual/print quality are separate conclusions. A CSV may fail its declared inventory while the PDF accurately matches that same faulty CSV; the combined job is not accepted. In CSV-only mode without a range, source uniqueness and coverage remain unverified, even if its pairs match. In range mode the source CSV and its original pairings are not supplied. A confirmed difference, an undetermined value, an error and a user stop have different meanings; review the status and unprocessed count instead of treating every completed screen as success.

Differences and undetermined records

Each diagnosis has a stable code, expected/observed data and, where available, page, ticket, body/stub and field. Use Show location to return to that page and region while the original job remains open. CSV input errors also identify the row and column where available. Review both sides of a body/stub mismatch: the app does not assume one is the correct original. An unreadable or ambiguous field is inconclusive, not an empty correct number. Fix the source or region definition rather than editing the finished PDF inside this app.

4. Review and save

Download both JSON and HTML reports and check the browser's actual saved files. JSON keeps machine-readable values, input names/byte counts/SHA-256, settings, profile, versions, counts and diagnoses. HTML presents the report safely for reading. Read the saved JSON through Read a saved JSON report to check that the saved state and counts are the intended ones. Imported results are historical: they do not inspect the currently selected PDF, and their locations cannot replace a fresh run. The app never overwrites the original PDF or CSV. Treat reports as potentially sensitive because they intentionally include selected-file names and number data.

Download requested. Verify the saved file; a browser request does not confirm disk storage.

Reuse a profile and recheck corrections

Download a reusable profile after checking every region and option. A profile stores layout/settings, not the source files. For a corrected or different PDF, open the new file first, import the profile if needed, and confirm page dimensions, rotation, regions, expectation mode and final-page used cells again. Any changed input or setting invalidates the current result. Run every page again and save a new report bound to the new input hash. A correct modified page or old report is not evidence that the whole new file matches.

Keep the ZIP and restore local use

Keep an unchanged copy of your purchased versioned ZIP. Extract it so that the app folder exists, then open a terminal in its parent folder. Check that a supported Python 3 is installed; if it is missing, obtain it from Python's official website. Run the command below and keep that terminal open while using the local application. Open the loopback address in your desktop browser. Customer PDFs/CSVs do not belong in the app folder: select them from another folder. Direct file:// launch, a single HTML file and installation-free offline startup are not the supplied recovery method.

python3 -m http.server 8765 --bind 127.0.0.1 --directory app

http://127.0.0.1:8765

Official Python downloads

On Windows, use the Python launcher installed on your machine, commonly py -3, with the same arguments. On systems where the command is python rather than python3, use that installed command. Do not bind this recovery server to an external interface or publish it to the internet.

py -3 -m http.server 8765 --bind 127.0.0.1 --directory app

If port 8765 is already in use, stop only your own previous server with Ctrl+C or choose another unused port such as 8766. Change both the server command and browser address to the same port. Closing the browser tab does not stop the server; press Ctrl+C in its terminal when finished. The app folder must be the release's complete build, including its same-version worker, fonts, CMaps and other assets. Missing or mismatched assets require restoring the full build, not ignoring the error.

python3 -m http.server 8766 --bind 127.0.0.1 --directory app

http://127.0.0.1:8766

ZIP recovery uses Python 3 in a terminal to serve the app over local HTTP. After opening the loopback address, run the sample checks above, including saving and reopening both reports.

Updates and interrupted hosting

Keep the old ZIP and reports before extracting a new release into a separate folder. Read its version and change notes, use the complete matching asset set, re-import a compatible profile, confirm all regions and rerun the supplied sample before a production job. Do not combine old and new worker/assets. If the hosted address changes or stops, keep the ZIP recovery route and follow the seller's relocation notice. Local recovery does not remove the seller's remaining equivalent-host obligation within the purchased 12-month service period. Indefinite use of the purchased version does not promise every future feature or browser update.

Frequently asked questions

Does a number-record match approve printing?

A record match does not approve printing, visible digits, hidden text, clipping, colours or physical output. Continue your usual visual and print proofing.

Does a range match prove the original CSV pairs?

Original CSV pairs were not supplied. A range match cannot verify their original pairing.

Can the CSV and PDF share the same error?

Without a declared range, CSV uniqueness and coverage are unverified. A CSV and PDF can share the same error.

Why is a field inconclusive?

A required field may have no readable text, more than one candidate, text crossing boundaries, an unsupported layout or unavailable resources. The app cannot promote such a field to a match by guessing or padding PDF values. Correct the source/settings, use a text-based PDF within scope and rerun every page. Image-only or outlined numbers need another workflow.

Purchase and delivery

A one-time payment of JPY 1,280 including tax covers one user. You can use the purchased version commercially without a time limit. The download is a ZIP containing the complete app, including its assets, guides and samples. Re-downloads, defect fixes, text support and equivalent hosting are included for 12 months from purchase. Keep the ZIP. You can try the public app and samples before buying.

Buy on BOOTH

Licence and text support

One-user purchase: the purchased version may be used indefinitely. Distribution/re-download, defect fixes, text support and an equivalent hosted service are provided for 12 months from purchase. Keep the ZIP; permanent hosting, re-download and new features are not promised. Open-source components retain their own licence rights.

For support, first reproduce with a supplied synthetic sample. Share the application/browser version, diagnostic code and anonymized steps through the seller's BOOTH text contact. Do not send original customer PDFs, CSVs or identifying filenames as a normal requirement.

Contact the seller on BOOTH

BOOTH asks you to sign in if you are logged out.