Commit Graph
32 Commits
Author SHA1 Message Date
Abimael Martell 68643e0c37 fix encoding, and spacing on custom fonts 2026-02-11 12:17:42 -08:00
Abimael MartellandClaude Opus 4.5 cd68515028 Add image and hyperlink extraction, improve line grouping
- Add ItemType enum to distinguish Text, Image, and Link items
- Extract XObject images from page resources with position/dimensions
- Parse Link annotations to extract hyperlinks with URLs
- Add include_images and include_links options to MarkdownOptions
- Fix line grouping to better detect new lines vs same-line items
- Add samples/ and scripts/ to .gitignore

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 08:31:20 -08:00
Abimael Martell 5afbb67b90 Fix list continuation, improve table detection, and add more font styling detection 2026-02-10 13:30:33 -08:00
Abimael Martell 6389c85ab9 fix type 2026-02-09 12:56:08 -08:00
Abimael Martell 3d6772fc20 improve spacing detection, and layout detection 2026-02-09 12:45:08 -08:00
Abimael Martell 0e5e978a33 improve table header detection 2026-02-09 10:13:16 -08:00
Abimael Martell ec96311a65 implement ToUnicode CMap support for proper text extraction from PDFs with custom font encodings 2026-02-09 09:46:07 -08:00
Abimael Martell 99db21810c update readme 2026-02-09 09:05:15 -08:00
Abimael Martell 0f2f890a5c Table Improvements
1. Merge Continuation Rows (clean_table_cells)
2. Footnote Extraction (is_footnote_row)
3. Empty Row Removal
2026-02-08 22:04:25 -08:00
Abimael Martell 5e44e468ac Formatting Improvements
1. Word Fragment Joining (extractor.rs:63-94)

  Added is_word_continuation() to detect when text items are fragments of the same word and should be joined without spaces:

2. Caption Detection (markdown.rs:621-658)

  Added is_caption_line() to detect figures, tables, and source citations:
  - Ensures captions are on their own line with paragraph breaks

3. Paragraph Threshold Adjustment

  Changed from base_size * 2.0 to base_size * 1.8 for better paragraph detection.
2026-02-08 21:58:02 -08:00
Abimael Martell d530f9c888 implement Subscript/Superscript detection 2026-02-07 22:27:54 -08:00
Abimael Martell 4f66cf1a6e clippy happy 2026-02-07 20:16:44 -08:00
Abimael Martell 2953ec8203 fix: Page number filtering, Hyphen joining and Column detection threshold 2026-02-07 20:14:23 -08:00
Abimael Martell 3bbbc63c48 fix merging 2026-02-07 20:05:27 -08:00
Abimael Martell 3548423747 fix sorting 2026-02-07 19:57:05 -08:00
Abimael Martell 25ec142413 improve table detection 2026-02-07 19:50:53 -08:00
Abimael Martell 0acb3ecc8b format tables code 2026-02-07 19:40:28 -08:00
Abimael Martell 15981b7a15 add table detection 2026-02-07 19:39:42 -08:00
Abimael Martell 1fd392a10e fix footnote detection 2026-02-07 19:31:51 -08:00
Abimael Martell 96bdaa9f4a fix sorting, and columns 2026-02-07 18:25:01 -08:00
Abimael Martell c2c528ff23 url formatting, page no detection, additional cleanup 2026-02-07 14:12:19 -08:00
Abimael MartellandClaude Opus 4.5 ca09103ca9 Join paragraph lines with space instead of newlines
Paragraphs now flow as continuous text, with only actual paragraph
breaks (large Y gaps) creating newlines between them.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 13:52:40 -08:00
Abimael MartellandClaude Opus 4.5 5f772071e4 Fix formatting
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 13:48:46 -08:00
Abimael MartellandClaude Opus 4.5 fb80f5490d Add drop cap detection and merging
Drop caps are large decorative first letters that span multiple lines.
Due to PDF coordinate sorting, they often appear after the text they
belong to. This change:

- Detects drop caps: single uppercase char with font size >= 2.5x base
- Finds the paragraph start (first lowercase-starting line after header)
- Merges the drop cap with that line

Example: "G" + "lenair brings..." -> "Glenair brings..."

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 13:45:04 -08:00
Abimael MartellandClaude Opus 4.5 04ee58bb9e Trim leading and trailing whitespace from markdown output
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 13:37:51 -08:00
Abimael MartellandClaude Opus 4.5 c14e26495d Improve text extraction with visual reading order and header detection
Major changes:
- Switch from lopdf.extract_text() to position-aware extraction
- Text is now sorted by visual reading order (top→bottom, left→right)
- Fixed font size calculation to account for text matrix scaling
- Headers are now detected based on font size ratios
- Skip very short text (≤3 chars) for header detection to avoid drop caps

This significantly improves output quality for PDFs with complex layouts.
Before: Title appeared at end, no structure detected
After: Correct reading order, headers marked with # syntax

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 13:34:37 -08:00
Abimael MartellandClaude Opus 4.5 f99d155c52 Fix panic on multi-byte UTF-8 characters in list detection
The previous code used `trimmed.len() >= 2` to check if there were at
least 2 characters, but `len()` returns byte count, not character count.
For multi-byte UTF-8 characters (e.g., "é" which is 2 bytes), this check
would pass but `chars().nth(1)` would return None, causing a panic.

Fixed by using iterator pattern matching to safely extract the first
two characters.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 22:20:17 -08:00
Abimael Martell 286c61d128 fix ci 2026-02-06 21:40:11 -08:00
Abimael Martell 0ef7b2adfc add ci, plus new package 2026-02-06 21:39:21 -08:00
Abimael Martell ee09e96cc4 add tests and readme 2026-02-06 17:58:27 -08:00
Abimael Martell 5c422abc63 add readme 2026-02-06 11:54:01 -08:00
Abimael MartellandClaude Opus 4.5 135ce518c1 Initial commit: Rust PDF-to-Markdown library
- Smart PDF type detection (text vs scanned) without full document load
- Text extraction using lopdf directly
- Markdown conversion with header/list/code detection
- CLI tools: detect-pdf, pdf2md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:51:41 -08:00