> Source: https://txtfetch.com/solutions/research-and-academic-papers > Plain-text twin — every page on txtfetch.com has one. https://txtfetch.com/text --- # Extract text from papers, EPUBs, and old archive scans. Research corpora run PDF-heavy, with EPUB references and scanned TIFF from older archives. txtfetch reads all three, and two-column layouts still need a second look. the-problem Literature review tools and archive digitisation projects live on PDF. Older archives add EPUB and scanned TIFF, often the only surviving copy of a paper. A two-column layout reads out of order when a parser flattens it into one text stream. Ligatures and hyphenated line breaks turn a common word into two broken tokens. how-txtfetch-solves-it txtfetch reads PDF, EPUB, and scanned TIFF through the same endpoint. It returns text, not typed citation or metadata fields. OCR runs automatically on TIFF pages and on PDF pages with no text layer. Two-column layouts, ligatures, and hyphenated line breaks are real problems. /fixes covers how to check for and correct each one. - One endpoint reads PDF, EPUB, and scanned TIFF. - OCR runs automatically on TIFF pages and on PDF pages with no text layer. - Two-column layouts can come back interleaved, and /fixes/columns-out-of-order covers the check. - /fixes documents ligature and hyphenated-line-break repair for this corpus. - Async job and webhook mode covers digitising a large archive. - A batch of mixed PDF, EPUB, and scanned TIFF files needs no branching logic on your side. curl ```curl curl -X POST https://api.txtfetch.com/v1/extract \ -H "Authorization: Bearer $TXTFETCH_KEY" \ -F file=@paper.pdf ``` Python ```python import os import requests with open("paper.pdf", "rb") as f: r = requests.post( "https://api.txtfetch.com/v1/extract", headers={"Authorization": f"Bearer {os.environ['TXTFETCH_KEY']}"}, files={"file": f}, ) print(r.json()["extracted_text"]) ``` JavaScript ```javascript import { readFile } from "node:fs/promises"; const file = new Blob([await readFile("paper.pdf")]); const form = new FormData(); form.append("file", file, "paper.pdf"); const res = await fetch("https://api.txtfetch.com/v1/extract", { method: "POST", headers: { Authorization: `Bearer ${process.env.TXTFETCH_KEY}` }, body: form, }); const { extracted_text } = await res.json(); console.log(extracted_text); ``` Go ```go package main import ( "bytes" "encoding/json" "fmt" "io" "mime/multipart" "net/http" "os" ) type extractResponse struct { Status string `json:"status"` ExtractedText string `json:"extracted_text"` } func main() { f, err := os.Open("paper.pdf") if err != nil { panic(err) } defer f.Close() var body bytes.Buffer writer := multipart.NewWriter(&body) part, err := writer.CreateFormFile("file", "paper.pdf") if err != nil { panic(err) } if _, err := io.Copy(part, f); err != nil { panic(err) } writer.Close() req, err := http.NewRequest("POST", "https://api.txtfetch.com/v1/extract", &body) if err != nil { panic(err) } req.Header.Set("Authorization", "Bearer "+os.Getenv("TXTFETCH_KEY")) req.Header.Set("Content-Type", writer.FormDataContentType()) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() var result extractResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { panic(err) } fmt.Println(result.ExtractedText) } ``` ``` { "status": "success", "extracted_text": "..." } ``` faq **Does txtfetch fix two-column reading order automatically?**: It extracts in reading order for most PDFs. /fixes/columns-out-of-order covers the cases that still need a check. **Can txtfetch read a scanned TIFF from an old archive?**: Yes. OCR runs automatically on TIFF pages, the same as a scanned PDF page. **Does txtfetch handle EPUB files?**: Yes. EPUB is one of the formats read through the same endpoint as PDF and TIFF. related-reading - [Extract text from PDF →](https://txtfetch.com/extract/pdf) - [Extract text from EPUB →](https://txtfetch.com/extract/epub) - [Extract text from TIFF →](https://txtfetch.com/extract/tiff) - [Fix: columns out of order →](https://txtfetch.com/fixes/columns-out-of-order) - [Fix: ligatures and smart punctuation →](https://txtfetch.com/fixes/ligatures-and-smart-punctuation) - [Fix: hyphenated line breaks →](https://txtfetch.com/fixes/hyphenated-line-breaks) - [Glossary: reading order →](https://txtfetch.com/glossary/reading-order) - [Get an API key →](https://app.txtfetch.com/signup) other-solutions - [RAG & LLM ingestion →](https://txtfetch.com/solutions/rag-ingestion) - [Search indexing →](https://txtfetch.com/solutions/search-indexing) - [Document workflows & automation →](https://txtfetch.com/solutions/document-workflows) - [Invoice & receipt processing →](https://txtfetch.com/solutions/invoice-and-receipt-processing) - [Contract & legal review →](https://txtfetch.com/solutions/contract-and-legal-review) - [Resume & CV parsing →](https://txtfetch.com/solutions/resume-and-cv-parsing) ## Start on the free plan. Run your own documents through it before you commit. The Hobby plan needs no card. [Get started →](https://app.txtfetch.com/signup) [See the pricing →](https://txtfetch.com/pricing)