---
title: "Chat with PDF"
description: "Free chat-with-PDF tool. Upload a document and ask questions, answered using the document content. This showcases the Pixeltable pattern of chaining extraction and an LLM in one table."
keywords:
  - chat with pdf
  - ask questions about pdf
  - pdf question answering
  - chat with document
  - talk to pdf free
url: "https://pixeltable.com/tools/chat-with-pdf"
---

# Chat with PDF

Free chat-with-PDF tool. Upload a document and ask questions, answered using the document content. This showcases the Pixeltable pattern of chaining extraction and an LLM in one table.

Free online tool by Pixeltable. Run it at https://pixeltable.com/tools/chat-with-pdf (interactive, no sign-up).

## Features

- Grounded answers
- PDF and text
- Multiple questions
- Free

## FAQ

### How does it answer questions?

We extract the document text and ask an LLM to answer using only that content.

### Can I ask multiple questions?

Yes, keep the document uploaded and ask follow-up questions.


## Fact sheet

Last updated 2026-09-23.

| Fact | Value |
| --- | --- |
| Modality | Document |
| Inputs | PDF or text file |
| Outputs | Answers grounded in the uploaded document |
| Computed column | extract_document_text, then Groq chat_completions. No embedding index |
| What updates | A new or changed row recomputes only that row. Unchanged rows stay cached. |
| Canonical doc | [Computed columns](https://docs.pixeltable.com/datastore/computed-columns) |

```python
import pixeltable as pxt
from pixeltable.functions.groq import chat_completions

TableModel = pxt.model_base()

class DocChat(TableModel, name='doc_chat'):
    document: pxt.Document
    question: pxt.String

    extracted_text = extract_document_text(document)
    llm_prompt = build_doc_prompt(extracted_text, question)
    answer = chat_completions(
        messages=[{'role': 'user', 'content': llm_prompt}],
        model='llama-3.3-70b-versatile',
    ).choices[0].message.content
```