InTouch Hub · Blue Isle Software

Document to Text

Extract text from PDF, Word (.docx), OpenDocument (.odt), RTF, and plain text files. Pure-Python where possible — no LibreOffice required. Single file or batch directory mode.

Provided free and as is, without warranty of any kind — including merchantability, fitness for a particular purpose, and the accuracy or completeness of any result. See the licence. You are responsible for checking what this produces before relying on it.

characterdocumentdocxexpenseextractfile-storageodtopticalpdfrecognitionreviewrtftext-extraction

Document to Text

Extract plain text from PDF, Word, OpenDocument, RTF, and plain text files. Single file or batch directory mode. No LibreOffice required.

Why this exists

Most document-analysis jobs (resume screening, contract review, expense extraction) need the text content of a file — not its visual rendering. Going through PDF is expensive: it requires LibreOffice (~700 MB) for .doc/.docx/.odt conversion, and the AI still has to re-extract text from the rendered PDF.

This tool extracts text directly from the source, with zero install friction for modern formats (.txt, .docx, .odt — pure stdlib). PDF and RTF need small pip packages; the script prints a clear install command if a backend is missing.

For workflows that need rendered-PDF fidelity (form-field positions, images, page-perfect layout), use a doc-to-pdf converter instead.

Inputs

Property Required Default Description
inputFile one of two Path to a single document.
inputDir one of two Folder whose matching files are all processed.
extensions pdf,docx,odt,rtf,txt Comma-separated extensions when using inputDir.
outputFile If set, all extracted text is concatenated and written here with per-file headers.
outputDir If set, writes one .txt per input document.
maxBytes 0 Per-file byte cap (0 = unlimited).

Provide either inputFile or inputDir, not both.

Outputs (published)

Name Description
text Full concatenated text with per-file headers.
fileCount How many input files matched.
successCount How many extracted cleanly.
failureCount How many errored.
outputFiles Comma-separated list of files this task wrote.
errors Newline-separated error messages, one per failed file.

Format support

Extension Backend Install required?
.txt stdlib (utf-8, utf-16, latin-1 fallback) None
.docx stdlib (zipfile + xml.etree) None
.odt stdlib (zipfile + xml.etree) None
.rtf striprtf (pip) — regex fallback if missing pip install striprtf (optional)
.pdf pypdf or pdfminer.six pip install pypdf
.doc antiword or catdoc binary apt install antiword catdoc (or brew install antiword)

The legacy binary .doc format is rare in practice — most modern Word files are .docx. If you only have .doc originals, install antiword or catdoc (the script tries both), or save them as .docx first.

Installing the pip packages on Debian/Ubuntu/Mint (PEP 668)

Modern Debian-based distros mark the system Python as "externally managed" and refuse pip install without an extra flag. Three options, in order of cleanliness:

  1. Use the runtime env's Python directly (recommended for InTouch): pip install --user --break-system-packages pypdf striprtf
  2. Set up a virtualenv and point your python runtime env at it (no global state changes).
  3. Skip PDFs/RTFs — the .docx/.odt/.txt paths work with zero dependencies. The tool still succeeds on those and reports per-file errors for the formats whose backend is missing.

Chaining patterns

Example

{
  "name": "resume-review",
  "tasks": [
    {
      "name": "extract",
      "tool": "document-to-text",
      "properties": {
        "inputDir": "/home/me/resumes",
        "maxBytes": "100000"
      }
    },
    {
      "name": "assess",
      "tool": "anthropic",
      "credential": "claude-api",
      "properties": {
        "prompt": "Assess the following resumes. For each candidate, extract skills,\nexperience level, and a 1-10 rating.\n\n{{extract.text}}\n",
        "maxTokens": 4000,
        "outputFile": "/home/me/resume-assessment.txt"
      }
    }
  ]
}

Publishes

The keys a later task may reference as {{taskName.key}}. Referencing anything not listed here resolves to nothing at run time.

Input Properties

Every property this tool accepts, from its own tool.iml.

Property Type Required Default Description
inputFile string no Path to a single document. Either inputFile or inputDir is required.
inputDir string no Path to a folder whose matching files will all be processed. Either inputFile or inputDir is required.
extensions string no pdf,docx,odt,rtf,txt Comma-separated extensions to include when using inputDir. Default covers all supported formats.
outputFile string no If set, all extracted text is concatenated and written here with a per-file header. Useful for feeding a single text blob to anthropic/openai/gemini.
outputDir string no If set, writes one .txt file per input document into this directory.
maxBytes string no 0 Per-file byte cap to defend against runaway extractions (0 = unlimited).