<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Digitální produkty pro život</title>
    <description>The latest articles on DEV Community by Digitální produkty pro život (@phenixik).</description>
    <link>https://dev.to/phenixik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4173344%2F345847e3-5d7f-4807-8e7b-0a6e054ed6bd.png</url>
      <title>DEV Community: Digitální produkty pro život</title>
      <link>https://dev.to/phenixik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/phenixik"/>
    <language>en</language>
    <item>
      <title>Turn PDFs into clean Markdown chunks for your RAG pipeline (without writing a parser)</title>
      <dc:creator>Digitální produkty pro život</dc:creator>
      <pubDate>Fri, 09 Oct 2026 12:14:43 +0000</pubDate>
      <link>https://dev.to/phenixik/turn-pdfs-into-clean-markdown-chunks-for-your-rag-pipeline-without-writing-a-parser-3ih8</link>
      <guid>https://dev.to/phenixik/turn-pdfs-into-clean-markdown-chunks-for-your-rag-pipeline-without-writing-a-parser-3ih8</guid>
      <description>&lt;p&gt;PDF parsing is the boring part of every RAG project. Line breaks in the middle of sentences, lost headings, headers and footers mixed into the text, no page numbers to cite. You can spend days tuning &lt;code&gt;pypdf&lt;/code&gt; or &lt;code&gt;pdfplumber&lt;/code&gt;, or you can skip that part.&lt;/p&gt;

&lt;p&gt;Here's a setup-free way to get LLM-ready text from PDFs, including PDFs you haven't found yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://apify.com/digitalni.produkty.pro.zivot/pdf-text-extractor" rel="noopener noreferrer"&gt;PDF Text Extractor&lt;/a&gt; on Apify (free plan credits are enough to try it).&lt;/li&gt;
&lt;li&gt;Paste &lt;strong&gt;PDF URLs&lt;/strong&gt;, or a &lt;strong&gt;web page URL&lt;/strong&gt;: with "find PDFs on pages" on, every PDF linked from that page is discovered and extracted. Handy for annual reports, documentation portals, research listings or government sites.&lt;/li&gt;
&lt;li&gt;Pick what you need:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;plain text&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown&lt;/strong&gt; with headings and bullet lists preserved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;text per page&lt;/strong&gt; (for citations like "see page 12")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG chunks&lt;/strong&gt;: set a chunk size and overlap and get text split on paragraph and sentence boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run it and pull the dataset into your pipeline.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Straight into your pipeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;YOUR_API_TOKEN&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;digitalni.produkty.pro.zivot/pdf-text-extractor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;urls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://arxiv.org/pdf/1706.03762&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeMarkdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunkSize&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunkOverlap&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;  &lt;span class="c1"&gt;# embed and upsert into your vector DB
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also works as a tool for AI agents through the Apify MCP server, so Claude or ChatGPT can read PDFs on demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers
&lt;/h2&gt;

&lt;p&gt;A test batch of 5 PDFs with 131 pages and ~78k words was processed in about 4 seconds. Price: &lt;strong&gt;$0.003 per PDF&lt;/strong&gt;, any number of pages. Scanned (image-only) PDFs are detected and skipped, and you are not charged for them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I built this tool. Feature requests welcome in the Issues tab.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>llm</category>
      <category>python</category>
    </item>
  </channel>
</rss>
