SShortSingh.
Back to feed

Developer benchmarks his own PDF-to-Markdown tool against rivals, publishes losses

0
·1 views

A developer who built a PDF-to-Markdown converter called CleanMD ran a structured benchmark comparing it against Microsoft's MarkItDown and Artifex's pymupdf4llm across five diverse public documents, including an RFC, a SCOTUS opinion, and an arXiv paper. The test measured section heading recall, code block detection, and table quality using ground truth derived from the documents themselves rather than any tool's output. CleanMD initially missed 11 RFC headings due to a font-parsing bug where hyphens triggered a second font subset, a flaw the developer fixed the same day but kept in the published results to avoid presenting a misleading after-only picture. pymupdf4llm led on heading recall and fence count, though many of its fences wrapped single inline code words rather than full blocks, while MarkItDown produced cleaner tables on the NIST document but detected zero headings in it. The developer published the benchmark openly, including the areas where his own tool underperformed, framing it as a transparency exercise rather than a marketing exercise.

Read the full story at DEV Community

This is an AI-generated summary. ShortSingh links to the original source for the complete article.

Discussion (0)

Log in to join the discussion and vote.

Log in

Related stories

0
ProgrammingDEV Community ·

Microsoft Agent 365 Now Supports n8n Workflow Agents With Entra ID Governance

Microsoft Agent 365 has officially added n8n as a supported third-party agent partner, allowing workflow automations built on n8n to operate inside Microsoft 365 applications such as Teams, Outlook, Word, and SharePoint. Each n8n agent runs with its own Entra ID, placing it within Microsoft's identity and governance framework rather than as a standalone automation. The integration is documented in Microsoft's official Agent 365 third-party agents pages and can be configured through the Microsoft 365 admin center. In this model, n8n handles the agent's operational logic and runtime, while Agent 365 provides the identity management, governance, and observability layer. The confirmed capability gives organisations a structured, repeatable path to deploy workflow-based agents within everyday workplace tools, without treating each new automation as a separate, disconnected deployment.

0
ProgrammingDEV Community ·

Proposed Azure Operations Copilot Would Bring Cloud Monitoring Into Microsoft Teams

A developer proposal outlines an Azure Operations Copilot integrated directly into Microsoft Teams to streamline cloud incident management. The concept aims to give engineers a single conversational interface to monitor, investigate, and understand Azure issues without switching between multiple tools. When an alert arrives via Azure Monitor, users could query it and explore related data instantly within Teams chat. The proposal covers an initial scope of core monitoring features with a future scope that includes triggering approved runbooks. The stated goal is to make Teams a convenient starting point for Azure operations rather than a replacement for the Azure portal.

0
ProgrammingDEV Community ·

JavaScript's 7 Primitive Data Types Explained for Beginners

JavaScript organizes its data into two broad categories, with primitive types being the foundational building blocks every beginner should learn first. The seven primitive data types are String, Number, BigInt, Boolean, Undefined, Null, and Symbol, each serving a distinct purpose in storing and representing values. Notable distinctions include BigInt for handling very large integers beyond Number's safe range, and Symbol for generating guaranteed-unique identifiers. A commonly misunderstood quirk is that typeof null returns 'object', even though null is officially a primitive — a known historical oddity in the language. Grasping these basics provides a stronger foundation for tackling more advanced JavaScript concepts like variables, conditions, and beyond.

0
ProgrammingDEV Community ·

Angular Tutorial Chapter 6: Distinguishing Null, Reset, and Destroy in Feature Lifecycle

An Angular tutorial chapter explains that clearing data and ending a feature are fundamentally different operations, each requiring a distinct API call. The chapter introduces three operations — replaceState(null), reset(), and destroy() — to make lifecycle intent explicit rather than inferred from empty UI state. replaceState(null) commits an intentional null while keeping the feature active, reset() returns the runtime to a neutral reusable state, and destroy() permanently finalizes the feature instance. The tutorial enforces a strict ownership boundary where the service controls all lifecycle operations and the FeatureCell, while the component handles only temporary UI state. This design prevents ambiguity in scenarios like user sign-out, account switching, or screen teardown, which can all appear identical on screen but carry different lifecycle meanings.