How to Convert Images to Text with olmOCR: A Complete Guide
You can convert images to text with olmOCR by passing image files (PNG/JPEG) to the --pdfs CLI flag, which automatically converts them to PDFs using convert_image_to_pdf_bytes and processes them through the VLLM pipeline to extract structured text.
The olmOCR library from AllenAI provides a robust pipeline for extracting structured text from documents. While designed primarily for PDFs, it handles raster images seamlessly by converting them to PDF format before processing. This guide explains exactly how to convert images to text with olmOCR using both command-line and programmatic approaches, referencing the actual implementation in the allenai/olmocr repository.
How olmOCR Processes Image Files
olmOCR treats images as first-class inputs by transparently converting them to PDF documents before running the OCR model. When you provide an image file path, the pipeline detects the format and invokes specialized conversion logic to create a temporary PDF in memory.
Image-to-PDF Conversion Internals
The core conversion happens in olmocr/image_utils.py (lines 6-34) within the convert_image_to_pdf_bytes function. This utility validates that the input file exists, then calls the external img2pdf binary via subprocess.run (lines 20-38), capturing the stdout to return raw PDF bytes. This approach supports PNG, JPEG, and other common raster formats without requiring additional image processing libraries.
Pipeline Detection and Routing
In olmocr/pipeline.py (lines 585-595), the process_pdf function checks whether the input is an image using the is_png and is_jpeg helper functions. If the file is detected as a raster image, the pipeline rewrites the temporary file with the PDF bytes returned from convert_image_to_pdf_bytes, allowing the rest of the system to treat it as a standard PDF document. From there, build_page_query (lines 10-42) renders the page as a base64-encoded PNG and constructs the VLLM request payload.
Command-Line Usage to Convert Images to Text
The simplest way to convert images to text with olmOCR is through the command-line interface. Ensure you have the img2pdf binary installed and available on your system PATH before running the pipeline.
# Install the package and dependencies
pip install olmocr
# Run the pipeline on one or many images
python -m olmocr.pipeline \
s3://my-bucket/workspace \
--pdfs image1.png image2.jpg \
--model allenai/olmOCR-2-7B-1025-FP8 \
--markdown
The --pdfs flag accepts any file path, and the pipeline automatically detects PNG/JPEG extensions to trigger the conversion. The --markdown flag writes the extracted text to *.md files alongside the JSONL output.
Programmatic Image-to-Text Conversion
For custom workflows, you can invoke the conversion functions directly from Python. This is useful when integrating olmOCR into larger applications or when processing images in memory without writing intermediate files to disk.
from pathlib import Path
from olmocr.image_utils import convert_image_to_pdf_bytes
from olmocr.pipeline import build_page_query, render_pdf_to_base64png
import asyncio
import base64
async def image_to_text(image_path: Path, target_dim: int = 2048) -> str:
# 1. Convert image to PDF bytes using img2pdf
pdf_bytes = convert_image_to_pdf_bytes(str(image_path))
# 2. Write temporary PDF to disk (required by render function)
tmp_pdf = Path("/tmp/temp_image.pdf")
tmp_pdf.write_bytes(pdf_bytes)
try:
# 3. Render the first page to base64 PNG for the VLLM model
img_b64 = await asyncio.to_thread(
render_pdf_to_base64_png,
str(tmp_pdf),
page=1,
target_longest_image_dim=target_dim
)
# 4. Build the query payload for the model
query = await build_page_query(
local_pdf_path=str(tmp_pdf),
page=1,
target_longest_image_dim=target_dim,
model_name="olmocr",
)
# The query contains the base64 image in:
# query["messages"][0]["content"][1]["image_url"]["url"]
# 5. Send query to your VLLM endpoint here
# response = await httpx.AsyncClient().post(...)
return "Extracted text would appear here from response"
finally:
tmp_pdf.unlink()
# Run the conversion
result = asyncio.run(image_to_text(Path("sample.jpg")))
Note that render_pdf_to_base64png and build_page_query in olmocr/pipeline.py (lines 10-42) handle the image preparation and request construction, converting the temporary PDF page into a format suitable for the vision-language model.
Accessing the Extracted Text
Once processing completes, the extracted text resides in the natural_text attribute of the PageResponse object. When using the --markdown flag, the pipeline writes plain text files to stable paths derived from the source filename, while JSONL output contains the text in the text field of each Dolma document.
import json
# Reading from markdown output
with open("workspace/markdown/path/to/image1.md") as f:
plain_text = f.read()
# Or reading from JSONL output
with open("workspace/results.jsonl") as f:
for line in f:
doc = json.loads(line)
extracted_text = doc["text"]
Summary
- olmOCR converts images to PDFs internally: The
convert_image_to_pdf_bytesfunction inolmocr/image_utils.pyuses theimg2pdfbinary to transform PNG/JPEG files into PDF bytes before processing. - Automatic format detection: The pipeline in
olmocr/pipeline.py(lines 585-595) automatically detects image formats and routes them through the conversion step when you pass files to--pdfs. - Flexible output formats: Use
--markdownto generate clean.mdtext files, or parse the JSONL output to access thenatural_textfield fromPageResponseobjects. - Programmatic access: You can import
convert_image_to_pdf_bytesdirectly to handle image-to-PDF conversion in custom Python workflows before calling the rendering and query building functions.
Frequently Asked Questions
Does olmOCR support multiple image formats?
Yes, olmOCR supports any format that the img2pdf binary can process, including PNG, JPEG, and other common raster formats. The is_png and is_jpeg helpers in olmocr/image_utils.py handle the initial detection, while convert_image_to_pdf_bytes manages the actual conversion regardless of the specific image type.
Do I need to install img2pdf separately?
Yes, you must install the img2pdf binary and ensure it is available on your system PATH. The convert_image_to_pdf_bytes function in olmocr/image_utils.py (lines 20-38) calls this binary via subprocess.run, so the pipeline will fail if the dependency is missing.
Can I process images without writing temporary PDF files to disk?
While the current pipeline implementation in olmocr/pipeline.py writes the PDF bytes to a temporary file before rendering (as seen in lines 585-595), you can work around this in custom code by using convert_image_to_pdf_bytes to get the PDF data in memory, then integrating directly with the rendering logic if you modify the pipeline to accept byte streams instead of file paths.
How do I get plain text output instead of JSON?
Pass the --markdown flag when running the pipeline. This triggers the Markdown writer logic in olmocr/pipeline.py (lines 66-94), which creates {source}.md files containing only the extracted natural_text without the JSON structure. Alternatively, extract the text field from each line of the JSONL output file.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →