Four steps from source PDF to usable data
Confirm the company, form, date and completeness; extract text and fields; check identifiers, dates, capital and missing values; then map the fields for your system. Retain document and page references so another reviewer can locate the source.
Trace fields to a real source
Our two-page historical NAR1 sample is for ARCH MARKETING LIMITED, with a return date of 2022-08-02. It covers company and capital fields, without directors or members. It cannot identify this company’s shareholders or ultimate beneficial owners.
Choose the format for the receiving workflow
JSON retains nested fields and share-class arrays; XML can follow an agreed schema; Excel supports filtering and reconciliation. The standard Data plan supplies JSON or XML. Send a template for a separate quote on Excel, custom fields, role codes or batch layouts.
Real sample: map source fields to your columns
This table refers to the downloadable standard JSON. It separates source values, actual output paths and suggested spreadsheet mappings. The suggested columns can be changed and are not a fixed delivery schema for every client.
Scroll sideways to see all columns; focus the table and use arrow keys on a keyboard.
| Source and page | Standard JSON path | Spreadsheet field and type | Check before import |
|---|---|---|---|
| 1063959 / page 1 | legacy_company_number | legacy_company_number / text | Keep the legacy label; do not relabel as BRN |
| 2022-08-02 / page 1 | return_date | return_date / ISO date | Do not overwrite with the download date |
| Business name N/A / page 1 | business_name.value / status / raw | value, status, raw / three columns | Retain null, not_applicable and N/A separately |
| Ordinary, HKD, 10,000 / page 2 | share_capital[0] | capital detail / one row per share class | Store totals separately to avoid double counting |
| Email left blank / page 2 | email_address.value / status / raw | value, status, raw / three columns | Keep null, blank and empty raw text distinct from N/A |
| Member pages outside the two-page excerpt | unavailable.members | members_availability / text | outside_excerpt does not mean an empty list or zero holders |
Define what one row means before converting to Excel
A filing can contain company-level fields and repeated share-class or personnel records. Flattening everything into one company row needs an explicit rule for repeated values. Decide whether a row represents a company, a document or a detail record before choosing columns.
One possible workbook has a document table plus a capital-detail table. The document reference joins each share-class row to its parent. This is a suggested model, not a fixed service deliverable. Supply your existing workbook and examples if its structure must be retained.
Keys must reflect scope. Two years for the same company are separate records; two different filings downloaded on the same day are not duplicates. An internal document reference, original identifier label, form, record date and source filename make later merge rules explicit.
In the proposed document row below, only DOC-001 is an invented internal reference; the other values come from the real sample. DOC-001 is neither a source identifier nor an added standard JSON field. It illustrates a receiving-system join.
Scroll sideways to see all columns; focus the table and use arrow keys on a keyboard.
| Document reference (proposed) | Company name | Legacy number / text | Return date |
|---|---|---|---|
| DOC-001 | ARCH MARKETING LIMITED | 1063959 | 2022-08-02 |
Walk the real sample through an import check
Download the standard JSON from the sample page with custom mapping disabled. The legacy identifier is a string and 2022-08-02 is the return date. Import identifiers as text and choose an explicit date convention instead of relying on a CSV reader’s automatic conversion.
Distinguish N/A business name, blank email and member pages outside the excerpt. Each may lack a usable value for a different reason. Preserve value, status and raw text, or corresponding columns, so the recipient knows whether to seek more pages or retain a genuine blank.
The sample has one Ordinary/HKD capital row with 10,000 issued shares and a separately stored total. Adding the detail and total as two records double-counts it. Use this small case to verify the importer before aggregating a full batch.
The capital row joins back through DOC-001, with counts, amounts and currency separated. A different filing with two classes must allow two detail rows without overwriting the first because the document reference repeats. This is a model check, not a claim that the real sample contains another class.
Scroll sideways to see all columns; focus the table and use arrow keys on a keyboard.
| Document reference (proposed) | Share class | Currency | Issued shares | Capital amount | Source page |
|---|---|---|---|---|---|
| DOC-001 | Ordinary | HKD | 10000 | 10000 | 2 |
Acceptance checks beyond opening the file
Check syntax, source accuracy and receiving-system behaviour separately. Valid JSON or complete XML elements address only structure. Correctly extracted values can still be lost when arrays are flattened. Record which layer failed rather than using a single “file valid” status.
Test readable data and missing-state data. Check Chinese text and punctuation, zero versus blank, unknown versus zero, types, dates and duplicate imports. These are checks for your receiving system, not a promise that every application handles the file identically.
A useful defect report includes source page, output path, actual value and expected handling. Separate unreadable source, extraction error, mapping mismatch and receiving-system conversion before rerunning work. Version the sample and record changes so a one-field correction does not silently alter other data.
Frequently asked questions
Can all empty fields be a single null?
Retain the reason: blank, N/A, missing pages and unreadable text differ. The sample records status and source text so downstream systems can distinguish them.