CitePage PDF: page-linked RAG chunks avatar

CitePage PDF: page-linked RAG chunks

Pricing

from $0.10 / 1,000 page-linked text chunks

Go to Apify Store
CitePage PDF: page-linked RAG chunks

CitePage PDF: page-linked RAG chunks

Turn public text-layer PDFs into page-linked chunks with deterministic IDs and source citations. Supports page ranges and bounded downloads. No OCR, no AI summarization. Use only documents you have permission to process.

Pricing

from $0.10 / 1,000 page-linked text chunks

Rating

0.0

(0)

Developer

Picknotes

Picknotes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Categories

Share

CitePage PDF: page-cited text chunks

Prepare short public, text-layer PDF reports for a cited search or retrieval workflow. CitePage returns JSON text chunks with physical page numbers, source links and reproducible SHA-256 identifiers. Keep the metadata beside the text to trace a retrieved excerpt back to its source page and document version.

Every chunk stays on one page. No LLM or OCR service is used.

Price before you start

The configured price is $0.005 per Actor start plus $0.0001 per saved chunk ($0.10 per 1,000 saved chunks), with platform usage during the run included. Check the Pricing tab for the current configuration before starting.

Amounts below are USD event charges, before any account-specific tax or adjustment. For one start, the totals are:

  • No saved chunks: $0.005 if the start event is charged
  • 1 saved chunk: $0.0051
  • 5 saved chunks: $0.0055
  • 100 saved chunks: $0.015
  • 250 saved chunks: $0.030

These are event-price calculations, not quotes per PDF. Failed documents and empty pages create no per-chunk event; the start fee can still apply. A repeat run can incur the charges again. See Pricing, storage and repeat runs below.

Try one page

  1. Review the Pricing tab and select a suitable maximum run charge in Run options. This is separate from the JSON input; do not add a charge-limit field to the input below.
  2. Keep automatic restart disabled and use a fresh run with fresh storage.
  3. Paste this small public PDF example into the Actor's JSON input, then start the run when you accept the charge:
{
"pdfUrls": [
"https://raw.githubusercontent.com/mozilla/pdf.js/de844a882695e6294ddc24b06f4817cc5fad2a4f/examples/learning/helloworld.pdf"
],
"chunkSize": 1200,
"chunkOverlap": 150,
"pageStart": 1,
"pageEnd": 1,
"maxBytes": 1048576,
"maxPages": 2,
"maxCharacters": 10000,
"maxChunks": 10,
"timeoutSeconds": 15
}

Expected result: one page and one saved chunk containing Hello, world!. The expected event-price total is $0.0051 for one start and one saved chunk. This is Mozilla PDF.js's public test fixture; remote availability can change.

In the dataset, these selected fields should look like this (the actual row also contains source URLs, identifiers and offsets):

{
"text": "Hello, world!",
"page": 1,
"pageStart": 1,
"pageEnd": 1,
"citationUrl": "https://raw.githubusercontent.com/mozilla/pdf.js/de844a882695e6294ddc24b06f4817cc5fad2a4f/examples/learning/helloworld.pdf#page=1"
}
  1. Open the dataset and confirm the text, page and citation link.
  2. Open the run's key-value store record OUTPUT. Confirm the document status and saved count, and check the completeness and limit fields described below. A green run status alone is not enough.
  3. Export the rows as JSON, keeping the metadata, and transfer any results you need to retain.

For your own documents, replace pdfUrls, adjust the page range, and reset or raise the example's deliberately small size/page/chunk caps as needed. The Actor accepts 1–10 public HTTP(S) URLs per run. Process only documents you have permission to use. Do not submit personal data, private documents, credentials or signed URLs. Query strings are retained in results.

Results and citations

The default dataset contains one row per saved text chunk. Each row includes:

  • text, page, pageStart, pageEnd: normalized text and one-based physical PDF page indexes. Printed page labels can differ.
  • sourceUrl, resolvedUrl, citationUrl: submitted URL, final download URL and a link ending in #page=N. Page-link support depends on the PDF viewer.
  • charStart, charEnd: Unicode character offsets in normalized page text, with the end excluded.
  • documentId: SHA-256 of the exact PDF bytes.
  • contentHash: SHA-256 of the normalized chunk text.
  • chunkId: a deterministic identifier incorporating PDF bytes, chunk settings, page, offsets and text.
  • algorithm: citepage-char-v1.

Chunking uses character windows with overlap, not tokens or semantic boundaries. Text uses NFKC normalization and collapsed whitespace. Re-saving a PDF or changing settings/parser output can change identifiers.

Open OUTPUT in the run's key-value store for document statuses, page coverage and totals. Always inspect it: an Actor run can finish successfully while individual PDFs fail. Errors and empty pages do not become dataset rows.

Check summaryComplete, each document's outputComplete, chunkCount versus extractedChunkCount, budgetExhausted and runLimitReached. Page coverage describes extraction, not a guarantee that every extracted chunk was saved. After an interrupted or uncertain write, the dataset may contain rows beyond the last acknowledged summary.

summaryComplete means every input has a recorded outcome. outputComplete can be true for a fully recorded failure or partial-text extraction, so also inspect status and warnings.

Keep the page through your next step

Use text as the passage and preserve all other fields as metadata, especially chunkId, documentId, contentHash, page and citationUrl. Do not concatenate pages and re-split them while discarding the original mapping. If you split a CitePage chunk again, keep its ID as the parent reference and give the child text its own identity.

A checked offline example uses an original two-page fictional field-notes PDF, with 500-character chunks and 50-character overlap. It produces five chunks and 2,058 normalized characters. One chunk includes the invented second-week height of 11.2 centimeters in Tray A and carries:

{
"page": 2,
"pageStart": 2,
"pageEnd": 2,
"charStart": 0,
"charEnd": 500,
"documentId": "08d4c0f39656c363fcac57f9ec62c150b0b94f742342dcd69b87a18a7b86bc46",
"contentHash": "a9ff26f1ff88c7318e21f57b24c96f4797221b7dd483bbe4a7b8c84130d13eab",
"chunkId": "2b2d40e6e1dd6e10c9ca1af2a2543d1c912bc4d0e466835cd0fd6e623e6aeb6a"
}

This is a projection of actual offline output, not a customer result or a cloud-run export. Its URL fields are null because the sample was read from disk and has not been publicly hosted. The hosted Actor accepts public URLs and creates page links; it does not accept local file paths. The example verifies extraction and metadata preservation, not an n8n/vector-store integration or answer quality.

A page number is a physical PDF index, not necessarily its printed page label. A hash identifies bytes or text; it does not prove the passage is true or archive the source. Keep a permitted copy of the source and the relevant extraction settings if you need to reproduce it later.

Limits

Default per PDF: 5 MiB, 100 whole-document pages, 500,000 normalized characters across selected pages, 250 chunks and 15 seconds. Input can raise file size to 10 MiB, chunks to 5,000 and per-document time to 60 seconds; the Actor-wide limits below still apply. maxPages applies to the whole PDF even when selecting fewer pages. Exceeding an extraction limit rejects that document's chunks.

Chunk size: 100–10,000 characters. Overlap: 0–2,000, strictly below chunk size. Page range: 1–100, inclusive and clipped at the document's end.

The deployed run memory is fixed at 512 MiB. Across a run: 45 seconds of application work, at most 2,500 chunks and 8 MiB of conservatively serialized chunk JSON. A 60-second application watchdog exits nonzero if necessary. Raising the platform timeout does not raise these source limits. Platform startup, shutdown and storage retention are outside these application bounds.

A document that would exceed the aggregate row/byte cap is not saved; later documents are skipped with explicit limit statuses. Time or charging limits may leave partially saved output. The hard watchdog may prevent a final summary update.

Unsupported inputs

No OCR, decryption, table extraction, normalized spreadsheet conversion, layout reconstruction, embeddings or crawling. Scans, blank pages and vector-only pages without extractable text are labeled ocr_not_supported. Mixed text/empty documents return partial; encrypted PDFs are rejected.

Malformed, oversized, over-limit, timed-out or inaccessible PDFs receive explicit statuses. Text reading order can be unreliable for columns, tables or unusual fonts. Review extracted text before relying on it.

Downloads require public network addresses and standard HTTP(S) ports. Local/private network targets, URLs with embedded user credentials and HTTPS downgrades are rejected; redirects and DNS addresses are checked. No login session or authentication headers are supported. Signed or token-bearing query strings are not automatically detected as secrets; do not submit them. Protected sites may refuse requests. There is no proxy or login bypass.

Pricing, storage and repeat runs

One saved chunk is one dataset-item event. Smaller chunks and greater overlap usually increase the number of billable items. The maxChunks input is a per-document extraction limit, not a dollar limit. It does not replace the platform's maximum run charge or the Actor-wide 2,500-chunk/8-MiB caps.

Reaching a charge limit can leave only part of the extracted output saved, or prevent the final summary from being updated. Check the dataset and OUTPUT together before deciding what succeeded. The limit is not a promise that all requested PDFs will be completed.

Use fresh storage for every run and keep automatic restart disabled. The Actor refuses storage containing any default-dataset rows or an OUTPUT record. If a run fails or a write is uncertain, inspect the existing dataset before deciding to run again. Do not assume a retry is free, atomic or exactly-once.

Run results follow the caller's Apify storage/access settings and retention policy. Do not assume they are a private permanent archive. Export required results promptly. Platform usage during the run is included in the event prices; subsequent storage access or retention may create separate account usage under your plan. See Apify's post-run storage cost explanation and storage retention documentation.

Verification

Release 0.1.2 passed 117 local automated tests. Owner-run Apify checks verified the one-page example and a mixed batch that continued after a non-PDF input, saving only the valid PDF's chunk. Citation identifiers matched the local result. Owner accounting checks recorded one start event and one saved-chunk event; an exact $0.00515 cap case saved one chunk and skipped the second document as budget-exhausted.

The two-page synthetic example above was independently reproduced offline against the deployed extraction core and pinned pypdf 6.20.0 parser. These checks cover small specified fixtures. They do not establish arbitrary-PDF performance, actual paying-customer billing, customer results or downstream retrieval accuracy.

The project was developed and reviewed with AI assistance. It uses the pypdf parser; original project code is MIT-licensed. No accuracy, earnings or support-response guarantee is implied.