<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PDF on SoloSoft</title><link>https://www.solosoft.dev/tags/pdf/</link><description>Recent content in PDF on SoloSoft</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 01 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.solosoft.dev/tags/pdf/index.xml" rel="self" type="application/rss+xml"/><item><title>html2pdf.js: Client-Side HTML to PDF Conversion in JavaScript</title><link>https://www.solosoft.dev/post/html2pdf-js-2026/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://www.solosoft.dev/post/html2pdf-js-2026/</guid><description>&lt;p&gt;Generating PDFs from web content is a requirement that appears in virtually every web application, yet implementing it properly is notoriously difficult. &lt;strong&gt;html2pdf.js&lt;/strong&gt; (eKoopmans/html2pdf.js on GitHub) solves this problem by providing a simple, client-side JavaScript library that converts HTML elements into PDF documents directly in the browser, with no server required.&lt;/p&gt;
&lt;p&gt;Created by Erik Koopmans and building on the proven foundations of html2canvas and jsPDF, this library has accumulated over 10,000 GitHub stars by offering a straightforward solution to a common problem. The API is deceptively simple: you select an HTML element, call a conversion function, and get back a downloadable PDF that preserves the visual appearance of the original content.&lt;/p&gt;</description></item><item><title>PDFPlumber: Extract Text, Tables, and Metadata from PDFs in Python</title><link>https://www.solosoft.dev/post/pdfplumber-python-2026/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://www.solosoft.dev/post/pdfplumber-python-2026/</guid><description>&lt;p&gt;PDFs remain one of the most common formats for distributing documents, but extracting data from them programmatically has always been challenging. The PDF format preserves visual layout at the expense of structural semantics, making it difficult to distinguish a table from a column layout or a heading from body text. &lt;strong&gt;PDFPlumber&lt;/strong&gt; (jsvine/pdfplumber on GitHub) tackles this challenge by providing a Python library that gives developers detailed, programmable access to the inner structure of PDF pages.&lt;/p&gt;
&lt;p&gt;Created by Jeremy Singer-Vine and now maintained by a community of contributors, PDFPlumber has become a go-to tool for data extraction from PDFs, with over 6,000 GitHub stars. It is built on top of pdfminer.six, which handles the low-level PDF parsing, and adds a much more developer-friendly API, visual debugging tools, and robust table extraction capabilities.&lt;/p&gt;</description></item><item><title>PyMuPDF: High-Performance PDF Processing for Python</title><link>https://www.solosoft.dev/post/pymupdf-pdf-2026/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://www.solosoft.dev/post/pymupdf-pdf-2026/</guid><description>&lt;p&gt;When you need raw speed for PDF processing, PyMuPDF is the performance leader among Python PDF libraries. Built as a Python binding to the C-based MuPDF library from Artifex, PyMuPDF combines Python&amp;rsquo;s ease of use with C-level performance for rendering, extracting, and manipulating PDF documents.&lt;/p&gt;
&lt;p&gt;PyMuPDF processes PDFs 10-100x faster than pure Python alternatives. It renders pages to images in milliseconds, extracts text with precise positioning, manages annotations, and handles forms. Beyond PDF, it also supports XPS, EPUB, MOBI, FB2, and common image formats, making it a versatile document processing engine.&lt;/p&gt;
&lt;h2 id="performance-benchmarks"&gt;Performance Benchmarks&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Operation&lt;/th&gt;
 &lt;th&gt;PyMuPDF&lt;/th&gt;
 &lt;th&gt;pypdf&lt;/th&gt;
 &lt;th&gt;pdfminer&lt;/th&gt;
 &lt;th&gt;Units&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Text extraction (100 pages)&lt;/td&gt;
 &lt;td&gt;0.3&lt;/td&gt;
 &lt;td&gt;4.2&lt;/td&gt;
 &lt;td&gt;8.5&lt;/td&gt;
 &lt;td&gt;seconds&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Page rendering&lt;/td&gt;
 &lt;td&gt;0.05&lt;/td&gt;
 &lt;td&gt;N/A&lt;/td&gt;
 &lt;td&gt;N/A&lt;/td&gt;
 &lt;td&gt;seconds per page&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Memory usage&lt;/td&gt;
 &lt;td&gt;45&lt;/td&gt;
 &lt;td&gt;120&lt;/td&gt;
 &lt;td&gt;200&lt;/td&gt;
 &lt;td&gt;MB for 1000 pages&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PDF merge (50 files)&lt;/td&gt;
 &lt;td&gt;0.8&lt;/td&gt;
 &lt;td&gt;2.1&lt;/td&gt;
 &lt;td&gt;N/A&lt;/td&gt;
 &lt;td&gt;seconds&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="core-capabilities"&gt;Core Capabilities&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Feature&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Page rendering&lt;/td&gt;
 &lt;td&gt;Convert pages to PNG, JPEG, or Pixmap at any resolution&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Text extraction&lt;/td&gt;
 &lt;td&gt;Get text with positions, fonts, and styles&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Image extraction&lt;/td&gt;
 &lt;td&gt;Extract embedded images in original format&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Annotation management&lt;/td&gt;
 &lt;td&gt;Add, edit, and remove highlights, notes, stamps&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Document conversion&lt;/td&gt;
 &lt;td&gt;Convert between PDF, XPS, EPUB, and images&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="rendering-and-extraction-pipeline"&gt;Rendering and Extraction Pipeline&lt;/h2&gt;

&lt;figure class="mermaid-wrapper not-prose" role="img" aria-label="Mermaid diagram"&gt;
 &lt;div class="mermaid-container"&gt;
 &lt;pre class="mermaid"&gt;flowchart LR
 A[PDF/XPS/EPUB] --&amp;gt; B[MuPDF Core Engine]
 B --&amp;gt; C{Operation}
 C --&amp;gt;|Render| D[Page Pixmap]
 D --&amp;gt; E[Image Output]
 C --&amp;gt;|Extract| F[Text Dictionary]
 F --&amp;gt; G[Structured Text]
 C --&amp;gt;|Annotate| H[Annotation Objects]
 H --&amp;gt; I[Modified Page]
 C --&amp;gt;|Transform| J[Rotate/Scale/Clip]
 J --&amp;gt; I
 I --&amp;gt; K[Save PDF]&lt;/pre&gt;
 &lt;script type="application/mermaid"&gt;flowchart LR
 A[PDF/XPS/EPUB] --&gt; B[MuPDF Core Engine]
 B --&gt; C{Operation}
 C --&gt;|Render| D[Page Pixmap]
 D --&gt; E[Image Output]
 C --&gt;|Extract| F[Text Dictionary]
 F --&gt; G[Structured Text]
 C --&gt;|Annotate| H[Annotation Objects]
 H --&gt; I[Modified Page]
 C --&gt;|Transform| J[Rotate/Scale/Clip]
 J --&gt; I
 I --&gt; K[Save PDF]&lt;/script&gt;
 &lt;/div&gt;
&lt;/figure&gt;&lt;p&gt;The MuPDF core engine parses the document structure and provides high-speed access to every element. Python bindings wrap this into familiar objects like &lt;code&gt;Document&lt;/code&gt;, &lt;code&gt;Page&lt;/code&gt;, and &lt;code&gt;Pixmap&lt;/code&gt; with intuitive methods.&lt;/p&gt;</description></item><item><title>pypdf: Pure Python PDF Toolkit</title><link>https://www.solosoft.dev/post/pypdf-library-2026/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://www.solosoft.dev/post/pypdf-library-2026/</guid><description>&lt;p&gt;When you need to manipulate PDFs in Python without heavy external dependencies, pypdf is the go-to solution. This pure Python library provides comprehensive PDF manipulation capabilities including splitting, merging, cropping, rotating, encrypting, and text extraction, all without requiring any native code or system libraries.&lt;/p&gt;
&lt;p&gt;Pypdf has been the standard Python PDF library for over a decade. It has evolved through multiple major versions and now offers a clean, modern API that is easy to use while being remarkably powerful under the hood. The library parses the PDF specification directly, giving it access to every element in the document structure.&lt;/p&gt;
&lt;h2 id="core-capabilities"&gt;Core Capabilities&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Feature&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;th&gt;API&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Page operations&lt;/td&gt;
 &lt;td&gt;Merge, split, rotate, scale, crop&lt;/td&gt;
 &lt;td&gt;PdfWriter + PdfReader&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Metadata&lt;/td&gt;
 &lt;td&gt;Read and write document metadata&lt;/td&gt;
 &lt;td&gt;metadata property&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Encryption&lt;/td&gt;
 &lt;td&gt;PDF password protection and decryption&lt;/td&gt;
 &lt;td&gt;encrypt() / decrypt()&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Text extraction&lt;/td&gt;
 &lt;td&gt;Extract text from pages with layout options&lt;/td&gt;
 &lt;td&gt;extract_text()&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Form filling&lt;/td&gt;
 &lt;td&gt;Fill PDF AcroForm fields&lt;/td&gt;
 &lt;td&gt;update_page_form_field_values()&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="document-processing-flow"&gt;Document Processing Flow&lt;/h2&gt;

&lt;figure class="mermaid-wrapper not-prose" role="img" aria-label="Mermaid diagram"&gt;
 &lt;div class="mermaid-container"&gt;
 &lt;pre class="mermaid"&gt;flowchart LR
 A[Input PDFs] --&amp;gt; B[PdfReader]
 B --&amp;gt; C{Operation Type}
 C --&amp;gt;|Merge| D[PdfWriter.append]
 C --&amp;gt;|Split| E[PdfWriter per page]
 C --&amp;gt;|Transform| F[Page transformation]
 C --&amp;gt;|Extract| G[text_extraction]
 D --&amp;gt; H[PdfWriter]
 E --&amp;gt; H
 F --&amp;gt; H
 G --&amp;gt; H
 H --&amp;gt; I[write() to File]&lt;/pre&gt;
 &lt;script type="application/mermaid"&gt;flowchart LR
 A[Input PDFs] --&gt; B[PdfReader]
 B --&gt; C{Operation Type}
 C --&gt;|Merge| D[PdfWriter.append]
 C --&gt;|Split| E[PdfWriter per page]
 C --&gt;|Transform| F[Page transformation]
 C --&gt;|Extract| G[text_extraction]
 D --&gt; H[PdfWriter]
 E --&gt; H
 F --&gt; H
 G --&gt; H
 H --&gt; I[write() to File]&lt;/script&gt;
 &lt;/div&gt;
&lt;/figure&gt;&lt;p&gt;The workflow centers around PdfReader for input and PdfWriter for output. Pages are read, manipulated, and assembled into a new document. Text extraction bypasses the Writer path and returns strings directly.&lt;/p&gt;</description></item></channel></rss>