PDF Column Recipe
Pricing
$20.00 / 1,000 successful pdf documents
PDF Column Recipe
Extract repeatable tables from public text PDFs using reusable column boundaries. Preserve blank cells and page coordinates; export JSON and CSV. No OCR or model API.
Pricing
$20.00 / 1,000 successful pdf documents
Rating
0.0
(0)
Developer
PDF Recipe Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Apply the same explicit column layout to every page of a public text PDF. Get a single JSON result, row dataset and spreadsheet-safe CSV, with blank cells kept in position and source coordinates for each cell.
Useful for recurring public catalogs, data dictionaries and reports with a stable layout, especially when automatic table detection guesses the wrong columns. You choose the layout once and reuse the JSON recipe in an Apify task. No OCR, paid model API, proxy subscription or custom document service.
Try the included example
{"useDemo": true}
The original synthetic catalog has two pages and four data rows. The second page uses a longer title, repeats the column header, and retains the same column positions. An intentionally blank quantity stays blank; 0 stays 0. The demo has no developer event charge.
Process a public PDF
{"useDemo": false,"pdfUrl": "https://your-public-site.example/catalog.pdf","recipe": {"pageWidth": 612,"pageHeight": 792,"top": 100,"bottom": 700,"boundaries": [40, 180, 330, 450, 570],"columns": ["Code", "Item", "Quantity", "Unit"],"skipExactHeader": true,"rowTolerance": 2}}
The URL above is an illustrative placeholder, not a live test endpoint. A complete tested public-data input is included below.
Coordinates are PDF points (72 per inch), measured from the top-left of the page. Set the page width and height, choose a vertical region excluding titles and footnotes, then put boundaries in the spaces between columns. Four columns require five boundaries. Names must be unique. All pages must match the recipe's size within 0.5 point. Save the input as an Apify task if you need to reuse it; this Actor does not create schedules itself.
You need to know the page layout. This version has no visual template designer or automatic coordinate setup. If your document changes layout, review and change the recipe before using its results.
Output
OUTPUT: full result, recipe, SHA-256 of the input PDF, page reports and rows.- Default dataset: one item per physical row, including
page,rowOnPage,values,fields,cellBoxes,issuesandunassigned. TABLE.csv: page, row number, named columns and issue codes. Formula-like values get an apostrophe prefix for spreadsheet import; JSON keeps the original text.SUMMARY: document and page diagnostics without row text or source URL.
An empty cell is an empty string with a null bounding box. Bounding boxes use [left, top, right, bottom]. A word crossing a column boundary or crop edge goes into unassigned with its coordinates and sets a warning, instead of being silently put into a neighboring cell. Check warnings before downstream use.
Fixed limits and known limitations
- One PDF per run, HTTPS port 443 only, no URL credentials, query strings, fragments or private-network addresses. Redirect targets are revalidated; connections use a validated IP and verify TLS for the original host. No cookies or authentication headers.
- At most 10 MiB, 50 pages, 2,000 output rows, 60,000 characters or 10,000 words per page. A hard worker timeout is 55 seconds. Configure the cloud run for 512 MiB and 90 seconds. Limits reject the whole document rather than returning a truncated dataset.
- Text PDFs only. Blank or image-only pages return
NO_EXTRACTABLE_TEXT; this is not an OCR diagnosis. Rotated pages/text and mixed page sizes are rejected. - Each output row is a physical text line. Wrapped records, merged cells and rows split across page breaks are not automatically reassembled. Multiple different layouts need separate runs/recipes.
- Exact headers matching all supplied column names can be skipped. Multi-line, differently spelled or reordered headers are retained. A data row identical to the column names will also be skipped: disable
skipExactHeaderfor that case. - The selected region deliberately omits everything outside it. A wrong recipe can exclude data or assign text to an unintended column without a warning.
okmeans no detected structural warning, not independently verified semantic accuracy. - Fonts, ligatures and unusually positioned characters can alter extracted words. Row tolerance groups words by top coordinate, not by a document's semantic record boundaries.
- Use only non-confidential public reports/catalogs you may process. No personal, medical, financial-account, identity or employment records. The Actor is not a personal-data detection tool; it cannot identify every sensitive document automatically.
- Input and extracted results remain in Apify storage under your account's retention rules. This is not a zero-storage service. No external analytics or model calls are made by the extraction code.
- Transient network failures are reported. The caller may retry; no anti-bot bypass or proxy is provided.
Pricing
Price: US$0.02 per successful, non-demo document, covering up to the fixed limits. One document-processed event is emitted only when the result has rows and no detected warning, all promised outputs have been saved, and pay-per-event is configured. Warning, empty, invalid and demo results have no developer event charge. There are no additional start or per-row fees. Platform usage is included in the document price. A budget check precedes storage; a storage failure has no document fee. If charging fails after storage, results can remain available without a successful charge; there is no automatic retry or duplicate charge.
The synthetic demo is free of developer event charges. Review the active price shown by Apify before starting a run.
Verified examples and scope
The implementation passed 31 local normal, error and boundary tests. Six local SDK billing scenarios covered successful documents, warnings, demo, zero budget, insufficient budget and storage failure. These are tests, not purchases or customer endorsements. Cloud tests verified the original two-page catalog and a public aggregate statistics PDF. Testing does not establish accuracy for every PDF or recipe.
The demo produces these physical rows:
| Page | Code | Item | Quantity | Unit |
|---|---|---|---|---|
| 1 | A-001 | Paper clips | 120 | box |
| 1 | A-002 | Binder | pack | |
| 2 | A-003 | Notebook | 25 | piece |
| 2 | A-004 | Labels | 0 | roll |
Tested public PDF input
This historical public aggregate statistics sample extracts only State and Permit, including the total row. It contains aggregate counts, not individual background-check records.
{"useDemo": false,"pdfUrl": "https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf","recipe": {"pageWidth": 1008,"pageHeight": 612,"top": 80,"bottom": 483,"boundaries": [33,111,147],"columns": ["State","Permit"],"skipExactHeader": false,"rowTolerance": 1}}
The tested recipe produced 56 physical rows. Selected visual spot checks and the sum of the 55 geographic rows matched the printed total 804,006. Text preserves the source's grouping spaces and commas; normalize numbers deliberately in your downstream workflow. This checks only the selected columns and does not verify every field in the PDF.
Provenance
The implementation and synthetic catalog were written for this product. The original code is MIT licensed and uses pdfplumber and the official Apify SDK. Runtime dependencies retain their respective licenses. No private documents, competitor source code or paid model services are included.